仅在其他设备上发出照明问题

时间:2013-07-14 13:57:21

标签: opengl hardware lighting deferred-rendering

我在台式机上用C ++开发了一个OpenGL游戏,没有发生错误。现在在我的平板电脑上编译和运行它,灯光搞砸了。这是我的照明缓冲区。

the lighting calculation is incorrect

我使用延迟渲染,所以我将位置和法线作为纹理。正如下面的答案所指出的,光照问题的原因是,不是普通纹理,而是使用位置纹理进行计算。

有关环境的一些事实。两台机器都运行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->Samplersunordered_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后,我注意到问题消失了。

1 个答案:

答案 0 :(得分:1)

在我看来,就像是使用位置数据而不是普通数据进行照明。纹理可能已经混淆了(您可能会发现采样器制服位于平板电脑桌面之间的不同位置)?