首页 > 解决方案 > OpenGL - 片段着色器中的tex坐标超出指定范围

问题描述

我正在尝试在 OpenGL 中绘制一个带有纹理的矩形。我只是想渲染整个 .jpg 图像,所以我在顶点缓冲区中将纹理坐标指定为 [0, 0] 到 [1, 1]。我希望片段着色器中的所有插值纹理坐标都在 [0, 0] 和 [1, 1] 之间,但是,根据纹理绘制的位置,我有时会得到一个小于 0 的纹理坐标(我知道之所以如此,是因为如果 tex 坐标小于 0,我尝试从片段着色器输出红色)。

为什么我得到一个超出指定范围的插值?我目前可视化顶点/片段,如下图(https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing):

在此处输入图像描述 如果我想象一个矩形,那么如果像素样本在矩形内,那么插值纹理坐标必须至少为 0,因为矩形的最左边代表 0,对吗?那么我如何得到一个小于 0 的值呢?

编辑:经过一些基本测试后,如果一个形状只是与该像素相交,而不是像素采样点在该形状内,则看起来会调用片段着色器。我通过将矩形的开始放置在像素中间稍前和稍后来测试这一点 - 当稍晚于像素中间时,我没有得到负值,但如果我将它放在中间稍后,那么我确实得到了一个负值。这与我链接到的网站所说的相矛盾 - 也许它取决于驱动程序?

编辑:我之前做的测试是开启多重采样。如果我关闭多重采样,那么即使形状超过中间,我也不会得到负值......

标签: opengl

解决方案


原来我只需要继续阅读链接的文章:

这就是多重​​采样变得有趣的地方。我们确定三角形覆盖了 2 个子样本,因此下一步是确定该特定像素的颜色。我们最初的猜测是我们为每个覆盖的子样本运行片段着色器,然后平均每个像素的每个子样本的颜色。在这种情况下,我们将在每个子样本的插值顶点数据上运行片段着色器两次,并将结果颜色存储在这些样本点中。这(幸运的是)不是它的工作原理,因为这基本上意味着我们需要运行比没有多重采样更多的片段着色器,从而大大降低了性能。

MSAA 的真正工作原理是片段着色器每个像素(对于每个图元)只运行一次,而不管三角形覆盖了多少子样本。片段着色器使用插入到像素中心的顶点数据运行,然后将结果颜色存储在每个覆盖的子样本内。一旦颜色缓冲区的子样本被我们渲染的图元的所有颜色填充,所有这些颜色就会被平均到每个像素,从而产生每个像素一个颜色。因为前一张图像中只有 4 个样本中的两个被覆盖,所以像素的颜色与三角形的颜色和存储在其他 2 个样本点的颜色(在本例中为透明颜色)进行平均,从而产生浅蓝色 -伊什颜色。

所以我得到了一个负值,因为片段着色器正在一个像素上运行,该像素至少有一个子样本点被形状覆盖,但形状稍微在像素的中点之后,因为“片段着色器使用插入到像素中心的顶点数据运行”,我得到一个负值。


推荐阅读