最近我一直在为我的引擎做一些延迟渲染。我现在几乎可以正常工作了。然而,当我稍微移动相机时,我注意到一些表面上有些细微的阴影,但在其他表面上更明显(我没有任何镜面光)。我一直在进行照明计算以及在视图空间中的 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 我也制作了一个直接渲染着色器,它也在视图空间中完成,并且发生了同样的事情,但没有那么明显。