【问题标题】:Is a position buffer required for deferred rendering?延迟渲染是否需要位置缓冲区?
【发布时间】:2013-02-04 22:26:36
【问题描述】:

我试图通过将屏幕空间点投影回视图空间以与照明一起使用来避免使用位置缓冲区。我试过乘以逆投影矩阵,但这并没有返回视图空间点。是否值得添加矩阵乘法以避免位置缓冲区?

最终通过着色器:

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;

【问题讨论】:

    标签: opengl glsl deferred-rendering


    【解决方案1】:

    您的大部分答案都可以在this answer 上找到,因为太长了,无法重新发布。但是,部分问题在于您使用的是texcoord 而不是gl_FragCoord

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

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

    ivec2 size = textureSize(depthtex, 0);
    

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

    【讨论】:

    • 呵呵,这种计算uv坐标的方法看起来更准确,我做的是顶点着色器texcoord=((gl_ModelViewProjectionMatrix*gl_Vertex)+1.0)/2.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多