Bra*_*ram 5 interpolation glsl msaa
我将GLSL与顶点着色器和片段着色器一起使用。
顶点着色器输出highp float[0,1]范围内的a
当它到达片段着色器时,我看到值(在三角形边缘)不少于 1.1!
这个问题就会消失,如果我...
flat。如果启用了 MSAA,固定的 0 到 1 高精度浮点如何以远大于 1 的值到达片段着色器?
顶点着色器代码:
out highp float lightcontrib2;
...
lightcontrib2 = clamp( irrad, 0.0, 1.0 );
Run Code Online (Sandbox Code Playgroud)
片段着色器代码:
in highp float lightcontrib2;
...
if (lightcontrib2>1.1) { fragColor = vec4(1,0,1,1); return; }
Run Code Online (Sandbox Code Playgroud)
果然,使用 MSAA 4x,这就是 OpenGL 生成的图像。(观察窗口中心的磁铁色像素。)
我已经排除了非数字值。
GL_版本:3.2.0 NVIDIA 450.51.06
如果启用了 MSAA,固定的 0 到 1 高精度浮点如何以远大于 1 的值到达片段着色器?
多重采样的核心是超级采样的一种变体:从图元的像素大小区域中获取多个样本。对该像素大小区域的空间内的不同位置进行采样以产生结果值。
然而,当您位于图元的边缘时,该像素大小区域中的某些位置位于图元实际覆盖的区域之外。在超级采样中这很好;你只是不使用这些样本。
然而,多重采样则不同。在多重采样中,深度样本与片段着色器生成的样本不同。也就是说,系统可能只执行一次 FS,但会获取 4 个深度样本并针对深度缓冲区中的 4 个样本进行测试。通过深度测试的任何样本都会从执行的单个 FS 调用中获取其颜色值。如果这 4 个深度样本中有一些位于图元区域之外,那也没关系;他们不算数。
然而,通过将 FS 调用值与深度采样分开,我们现在遇到一个问题:单个 FS 调用到底在像素区域内的何处执行?
这就是我们遇到问题的地方。如果 FS 调用在基元区域之外的位置执行,则通常会被丢弃。但如果任何深度样本位于图元区域内,那么这些深度样本仍然需要获取颜色数据。MSAA 的重点是不为每个样本执行 FS,因此它们可以从在不同位置执行的 FS 调用获取颜色数据。
理想情况下,它将来自在基元区域内的某个位置执行的 FS 调用。但硬件并不能保证这一点。嗯,无论如何,默认情况下它都不能保证这一点。如果 FS 位置恰好稍微超出图元区域,则并非每个算法都会出现问题。
但有些算法确实存在问题。这就是为什么我们有片段着色器输入的限定符centroid。它确保将在基元区域内生成特定的插值。
正如您可能已经猜到的,这不是默认值,因为它比非centroid插值慢。因此,仅在需要时才使用它。