我试图通过将屏幕空间点投影回视图空间以用于照明来避免使用位置缓冲区。我尝试过乘以逆投影矩阵,但这不会返回视图空间点。添加矩阵乘法以避免位置缓冲区值得吗?
最终过程着色器:
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;
你的大部分答案都可以在这个答案上找到,这个答案太长了,而且涉及到转发。但是,问题的一部分是您使用的是texcoord
而不是gl_FragCoord
。
您希望使用gl_FragCoord
,因为OpenGL保证这是正确的值(假设您的延迟过程和照明过程使用相同大小的图像)。此外,它还使您不必将值从顶点着色器传递到片段着色器。
缺点是你需要输出屏幕的大小来解释它。但这很容易,再次假设两次通过使用相同大小的图像:
ivec2 size = textureSize(depthtex, 0);
可以使用size
作为视口的大小,将gl_FragCoord.xy
转换为纹理坐标和窗口空间位置。