Glsl 照明应该在视图空间还是世界空间中进行

Glsl 照明应该在视图空间还是世界空间中进行,glsl,Glsl,我最近一直在为我的引擎做一些延迟渲染。我现在几乎可以用了。然而,当我稍微移动相机时,我注意到一些表面上有一些细微的阴影,但在其他表面上更明显(我没有任何镜面反射光)。我已经在视图空间中进行了照明计算和G缓冲区渲染。这就产生了一个问题:我应该在世界空间中进行照明吗?我很确定光线的变化来自于视图空间中的法线。如果有区别的话,我会从深度贴图计算视图空间的位置。我已经读到在视图空间中进行计算是可以的,但是稍加修改,我无法找出哪里出了问题,可能只是求助于在视图空间中进行计算。如果有人好奇,这里是我的着色器

我最近一直在为我的引擎做一些延迟渲染。我现在几乎可以用了。然而,当我稍微移动相机时,我注意到一些表面上有一些细微的阴影,但在其他表面上更明显(我没有任何镜面反射光)。我已经在视图空间中进行了照明计算和G缓冲区渲染。这就产生了一个问题:我应该在世界空间中进行照明吗?我很确定光线的变化来自于视图空间中的法线。如果有区别的话,我会从深度贴图计算视图空间的位置。我已经读到在视图空间中进行计算是可以的,但是稍加修改,我无法找出哪里出了问题,可能只是求助于在视图空间中进行计算。如果有人好奇,这里是我的着色器代码:

正常通行证:

varying vec3 normal;
void main(void)
{
    gl_Position =gl_ModelViewProjectionMatrix*gl_Vertex;
    normal = (gl_NormalMatrix*gl_Normal)* 0.5 + 0.5;
}
照明通行证:

uniform sampler2D positionMap;
uniform sampler2D normalMap;
uniform sampler2D albedoMap;
uniform mat4 iprojMat;
uniform int light;
uniform vec3 lightcolor;
varying vec2 texcoord;

void main()
{
    //get all the G-buffer information
    vec3 normal = ((texture2D(normalMap,texcoord)).rgb * 2.0 - 1.0);
    vec3 color = (texture2D(albedoMap,texcoord)).rgb;
    if (color == vec3(0,0,0))
        discard;
    float z = (texture2D(positionMap,texcoord)).r;
    float x = texcoord.x * 2.0 - 1.0;
    float y =  (1.0-texcoord.y) * 2.0 - 1.0;
    vec4 proj = vec4(x,y,z,1.0);
    proj = proj*iprojMat;
    vec3 position = proj.xyz/proj.w;

    //start making the light happen
    vec3 lightVec = (gl_LightSource[light].position.xyz - position);
    vec3 diffuselight = lightcolor * max(dot(normal,normalize(lightVec)), 0.0);
    diffuselight = clamp(diffuselight, 0.0, 1.0);
    //calculate attinuation
    float distance = length(lightVec);
    float att = 1.0/((distance*distance)+distance);

    gl_FragColor = vec4(diffuselight,1.0);
}
对此,如有任何帮助或提示,将不胜感激


另外,我还制作了一个直接渲染着色器,它也在视图空间中完成,同样的事情也会发生,但不太明显

在延迟渲染器中,我使用视图空间照明,因为此时g缓冲区中的所有法线都指向摄影机(假设未渲染背面)。这使得将法线压缩到G缓冲区更加容易。然而,Cryengine不知道世界空间中的所有照明。@Marius知道是什么导致了照明的微小变化吗?在我看来,这似乎与法线有关。我将法线压缩到16位,这会在非常平滑的表面上由于量化而导致一些问题,但通常它是不可见的。它不会导致闪烁或类似情况。我使用世界空间进行所有照明,最初的决定是因为它使我的SSAO实现(包括弯曲法线的计算)更快。还有许多其他后处理效果在世界空间中更有效,我怀疑这就是为什么虚幻引擎4和CryEngine 3也使用世界空间照明的原因。不幸的是,世界空间法线也有缺点,马吕斯很好地提到了其中的大部分。对我来说,世界空间法线是提高后处理效率的一个很好的折衷方案。这完全取决于您的用例的后期处理有多繁重。有一篇非常好的文章讨论了我在GPU Pro 3中提到的很多内容,CryTek做了一个很好的例子。