当前位置: 首页 > 知识库问答 >
问题:

访问着色器程序中的深度模具纹理

明安阳
2023-03-14

似乎很难找到有关如何在连续渲染通道的着色器中访问深度和模板缓冲区的信息。

在第一次渲染过程中,我不仅渲染颜色和深度信息,还使用模具操作来计算对象。为此,我使用了一个多渲染目标FBO,附带了颜色缓冲区和一个组合的深度模具缓冲区。所有这些都是纹理形式(不涉及渲染缓冲区对象)。

在第二次渲染过程中(当渲染到屏幕时),我想访问之前计算的每像素模板索引(但不一定是我正在绘制的相同像素),类似于您希望访问之前渲染的颜色缓冲区以应用一些后处理效果。

但是我无法将第二遍中的深度模板纹理作为统一绑定到我的着色器程序。至少只有黑色值从中读取,所以我猜它没有正确绑定。

>

  • 是否可以将深度模板纹理绑定到纹理单元以在着色器程序中使用?使用“普通”采样器访问深度和模板纹理是不可能的吗?是否可以使用一些“特殊”采样器?它取决于纹理上设置的插值模式还是类似的设置?

    如果没有,将模具信息复制到这两个渲染过程之间的单独颜色纹理中的最佳(最快)方法是什么?可能涉及第三个渲染过程,该过程使用模具测试绘制单一颜色(在最终渲染过程中,我只需要模具缓冲区的二进制版本,准确地说,我需要测试该值是否为零)。

    中间FBO使用的纹理设置如下:

    // The textures for color information (GL_COLOR_ATTACHMENT*):
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    // The texture for depth and stencil information (GL_DEPTH_STENCIL_ATTACHMENT*):
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);
    

    在第二次渲染过程中,我目前只尝试“调试”所有纹理的内容。因此,我使用以下值设置着色器:

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, <texture>);
    glUniform1i(texLocation, 0);
    

    让着色器程序简单地将纹理复制到屏幕上:

    uniform sampler2D tex;
    in vec2 texCoord;
    out vec4 fragColor;
    
    void main() {
        fragColor = texture2D(tex, texCoord);
    }
    

    结果如下:

    >

    当将深度模板纹理复制到CPU并检查它时,我在打包的24 8位数据中看到了深度和模板信息。


  • 共有1个答案

    郝杰
    2023-03-14

    我没有使用模具作为纹理的经验,但您可能想看看以下扩展:

    http://www.opengl.org/registry/specs/ARB/stencil_texturing.txt

    另一种选择是创建纹理视图,使用

    http://www.opengl.org/registry/specs/ARB/texture_view.txt

    或者,您可以在没有模板缓冲区的情况下计数对象,可能使用MRT和第二个渲染目标的加法混合,使用:

    http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt

    但我担心这些选项不包括在纯GL3中。3.

     类似资料:
    • 我一直在尝试渲染到一个FBO,并将两个FBO渲染到屏幕上,但在合并两个FBO时进行深度测试失败。我尝试使用计算着色器合并纹理,但无法读取深度纹理的值(所有值都是值1,但渲染到FBO时深度测试有效)。有人知道我做错了什么,或者知道其他方法来合并两个FBO吗? 以下是我创建FBO的方式: 以下是我向FBO渲染的方式: 我尝试用glBindTexture绑定纹理(所有值均为1): 计算着色器: 我已尝试

    • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方

    • 我试图在OpenGL中制作一个场景,从太空模拟地球。我现在有两个球体,一个用于地球,另一个稍大一些用于云层。地球和云球体对象都有自己的着色器程序来保持简单。地球着色器程序采用4种纹理(白天、夜晚、specmap和normalmap),而云着色器程序采用2种纹理(cloudmap和normalmap)。我有一个对象类,它有一个渲染函数,在该函数中我使用以下逻辑: 它从第0个纹理单元开始,从GL_TE

    • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

    • 我创建了一个FBO,并有一个纹理绑定作为其颜色附件,我有多个着色器程序,对纹理做一些后处理,一切都很好,但它对我来说没有意义,纹理可以用作输入(sampler2D)以及同时着色器的输出。 以下是我采取的步骤: 创建一个FBO。 创建一个纹理,并将其绑定为的颜色附件。 调用将绑定到帧缓冲区目标。 调用使用着色器程序。 调用来绘制一些东西(最终在上绘制,因为当前绑定)。 调用使用shader程序,它在

    • 如何在平面上滚动纹理?所以我有一个平面有一个纹理,我可以使用一个着色器滚动左从右(无限)的纹理上?