c++ - 关于 glDrawRangeElements() 的问题

标签 c++ opengl render

我正在尝试使用 glDrawRangeElements() 命令渲染一些旧的关卡数据。我的顶点设置正确,索引设置正确,但我似乎无法渲染它。我终于在网上查了一下,发现了这里的例子:http://www.songho.ca/opengl/gl_vertexarray.html

从这个例子来看,我认为我一直做错了。显然,开始是一个索引值,结束是一个索引值,而不是 indices 数组的索引。我假设,例如,如果你想渲染 10 个三角形,开始为 0,结束为 29,计数为 30。但我显然错了?

只有当 0 和 29 处的索引值实际上是 0 和 29 时,这才是正确的。因此,如果索引以 400 开始并以 452 结束,则对同一数组的调用将改为

glDrawRangeElements(GL_TRIANGLES, 400, 452, 29, GL_UNSIGNED_BYTE, indices);

这样对吗?有没有人认为这有点违反直觉?关于顶点数组还有其他建议吗?

最佳答案

首先,让我们谈谈glDrawElements ,因为 Range 版本只是对其的修改。 count 是要从源索引数组中提取以呈现的索引数。每个索引将 map 拉到一个顶点。因此,如果您的 count 是“29”,那么您正在尝试渲染 29 个顶点。如果您使用 GL_TRIANGLES,这只会渲染 27 个顶点,因为每个三角形需要三个顶点。 OpenGL 将丢弃额外的内容。

所以如果你想渲染 30 个索引,你就把 30 作为计数。

现在我们知道了如何使用glDrawElements,让我们来谈谈glDrawRangeElements .通常使用 glDrawElements 时,您可以在源索引数组中指定一个位置以从中提取。 indicescount 参数告诉 OpenGL 在哪里找到索引。但是从这个数组中提取的实际索引可以在源顶点数组索引边界内的任何地方

glDrawRangeElements 允许您为 OpenGL 提供一个范围(包括在内,因为这是有意义的)顶点索引值。你的意思是它在这次绘制调用期间获得的索引不会超过该范围。这可以让驱动程序执行有用的优化。 start 值应该是将从索引数组中获取的最低索引值,end 应该是最高值。它应该只是第一个和最后一个顶点的索引。

关于c++ - 关于 glDrawRangeElements() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7549991/

相关文章:

c++ - 我正在尝试使用 glTexSubImage2D 更新纹理

c# - 项目引用另一个项目的 obj 文件夹中的 dll - 有时编译有时不编译

c++ - 如何在模板类方法中将方法指针作为参数传递

macos - 适用于OS X 10.7(Lion)的OpenGL调试器/错误跟踪器?

c++ - 了解纹理如何与 CUDA 配合使用

Java JCombobox导致渲染问题

angular - ngx-datatable 鼠标悬停渲染问题

javascript - React 组件不会显示函数的返回

c++ - 运营商新实现可见性问题

c++ - 加速单个文件的 gcc 编译