*BaseVertex and gl_VertexID

7
我翻译的结果如下:

我浏览了规范和OpenGL论坛,但无法理解以下内容:

绘图命令的*BaseVertex版本是否应该添加到GLSL变量gl_VertexID中?按照实际运作,gl_VertexID包含从绑定的ELEMENT_ARRAY_BUFFER取出的索引,然后加上basevertex

所以,我的问题是:这是正确的行为吗? 我认为gl_VertexID应该包含用于获取顶点的索引。

2个回答

5

是的,这是正确的行为。BaseVertex的使用场景是,您只需要切换这一个值,而不是使用gl*Pointer函数调整顶点数组中的缓冲区偏移量。

这个想法是,您可以将多个网格(模型文件)的数据加载到单个VBO中,而无需调整索引。


明白了,我猜类似"gl_Element"的东西 - 包含最终计算的索引 - 在OpenGL/GLSL的某个未来版本中作为gl_VertexID的良好补充会很不错。谢谢。 - palle8x
@palle8x 我认为不是这样的,因为元素数组中的索引在概念上更重要。如果你真的需要它,你可以为baseVertex添加一个uniform,并将其添加到gl_VertexID中。 - Christian Rau
我同意,你所描述的是我目前在我的代码中所做的。但我仍然认为像“gl_Element”这样的东西有一个有效的用例,并且(我相信)在驱动程序中实现它不会太难。 - palle8x
@palle8x:这只会增加不必要的复杂性。正如Christian Rau所建议的那样,您可以轻松地添加一个uniform,其中传递BaseVertex偏移量并在着色器中进行数学计算(简单的加法)。由于更改BaseVertex在绘制调用之间发生,因此更改uniform的开销接近或甚至完全为0(命令以固定大小的多个数据包批次发送。更改uniform和顶点基础可能很好地适合一个数据包中)。 - datenwolf
正确。它不会让你做任何以前不能做的事情。它只是一个方便的功能。 - palle8x

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接