c++ - glDrawElements 可以独立于多边形类型使用吗?

标签 c++ opengl glsl glfw assimp

是将顶点分组为单独的 glDrawElements(GL_TRIANGLES, ...) 和 glDrawElements(GL_QUADS, ...) 绘制调用的唯一解决方案,或者是否有一种方法将描述多边形边数的数据发送到几何着色器并排序类型几何着色器内的多边形? /image/4Ee4e.jpg 您所看到的我的输出控制台是我的网格结构的输出。我有:

vector <float> vert_data;
unsigned int faces_no;
vector <unsigned int> indices_on_face;
vector <unsigned int> indices;

第一个基本上就是发送到 open-gl 缓冲区的内容:坐标、法线、颜色等。第二个表示此数据中描述了多少个面。第三个表示多边形中的顶点数。它按顺序进行。第四个是索引(glBufferData(GL_ELEMENT_ARRAY_BUFFER,...))。所以基本上我正在寻找一种将第三个发送到几何着色器的方法。 我知道从 assimp 导入时可以使用标志对面部类型进行排序,但这会失去面部顺序。并且仍然不允许我用单个绘制调用绘制所有内容,因此我必须为每种类型的多边形创建一堆绘制函数:( 也许可能会出现这样的情况:首先通过添加所有以前的索引来更改每个indices_on_face[i]。设置在绘制调用期间在几何着色器内绘制的第一个顶点编号。内部几何着色器将当前的顶点数与indices_on_face[i]进行比较,这将告诉何时从顶点生成多边形。 gl_VertexID 是否保存与传递的顶点计数相关的数字,与索引无关? 我如何制定适合它的绘图调用?

最佳答案

不,没有办法做你想做的事。一个primitive包括每个基本基元的顶点数,并且在渲染命令中不会改变。

此外,几何着色器几乎肯定会减慢渲染速度而不是加快渲染速度,特别是与标准解决方案相比:仅发送三角形。将任何非三角形多边形分解为三角形,因此您可以在一次绘制调用中将它们全部发送。我的意思是,无论如何,硬件都会为您做这件事,所以您不妨自己做。

大多数网格导出器都可以选择为您执行此操作。如果没有这样做,Open Asset Importer 可以在加载时为您完成此操作 passing the aiProcess_Triangulate flag到您的加载函数。

关于c++ - glDrawElements 可以独立于多边形类型使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57843825/

相关文章:

c++ - 如何将用户输入的颜色传递给 textcolor()?

c++ - 简单的 c++ cout 语句,一行有格式问题,这是什么?

c++ - OpenGL - 超出 gpu 内存,可能的情况

java - OpenGL 版本

c++ - 使用 ASSIMP 和 OpenGL 加载 3D 模型时顶点和正常访问不正确

OpenGL:如何暂停着色器工作

javascript - 使用 ThreeJS 将 Vec3 数组传递给顶点着色器

c++ - 具有可变数量索引的 OpenGL glDrawElements

c++ - QDirIterator 和 Windows 快捷方式

java - GLSL 结构统一位置返回 -1