是延迟渲染所需的位置缓冲区吗?

时间:2013-02-04 22:26:37

标签: opengl glsl deferred-rendering

我试图通过将屏幕空间点投射回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;

1 个答案:

答案 0 :(得分:2)

你的大部分答案都可以在this answer上找到,这段时间太长而且涉及重新发布。但是,部分问题在于您使用的是texcoord而不是gl_FragCoord

您想要使用gl_FragCoord,因为OpenGL的保证是正确的值(假设您的延迟传递和您的光照传递使用相同大小的图像),无论如何什么。此外,它使您不必将值从顶点着色器传递到片段着色器。

缺点是您需要输出屏幕的大小来解释它。但that's easy enough,再次假设两次传球使用相同大小的图像:

ivec2 size = textureSize(depthtex, 0);

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