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;
4

1 回答 1

3

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

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

缺点是您需要输出屏幕的大小来解释它。但这很容易,再次假设两次传递使用相同大小的图像:

ivec2 size = textureSize(depthtex, 0);

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

于 2013-02-04T22:57:01.230 回答