2013-02-04 38 views
1

我试图通过将屏幕空间点投影到视图空间以用于照明来避免使用位置缓冲区。我已经尝试乘以逆投影矩阵,但是这并没有给出视图空间点。添加矩阵乘法以避免位置缓冲区值得吗?是延迟渲染所需的位置缓冲区吗?

最后通着色:

vec3 ScreenSpace = vec3(0.0,0.0,0.0); 
ScreenSpace.xy = (texcoord.xy * 2.0) - 1.0; 
ScreenSpace.z = texture2D(depthtex, texcoord.xy); 
vec4 ViewSpace = InvProjectionMatrix * vec3(ScreenSpace, 1.0); 
ViewSpace.xyz = ViewSpace.w; 

回答

2

大多数答案都可以在this answer可以发现,这是远远太长,涉及到重新发布。但是,您的部分问题是您使用的是texcoord而不是gl_FragCoord

你想用gl_FragCoord,因为这是由OpenGL的保证是正确的值(假设你的递延通和与同尺寸的照明通使用的图像),不管是什么。此外,它使您无需将顶点着色器中的值传递给片段着色器。

的缺点是你所需要的输出画面的大小来解释它。但是,that's easy enough,再次假设两个通道使用相同尺寸的图像:

ivec2 size = textureSize(depthtex, 0); 

可以使用size视口的大小,以gl_FragCoord.xy转换成纹理坐标和窗口空间中的位置。

+0

嘿,这样计算出的UV坐标看起来更准确,我在做什么是顶点着色器texcoord =((gl_ModelViewProjectionMatrix * gl_Vertex)+1.0)/2.0 – erai