应该在视野空间还是世界空间进行照明

时间:2013-10-14 17:30:29

标签: glsl

我最近为我的引擎做了一些延迟渲染。我现在几乎都在工作。然而,当我稍微移动相机时,我注意到某些表面上有一些微妙的阴影,但在其他表面上更明显(我没有任何镜面反射光)。我一直在进行光照计算以及在视图空间中进行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);
}

对此有任何帮助或提示将不胜感激。

P.S。我已经制作了一个直接渲染着色器,它也在视图空间中完成,同样的事情也发生了,但并不明显。

0 个答案:

没有答案