如何在OpenGL ES中获取调用片段着色器的顶点?

4
在OpenGL ES中,我如何从片元着色器中获取调用该片元着色器的顶点?似乎片元着色器与其对应的顶点之间没有联系?
2个回答

7

没有直接的方法可以在片段着色器中访问顶点,顶点着色器每次只能处理一个顶点,并没有整个图元的概念。片段着色器只处理片段。

您可以输出关于特定顶点的信息,并使其在片段着色器中插值,就像您可以在三角形上混合颜色或执行纹理坐标一样。通常情况下,您需要在片段着色器中完成混合,因此最好在顶点着色器中自动完成。您可以获取片段的3D空间坐标(但仅限于片段,而不是周围的顶点)。

话虽如此,您可以将任意信息附加到着色器中。例如,除了位置、法线和纹理坐标之外,还可以有一个额外的属性,其中包含您希望在特定顶点中访问的每个顶点的信息。如果您希望获得的信息是x、y、z坐标的3组,则可能是该数据以及表示您正在处理的基本体中的哪个顶点号码(即三角形中的第1个、第2个或第3个顶点)和/或整个网格中的序列号等数字。或者,如果这是您想要的内容,它也可以仅是一个索引编号。然而,额外的属性会占用更多内存,因为您必须为基本体中的每个顶点复制顶点数据,以确保片段着色器从其三个顶点处获得相同的数据。

例如,对于每个顶点(三角形基元)以下是一些属性:

v1, n1, uv1, v1, v2, v3, 0
v2, n2, uv2, v1, v2, v3, 1
v3, n3, uv3, v1, v2, v3, 2
v4, n4, uv4, v4, v5, v6, 0
v5, n5, uv5, v4, v5, v6, 1
v6, n6, uv6, v4, v5, v6, 2

如果您需要法线或纹理坐标,您也需要将其复制。此外,请考虑在片段着色器中实际上使用顶点信息的内容。与其发送所有顶点的数据,不如预先计算在片段着色器中要计算的答案,并将答案作为属性附加到顶点着色器上,并将其插值到片段着色器中。另一种方法是将所有顶点数据转储到一个统一的变量中并查找它。但是,您可能仍然需要将某种索引信息附加为顶点属性,以便它知道应该查找哪个索引。还要记住,由于每个像素都在发生查找,因此查找速度会很慢,并且由于每个顶点都将查看周围顶点的信息,因此可能会出现冲突。在新版本的OpenGL(3.x+)中,几何和细分着色器可以访问此类信息,并将其输出到着色器管道中的下一个位置。总之,了解您要完成的确切任务将有助于确定需要传递给片段着色器的顶点数据。此外,可能存在更简单的方法来实现您想要的目标,而无需在片段着色器中访问该数据。

不是楼主,但我对获取连接顶点的能力很感兴趣,以便计算给定向量相对于给定向量是凸还是凹。也许在这里发布这样的问题不合适,我应该开一个新的问题。 - Marviel

2
片元着色器确实与顶点着色器没有联系,而且顶点着色器是对每个顶点进行处理,没有概念可以用于创建几何图形的总集合。因此,您无法获取生成最终片元着色器实例的顶点。

您是否想要实现特定效果?无论您想从顶点计算什么,通常都可以通过加载适当的varyings来实现 - 例如,如果您将每个顶点的3D位置加载到合适的varying中,则每个片元本质上都会知道自己的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接