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

时间:2019-09-08 16:42:04

标签: c++ opengl glsl glfw assimp

是将顶点分为单独的glDrawElements(GL_TRIANGLES,...)和glDrawElements(GL_QUADS,...)绘制调用的唯一解决方案,还是有一种方法可以将没有描述多边形边的数据发送到几何着色器中并进行分类几何着色器中的多边形的轮廓? https://i.stack.imgur.com/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导入时使用flag来订购人脸类型,但这会失去人脸顺序。而且仍然不让我通过一次绘制调用来绘制所有内容,因此我将不得不为每种类型的多边形创建一堆绘制函数:( 也许会有类似的事情:首先通过将所有以前的indexs_on_face [i]添加到它来更改它。设置在绘制调用期间在几何着色器内绘制的第一个顶点号。在内部几何着色器中,将当前顶点的数量与indexs_on_face [i]进行比较,该指标将指示何时从顶点生成多边形。 gl_VertexID是否保持数字取决于传递的顶点数,独立于索引? 如何制定适合的抽奖电话?

1 个答案:

答案 0 :(得分:2)

不,您无法做任何您想做的事。 primitive包含每个基本图元的顶点数,并且在渲染命令中不会改变。

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

大多数网格导出器可以选择为您执行此操作。而且在某些情况下,Open Asset Importer可以在加载时通​​过passing the aiProcess_Triangulate flag为您的加载功能为您完成此操作。