2

我试图了解在多重采样渲染期间如何调用片段着色器,我仔细阅读了规范但我有点困惑..

我设置了一个带有颜色和深度/模板渲染缓冲区的多重采样 FBO .. 很好

我设置了一个简单的 1 线顶点着色器仅用于变换和另一个 1 线片段着色器,它只返回黑色.. 它很好

我画了一条线 - 这条线显示平滑..很好

现在,如果在片段着色器中,我不是笨拙地返回黑色,而是从多重采样纹理中提取纹理,总是读取样本编号 0(即黑色),我得到一条锯齿线..

a simplemyoutcolor=vec4(0.0)和 a 和有什么不一样myoutcolor=texelFetch(mysampler2DMS,...,0)

规范规定片段着色器仅在静态使用gl_SampleID,gl_Samplemask[]或具有“示例”存储限定符时在样本级别执行。(在所有这些情况下,这意味着 GLSL#version 400或更高版本),否则它将在片段级别执行。 .

但那怎么可能呢?在上面的例子中,即使我总是返回相同的颜色,我也得到了一条平滑线,所以我认为片段着色器总是在多采样帧缓冲区中的样本级别执行。另一方面,如果不是这样,我即使始终从 MS 纹理返回相同的样本,也应该得到平滑的结果。

有人可以帮我解决这个问题吗?

PS:我目前使用#version 330,但我发现每个multisampling-aware statement Id需要正确处理MS(gl_SampleID,,gl_Samplemask[]sample..)仅在GLSL 400或更高版本中受支持..所以,究竟是什么支持GLSL 330提供正确处理多重采样?如何在 GLSL 330 中处理 MS 纹理?

4

1 回答 1

1

在上面的例子中,即使我总是返回相同的颜色,我也得到了一条平滑线

因为这就是多重​​采样。

多重采样就是对每个像素调用一次 FS,并将该值分布在基元覆盖的像素区域内的样本上。因此,如果对图元边缘的像素执行 FS,则结果将仅分配给该像素的一些样本。

于 2018-02-24T19:41:47.637 回答