0

我在我的台式机上用 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->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 后,我注意到问题消失了。

4

1 回答 1

1

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

于 2013-07-16T13:50:42.753 回答