在OpenGL ES中,我如何从片元着色器中获取调用该片元着色器的顶点?似乎片元着色器与其对应的顶点之间没有联系?
没有直接的方法可以在片段着色器中访问顶点,顶点着色器每次只能处理一个顶点,并没有整个图元的概念。片段着色器只处理片段。
您可以输出关于特定顶点的信息,并使其在片段着色器中插值,就像您可以在三角形上混合颜色或执行纹理坐标一样。通常情况下,您需要在片段着色器中完成混合,因此最好在顶点着色器中自动完成。您可以获取片段的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
您是否想要实现特定效果?无论您想从顶点计算什么,通常都可以通过加载适当的varyings来实现 - 例如,如果您将每个顶点的3D位置加载到合适的varying中,则每个片元本质上都会知道自己的位置。