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