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

时间:2012-02-02 11:38:15

标签: opengl-es

在OpenGL ES中,我如何获得从片段着色器调用片段着色器的顶点?

它出现的片段着色器没有链接到它的相应顶点?

2 个答案:

答案 0 :(得分:6)

没有直接的方法来访问片段着色器中的顶点,并且顶点着色器一次只处理1个顶点,并且没有整个基元的概念。片段着色器仅处理片段。

您可以输出有关特定顶点的信息,并将其插入到片段着色器中,就像如何在三角形中混合颜色一样,或者执行纹理坐标。通常你需要在片段着色器中进行混合,这样你也可以在顶点着色器中自动完成。你可以得到三维空间坐标(但只有碎片,而不是周围的顶点)。

据说,您可以将任意信息附加到着色器。例如,除了position,normals和texcoords之外,您还可以拥有一个额外的属性,该属性包含您希望在特定顶点中可访问的每个顶点的信息。如果可能是3组x,y,z坐标,如果这是您想要的信息,并且数字表示您正在处理的图元中的哪个顶点编号(即三角形中的第一个第2或第3个顶点)和/或序列号在整个网格中。或者它可能只是一个索引号,如果这是你想要的。额外的属性会占用更多内存,因为您必须复制基元中每个顶点的顶点数据,以确保片段着色器具有来自其所有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 +)几何体中,曲面细分着色器可以访问此类信息,并可将其输出到着色器管道中的下一个内容。

有了它说有助于确切知道你要完成什么,因为它可以了解需要将哪些顶点数据传递给片段着色器。如果没有访问片段着色器中的数据,也可以采用更简单的方式来执行您想要的操作。

答案 1 :(得分:2)

片段着色器确实没有到顶点着色器的链接,并且顶点着色器是每个顶点,没有创建该几何体的总集的概念。因此,您无法获得最终产生的片段着色器实例的顶点。

你想要达到特定的效果吗?无论你想从顶点计算什么,通常可以通过加载适当的变化来实现 - 例如如果你将每个顶点的3d位置加载到合适的变化,那么每个片段将固有地知道它的位置。