没有直接的方法来访问片段着色器中的顶点,并且顶点着色器一次只处理1个顶点,并且没有整个基元的概念.片段着色器仅处理片段.
您可以输出有关特定顶点的信息,并将其插入到片段着色器中,就像如何在三角形中混合颜色一样,或者执行纹理坐标.通常你需要在片段着色器中进行混合,这样你也可以在顶点着色器中自动完成.您可以获取片段3d空间坐标(但只有片段,而不是周围的顶点).
据说你可以将任意信息附加到着色器上.例如,除了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
Run Code Online (Sandbox Code Playgroud)
如果你需要法线或纹理坐标,你也需要复制它.
还要考虑您实际使用片段着色器中的顶点信息做了什么.您可以预先计算片段着色器中要计算的答案,而不是发送所有顶点的数据,而是将答案作为属性附加,并将其从顶点着色器插入片段着色器.
另一种方法是将所有顶点数据转储成一个统一的并查找它.您可能仍然需要附加某种索引信息作为顶点属性,因此它知道它应该查找哪个索引.还要记住,查找会很慢,因为它发生在每个像素上,并且您可能会遇到冲突,因为每个顶点都会查看有关它周围信息的信息.
在较新版本的OpenGL(3.x +)几何体中,曲面细分着色器可以访问此类信息,并可将其输出到着色器管道中的下一个内容.
有了这样说,它将有助于确切地知道你想要完成什么,因为它可以了解需要将哪些顶点数据传递给片段着色器.如果没有访问片段着色器中的数据,也可以使用更简单的方法来执行您想要的操作.
| 归档时间: |
|
| 查看次数: |
1603 次 |
| 最近记录: |