我正在构建一个图形应用程序,用户可以在其中通过单击画布来指定顶点,然后使用顶点绘制多边形。
该应用程序支持直线,三角形和多边形模式。绘制线条和三角形是通过计算点击次数来完成的。然后创建顶点数组,将数据绑定到缓冲区并使用glDrawArrays()
渲染。棘手的是多边形模式。用户可以指定任意数量的顶点,单击鼠标右键会触发绘图。我最初计划使用glMultiDrawElements
,但不知何故我没有得到任何输出。所以我试着循环打电话给glDrawElements()
。还是没有运气。我搜索了很多,并阅读了很多关于将glDrawElements()/glMultiDrawElements()
与 VBO 和 VAO 以及 glVertexPointer()
和 glColorPointer
一起使用的文档。还是没有运气。
我使用了以下内容来跟踪顶点属性:
GLfloat ** polygonVertices;//每个多边形顶点列表都进入这个。
GLuint * polygonIndexCounts; 用于保存每个多边形具有的顶点数的指针
GLuint ** 多边形索引; 用于保存与多边形对应的顶点索引的指针数组
GLfloat * polygonColors;//每次鼠标点击,颜色都是随机生成的。
和渲染代码:
glVertexPointer(4, GL_FLOAT, 0, (GLvoid*)polygonVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, (GLvoid*)polygonColors);
//glMultiDrawElements(GL_POLYGON, polygonIndicesCounts, GL_UNSIGNED_INT, polygonIndices, polygonCount);
for(int i = 0 ; i < polygonCount; i ++)
glDrawElements(GL_POLYGON, polygonIndicesCounts[i], GL_UNSIGNED_INT, polygonIndices[i]);
为什么多边形顶点指向指针?如果你把它投射到(void*)
OpenGL看到的唯一内容是每个指针指向的指针值。您希望它们扁平化为数组,因此它们的类型签名应与float*
兼容(而不是float**
)。指向指针的指针仅对 glMultiDrawArrays 调用有意义。