我试图通过将屏幕空间点投射回View Space来避免使用位置缓冲区以用于照明。我试过乘以逆投影矩阵,但这并没有回馈View Space点。是否值得添加矩阵乘法以避免位置缓冲区?
Final-pass Shader:
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;
答案 0 :(得分:2)
你的大部分答案都可以在this answer上找到,这段时间太长而且涉及重新发布。但是,部分问题在于您使用的是texcoord
而不是gl_FragCoord
。
您想要使用gl_FragCoord
,因为OpenGL的保证是正确的值(假设您的延迟传递和您的光照传递使用相同大小的图像),无论如何什么。此外,它使您不必将值从顶点着色器传递到片段着色器。
缺点是您需要输出屏幕的大小来解释它。但that's easy enough,再次假设两次传球使用相同大小的图像:
ivec2 size = textureSize(depthtex, 0);
您可以使用size
作为视口的大小,将gl_FragCoord.xy
转换为纹理坐标和窗口空间位置。