【问题标题】:GLSL access coverage mask of sampler2D texelsampler2D texel 的 GLSL 访问覆盖掩码
【发布时间】:2016-05-18 21:59:23
【问题描述】:

如果我通过 sampler2DMS 访问 GLSL 中的多重采样纹理,我如何知道该多重采样纹理的纹素中的哪些样本实际上已被覆盖?

来自多样本扩展参考: “...每个像素片段因此由整数 x 和 y 网格坐标、颜色、SAMPLES_ARB 深度值、纹理坐标和最大 SAMPLES_ARB 位的覆盖值组成。”

所以我想访问的是纹素的覆盖率值。我可以使用 gl_SampleMask (https://www.opengl.org/sdk/docs/man/html/gl_SampleMask.xhtml) 来写入当前处理的 FRAGMENT 的覆盖率值,但是如何访问从多重采样纹理中获取的 TEXEL 的覆盖率值?

【问题讨论】:

    标签: opengl glsl textures antialiasing multisampling


    【解决方案1】:

    多重采样的想法是,当您渲染到多重采样图像时,您只需为每个像素大小的区域执行一次片段着色器。光栅器生成的覆盖掩码决定了片段输出到像素内的哪些样本。

    但是一旦该过程完成,一旦片段着色器写入其数据,多重采样图像本身就完全不知道这些覆盖掩码是什么。多样本纹理只是每个纹素具有多个样本值。它不知道哪些片段使用哪些样本掩码生成了哪些样本。

    示例蒙版只是渲染的一部分。

    这样想。这是一个多重采样纹理的像素:

    vec4 pixel[SAMPLE_COUNT];
    

    当您渲染到多重采样纹理时,您的片段着色器执行了与此等效的操作:

    for(int sample_ix = 0; sample_ix < SAMPLE_COUNT; ++sample_ix)
    {
      if(sampleMask[sample_ix])
        pixel[sample_ix] = output;
    }
    

    pixel 的数据可能最初来自样本掩码。但是pixel 不知道会发生这种情况;它只是一个 vec4 值的数组。

    您可以获得您的当前片段的覆盖率值。但这与最初用于在多重采样纹理中构成像素的实际覆盖率值无关。

    【讨论】:

    • 谢谢 Nicol,这是一个非常清晰易懂的解释!作为一个相关问题,是否可以轻松(无需迭代)检查多重采样纹理中纹素的样本是否都相同?
    • @user1282931: 不;)虽然很好,但他们只是不存储这些信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多