3

(编辑)我使用帧缓冲区进行了工作几何选择。我的目标是在一次绘制调用中绘制巨大的场景,但我需要绘制到多重采样颜色纹理附件 (GL_COLOR_ATTACHMENT0)并绘制到(编辑的)非多重采样纹理附件 (GL_COLOR_ATTACHMENT1)。问题是如果我使用多重采样纹理来挑选,由于多重采样,挑选会被破坏。

我将几何 ID 写入片段着色器,如下所示:

//...

// Given geometry id
uniform int in_object_id;

// Drawed to screen (GL_COLOR_ATTACHMENT0)
out vec4 out_frag_color0;

// Drawed to pick texture (GL_COLOR_ATTACHMENT1)
out vec4 out_frag_color1;

// ...

void main() {

    out_frag_color0 = ...; // Calculating lighting and other stuff

    //...

    const int max_byte1 = 256;
    const int max_byte2 = 65536;
    const float fmax_byte = 255.0;

    int a1 = in_object_id % max_byte1;
    int a2 = (in_object_id / max_byte1) % max_byte1;
    int a3 = (in_object_id / max_byte2) % max_byte1;

    //out_frag_color0 = vec4(a3 / fmax_byte, a2 / fmax_byte, a1 / fmax_byte, 1);
    out_frag_color1 = vec4(a3 / fmax_byte, a2 / fmax_byte, a1 / fmax_byte, 1);
}

(该代码的要点是使用 RGB 空间存储几何 ID,然后读回用于更改立方体颜色的使用)

当我将光标向左移动一个像素时会发生这种情况:

在此处输入图像描述

由于立方体像素的 alpha 值:

在此处输入图像描述

没有多重采样效果很好。但是多重采样将我的输出颜色相乘,然后几何 id 被破坏,因此它选择具有相乘值的随机立方体。

(编辑)我不能将一个多重采样纹理目标附加到 color0 并将非多重采样纹理目标附加到 color1,它不受支持。我怎样才能在一个draw call中做到这一点?

在此处输入图像描述

多重采样不是我的朋友我不确定我是否理解得很好(整个帧缓冲)。无论如何,这种选择几何形状的方式对我来说看起来很糟糕(我的意思是计算 ID 到颜色)。我做得好吗?如何解决多样本问题?有没有更好的办法?

PS:抱歉英语低。:)

谢谢。

4

2 回答 2

3

您不能在单个绘图调用中进行多重采样和非多重采样渲染。

正如您已经发现的那样,不支持在 FBO 中使用两个颜色目标,并且只对其中一个进行多重采样。从规范中的“帧缓冲区完整性”部分:

RENDERBUFFER_SAMPLES 的值对于所有附加的渲染缓冲区都是相同的;TEXTURE_SAMPLES 的值对于所有附加的纹理都是相同的;并且,如果附加的图像是渲染缓冲区和纹理的混合,则 RENDERBUFFER_SAMPLES 的值与 TEXTURE_SAMPLES 的值匹配。

您也不能同时渲染到多个帧缓冲区。总是有一个单一的当前帧缓冲区。

我能想到的唯一合理的选择是在单独的通行证中进行挑选。然后,您可以轻松地将帧缓冲区/附件切换到非多重采样渲染缓冲区,并避免所有这些问题。

无论如何,使用单独的通行证进行采摘对我来说似乎更清洁。这也允许您为每种情况使用专门的着色​​器,而不是总是产生两个输出,即使其中一个大部分未使用。

于 2015-05-25T18:33:04.470 回答
0

我认为这是可能的...您必须将拾取纹理设置为多重采样,并且在渲染场景后,您可以在屏幕上渲染 2 个三角形,在另一个片段着色器中您可以读出每个样本...要做到这一点,您必须使用GLSL 命令:

texelFetch(sampler, pixelposition/*[0-texturesize]*/, /*important*/layernumber);

然后您可以将其渲染为单采样纹理并通过 glReadPixel 读取颜色。

我现在还没有测试它,但我认为它有效

于 2016-05-25T13:57:16.637 回答