我在台式机上用C ++开发了一个OpenGL游戏,没有发生错误。现在在我的平板电脑上编译和运行它,灯光搞砸了。这是我的照明缓冲区。
我使用延迟渲染,所以我将位置和法线作为纹理。正如下面的答案所指出的,光照问题的原因是,不是普通纹理,而是使用位置纹理进行计算。
有关环境的一些事实。两台机器都运行Windows 8 Pro 64bit。视频卡是桌面上的Nvidia Geforce 560和平板电脑上的Intel HD Graphics 4000。在这种情况下,G缓冲区纹理,法线和位置在平板电脑上是完整的,并且不会混淆。没有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后,我注意到问题消失了。
答案 0 :(得分:1)
在我看来,就像是使用位置数据而不是普通数据进行照明。纹理可能已经混淆了(您可能会发现采样器制服位于平板电脑桌面之间的不同位置)?