2012-02-02 53 views

回答

6

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

您可以输出关于特定顶点的信息,并将其插入片段着色器,例如如何在三角形上混合颜色或执行纹理坐标。通常情况下,无论如何,您都需要在片段着色器中进行混合处理,以便在顶点着色器中自动完成。你可以得到碎片三维空间坐标(但只有碎片,而不是周围的顶点)。

这样说,你可以附加任何信息到你的着色器。例如,除了位置,法线和texcoords之外,还可以有一个额外的属性,其中包含有关要在特定顶点中访问的每个顶点的信息。如果这可能是3组x,y,z坐标,如果这是你想要的信息和一个数字,表示正在处理的图元中的哪个顶点数(即三角形中的第一个第二或第三个顶点)和/或序列号在整个网格中。或者它可能只是一个索引号,如果这是你想要的。额外的属性会占用更多的内存,因为您必须复制基元中每个顶点的顶点数据,以确保片段着色器与其所有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 

如果你需要,你需要重复,太多的法线或纹理COORDS。

还要考虑片段着色器中的顶点信息实际上在做什么。您可以预先计算在片段着色器中要计算的答案,而不是将所有顶点的数据发送出去,而是将答案附加为属性,并从顶点着色器到片段着色器进行插值。

另一种方法是将所有顶点数据转储到统一数据库中并查找它。你可能仍然需要附加一些索引信息作为顶点属性,尽管它知道它应该查找哪个索引。另外请记住,由于每个像素都会发生查找,因此查找速度会很慢,并且您可能会发生碰撞,因为每个顶点都将查看有关周围信息的信息。

在较新版本的OpenGL(3.x +)几何图形和细化着色器中,可以访问这种信息并将其输出到着色器管道中的下一个东西。

有了这样的说法,它将有助于准确地知道你要完成什么,因为它提供了哪些顶点数据需要传递给片段着色器。如果没有访问片段着色器中的数据,也可能有更简单的方法来做你想做的事情。

2

片段着色器确实没有链接到顶点着色器,而顶点着色器是每个顶点,没有创建该几何图形的总集合的概念。所以你不能获得最终产生片段着色器实例的顶点。

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

相关问题