Opengl 无法使用GLDraweElements()获取输出(&;glmultipaurements()

Opengl 无法使用GLDraweElements()获取输出(&;glmultipaurements(),opengl,opengl-3,vertex-array,vertex-attributes,vertexdata,Opengl,Opengl 3,Vertex Array,Vertex Attributes,Vertexdata,我正在构建一个图形应用程序,用户可以通过单击画布指定顶点,然后使用顶点绘制多边形 该应用程序支持直线、三角形和多边形模式。绘制直线和三角形是通过计算点击次数来完成的。然后创建顶点数组,将数据绑定到缓冲区,并使用glDrawArrays()进行渲染。棘手的是多边形模式。用户可以指定任意数量的顶点,并单击鼠标右键触发绘图。我最初计划使用glmultipaurements,但不知何故,我没有得到任何输出。因此,我尝试在循环中调用glpaurements()。还是没有运气。我搜索了很多并阅读了很多关于在

我正在构建一个图形应用程序,用户可以通过单击画布指定顶点,然后使用顶点绘制多边形

该应用程序支持直线、三角形和多边形模式。绘制直线和三角形是通过计算点击次数来完成的。然后创建顶点数组,将数据绑定到缓冲区,并使用
glDrawArrays()
进行渲染。棘手的是多边形模式。用户可以指定任意数量的顶点,并单击鼠标右键触发绘图。我最初计划使用
glmultipaurements
,但不知何故,我没有得到任何输出。因此,我尝试在循环中调用
glpaurements()
。还是没有运气。我搜索了很多并阅读了很多关于在VBOs和VAOs中使用
glDrawerElements()/glMultiDrawerElements()
以及
glVertexPointer()
glColorPointer
的文档。还是不走运

我使用以下方法跟踪顶点属性:
GLfloat**多边形顶点//每个多边形顶点列表都会进入此。。
GLuint*多克隆指数计数//用于保存每个多边形的顶点数的指针
GLuint**多克隆//用于保存对应于多边形的顶点索引的指针数组
GLfloat*多色//每单击一次鼠标,就会随机生成颜色

以及用于渲染的代码:

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]);
glVertexPointer(4,GL_FLOAT,0,(GLvoid*)多边形顶点);
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_颜色_阵列);
GLCOLORPOINT(4,GLU浮点,0,(GLvoid*)多色);
//glmultipaurements(GL_多边形、polygonindicatescounts、GL_无符号整数、polygonindicates、polygonCount);
对于(int i=0;i
为什么多边形顶点指针指向指针?如果将其转换为
(void*)
,OpenGL看到的唯一东西就是每个指针指向的指针的值。您希望它们是平面数组,因此它们的类型签名应该与
float*
兼容(而不是
float**
)。指向指针的指针仅对glMultiDrawArrays调用有意义。

有任何GL错误吗?你确定你的数据是正确的吗?嗨,thokra,没有错误。我也尝试过使用glGetError()。但是什么都没有。嗨,datenwolf,**版本有效。我不必把它弄平。以下工作:
GLfloat顶点[4][3]={0.2f,0.2f,0.0f},{-0.2f,0.2f,0.0f},{0.2f,-0.2f,0.0f},{-0.2f,-0.2f,0.0f};GLfloat颜色[12]={0.32f、0.92f、0.30f、0.32f、0.12f、0.50f、0.82f、0.42f、0.80f、0.52f、0.72f、0.10f};GLuint指数[]={0,1,3,2};glEnableClientState(GL_顶点_数组);glVertexPointer(3,GLU浮点,0,顶点);glEnableClientState(GL_颜色_阵列);glColorPointer(3,GL_浮点,0,颜色);元素(多边形,4,无符号整数,索引)@AnkurHuralikoppi:这个特定的版本有效,因为您正在自动内存中分配多维数组。C语言标准规定,在这种特殊情况下,多维数组中的所有元素都必须是连续的。但是,
**
仍然是错误的。因为这样做会发生什么:
GLfloat**a2=malloc(sizeof(float*)*4);对于(int i=0;i@AnkurHuralikoppi:长话短说:对于多维数据,切勿使用指向指向指向…的指针的指针。始终分配
malloc(宽*高*深*…);
(或等效的
新建
)的平面缓冲区和
[…+宽*高*z+宽*y+x]地址
。其他一切都是疯狂的。效率也很低,因为每个指针级别都会引入一个昂贵的间接寻址,这对缓存来说很难。我将数组展平,然后将索引复制到GL\u ELEMENT\u ARRAY\u缓冲区中,然后使用索引偏移量。这就解决了问题!