我在我的台式机上用 C++ 开发了一个 OpenGL 游戏,没有发生错误。现在在我的平板电脑上编译和运行它,灯光很乱。这是我的照明缓冲区。
我使用延迟渲染,所以我有位置和法线作为纹理。正如在下面的答案中所指出的,照明问题的原因是位置纹理而不是普通纹理用于计算。
关于环境的一些事实。两台机器都运行 Windows 8 Pro 64 位。显卡是台式机上的 Nvidia Geforce 560 和平板电脑上的 Intel HD Graphics 4000。在这种情况下,G-buffer 纹理、法线和位置在平板电脑上是完整的,不会混淆。没有 OpenGL 错误。
这是我的光照着色器。
#version 330
in vec2 coord;
out vec3 image;
uniform int type = 1;
uniform sampler2D positions;
uniform sampler2D normals;
uniform vec3 light;
uniform vec3 color;
uniform float radius;
uniform float intensity = 1.0;
void main()
{
if(type == 0) // directional light
{
vec3 normal = texture2D(normals, coord).xyz;
float fraction = max(dot(normalize(light), normal) / 2.0 + 0.5, 0);
image = intensity * color * fraction;
}
else if(type == 1) // point light
{
// ...
}
else if(type == 2) // spot light
{
// ...
}
}
这是我用来绑定采样器制服的代码。Pass->Samplers
是unordered_map<string, GLuint>
将纹理目标 ID 映射到着色器位置的一个。Pass->Program
保存着色器程序 ID。
glUseProgram(Pass->Program);
int n = 0; for(auto i : Pass->Samplers)
{
glActiveTexture(GL_TEXTURE0 + n);
glBindTexture(GL_TEXTURE_2D, i.second);
glUniform1i(glGetUniformLocation(Pass->Program, i.first.c_str()), n);
n++;
}
为什么平板电脑上的位置和法线采样器会混淆?我究竟做错了什么?
更新:将我的操作系统更新到 Windows 8.1 后,我注意到问题消失了。