5

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

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

PS 我也制作了一个直接渲染着色器,它也在视图空间中完成,并且发生了同样的事情,但没有那么明显。

4

0 回答 0