OpenGL:glDrawElements 不绘制

Posted

技术标签:

【中文标题】OpenGL:glDrawElements 不绘制【英文标题】:OpenGL: glDrawElements doesn't draw 【发布时间】:2012-07-15 03:12:39 【问题描述】:

我正在尝试 Vertex Arrays 的东西,但由于某种原因 glDrawElements 命令没有为我绘制任何东西。我可以在两者之间使用 glBegin/glEnd 和 glDrawElements 进行绘制,但 glDrawElements 不起作用。这是一个代码sn-p:

这些数组在构造函数中设置:

double points[100];
GLint indices[50];

for (int i=0; i < 50; i++)
    points[2*i] = radius * cos(i*2*PI/50);
    points[2*i + 1] = radius * sin(i*2*PI/50);
    indices[i] = i;

仅使用带有 glArrayElement 的点数组的工作代码:

void GLCircle::draw()

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_DOUBLE, 0, points);

    glBegin(GL_POLYGON);
    for (int i=0; i < 50; i++)
        glArrayElement(i);
    
    glEnd();

也是工作代码,使用点数组,通过索引数组访问特定索引:

void GLCircle::draw()

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_DOUBLE, 0, points);

    glBegin(GL_POLYGON);
    for (int i=0; i < 50; i++)
        glArrayElement(indices[i]);
    
    glEnd();

非工作代码,尝试使用 glDrawElements:

void GLCircle::draw()

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_DOUBLE, 0, points);

    glDrawElements(GL_POLYGON, 4, GL_INT, indices);

有什么建议吗?在这一点上我并不完全有必要使用它,但令人不安的是它不起作用......

【问题讨论】:

【参考方案1】:

glDrawElements的第二个参数是count,那么4不应该是索引的个数(50)吗?

【讨论】:

【参考方案2】:

参数

glDrawElements()

如下..:

第一个 [mode] 参数是要渲染的图元类型。

第二个 [count] 参数应该是要渲染的元素的数量。 IE。 顶点数

第三个 [type] 参数应该是 第四个 参数中值的类型.. 只能是其中一个

 GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT or GL_UNSIGNED_INT

第 4 个 [indices] 参数是一个指向索引存储位置的指针。

你可以阅读更多关于这个here..

【讨论】:

"第 4 个 [indices] 参数是指向索引存储位置的指针。"不!索引必须存储在当前绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区中。第四个参数是索引数组中的偏移量指针。 我引用了官方文档.. opengl.org/sdk/docs/man/xhtml/glDrawElements.xml 哦,是的,对不起。它确实是一个指向索引存储位置的指针。但与普通的 c 指针不同的是,它不指向系统内存中的数据,而是指向元素缓冲区中的数据(因此 0x0 是 IB 中的第一个元素)。【参考方案3】:

我刚遇到同样的问题。

试试GL_UNSIGNED_INT

glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_INT, indices);

【讨论】:

以上是关于OpenGL:glDrawElements 不绘制的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅使用glDrawElements绘制的时候,不绘制任何图元,报错 1282 即 GL_INVALID_OPERATION

OpenGL- glDrawElements 只绘制第一个元素

OpenGL - 使用 glDrawElements 错误地映射纹理

Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题

OpenGL glDrawElements

OpenGL glDrawElements 没有颜色