【问题标题】:Can glDrawElements be used independently from polygon type?glDrawElements 可以独立于多边形类型使用吗?
【发布时间】:2020-01-10 14:51:55
【问题描述】:

是将顶点分组为单独的 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 导入时使用标志来排序面部类型,但这会丢失面部顺序。并且仍然不允许我使用单个绘图调用绘制所有内容,因此我必须为每种类型的多边形创建一堆绘图函数:( 也许有可能是这样的:首先通过添加所有以前的索引来更改每个indices_on_face[i]。设置在绘图调用期间在几何着色器中绘制的第一个垂直编号。内部几何着色器将当前顶点数与 indices_on_face[i] 进行比较,这将告诉何时从顶点生成多边形。 gl_VertexID 是否持有依赖于传递顶点计数的数字,独立于索引? 如何制定适合它的绘图调用?

【问题讨论】:

    标签: c++ opengl glsl glfw assimp


    【解决方案1】:

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

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

    大多数网格导出器都可以选择为您执行此操作。在他们不这样做的情况下,Open Asset Importer 可以在加载时通​​过passing the aiProcess_Triangulate flag 为您的加载函数执行此操作。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2015-05-22
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多