我很难将OpenGL规范(version 3.1,第27页)与互联网上的常见示例用法相匹配。
OpenGL规范版本3.1针对DrawElements规定:
命令
void DrawElements(enum mode, sizei count, enum type, void *indices);
通过将其索引存储在当前绑定元素数组缓冲区(参见2.9.5节)中的计数元素以索引定义的偏移量连续传输到GL,来构建几何图元序列。DrawElements传输的第i个元素将从每个启用的数组的元素索引[i]中获取。
我倾向于这样解释:
indices参数至少包含 count 个type * 类型的值。它的元素用作实际元素缓冲区的偏移量。由于每次使用DrawElements都必须绑定一个元素缓冲区,因此这里实际上有两组强制索引:一个在元素缓冲器中,另一个在索引阵列中。
在大多数情况下,这似乎是一种浪费。除非必须绘制一个用元素数组缓冲区定义的模型,但由于透明度等原因,需要将其元素从后到前排序。但我们如何实现呈现与普通元素数组缓冲区(没有排序)比?
现在,奇怪的是,互联网上的大多数示例和教程(here,here半页下的“索引绘图”)给予了一个单一的整数作为索引参数,大多数是0。有时(void*)0。它总是只有一个整数偏移量-显然 indices 参数没有数组!
我已经成功地使用了最后一个变体(为 indices 提供一个单点整数)与一些NVIDIA图形。但我在英特尔板上的芯片上崩溃了。我在想,到底是谁错了:我,规格或成千上万的例子。DrawElements的正确参数和用法是什么?如果允许使用单个整数,那么这与规范的沿着如何?
1条答案
按热度按时间jk9hmnmh1#
您正在被OpenGL-1.1以来遗留的 glDrawElements 绊倒。当时没有VBO,只有客户端数组,程序实际上会用 gl... Pointer 函数将索引指针(C语言中的数组)放入缓冲区/数组集合。
现在使用索引缓冲区,参数实际上只是服务器端缓冲区的偏移量。你可能对这个问题很感兴趣:What is the result of NULL + int?
我也给了一个详尽的答案,我强烈建议阅读https://stackoverflow.com/a/8284829/524368
我写的关于函数签名和类型转换的内容也适用于 *glDraw... * 调用。