我正在渲染一条由OpenGL中的三角形组成的线。
现在我让它在以下地方工作:
顶点缓冲区:{v0, v1, v2, v3}
索引缓冲区(三角形条):{0, 1, 2, 3}
顶部图像是传递到顶点着色器的原始数据,底部是将偏移应用于v1和v3(使用顶点属性)后的顶点着色器输出。
我的目标是在线上每个点使用一个顶点并以其他方式生成偏移。我在看gl_VertexID,但我想要更像元素ID的东西。这是我想要的设置:
顶点缓冲区:{v0, v2}
索引缓冲区(三角形条):{0, 0, 1, 1}
并使用虚构的gl_ElementID % 2
来偏移每个其他顶点。
我正在尝试避免使用几何着色器或其他顶点属性。有没有办法做到这一点?我对完全不同的想法持开放态度。
答案 0 :(得分:2)
我可以想到一种避免几何着色器的方法,并且仍然使用紧凑的表示法:instanced rendering。只绘制一个四边形的许多实例(作为三角形条),并通过glVertexAttribDivisor()将每个实例属性定义为两个位置。
请注意,您不需要"模板quad"总共有4个顶点。您只需在概念上需要两个属性,一个用于起点,一个用于终点。 (如果你在2D中工作,当然可以将其融合为一个vec4
。在每个顶点着色器调用中,您将可以访问这两个点,并可以根据该值和gl_VertexID
的值(仅在0到3范围内)构造最终顶点位置。这样,你可以完全摆脱你所针对的每个线段的两个点的顶点数组布局,并且仍然只需要一个绘制调用和一个顶点着色器。
答案 1 :(得分:1)
不,这是不可能的,因为每个顶点只处理一次。因此,如果您使用索引缓冲区引用顶点10次,则相应的顶点着色器仍然只执行一次。
这是使用Post Transform Cache在硬件中实现的。
在绝对最佳的情况下,您永远不必处理相同的顶点 不止一次。
顶点是否与前一个顶点相同的测试是 有些间接的。测试所有这些都是不切实际的 用户定义的不等式属性。相反,一种不同的手段 使用。
两个顶点被认为是相等的(在单个渲染命令中) 如果顶点的索引和实例计数相同(gl_VertexID 和着色器中的gl_InstanceID)。由于顶点为非索引 渲染总是在增加,不可能使用帖子 使用非索引渲染转换缓存。
如果顶点位于后变换缓存中,则该顶点数据为 甚至不一定再次从输入顶点数组读取。该 进程跳过读取和顶点着色器执行步骤,简单地说 将该顶点变换后数据的另一个副本添加到输出中 流。
为了解决您的问题,我将使用带有线(或线条)的几何着色器作为输入,并使用三角形条作为输出。使用此设置,您可以摆脱索引缓冲区,因为它只能在线路上工作。