OpenGL:glDrawElements不绘制。

5

我正在尝试使用顶点数组,但出现了问题,glDrawElements命令对我没有任何绘制作用。我可以使用glBegin/glEnd和glDrawElements之间的绘图,但glDrawElements无法工作。这是一段代码片段:

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

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);
}

有什么建议吗?虽然现在我并不完全需要使用它,但它无法正常工作还是让人不安...

3个回答

7
glDrawElements 的第二个参数是 count,所以 4 应该是索引的数量(50)吗?

5

参数为

glDrawElements()

以下是内容翻译:

如下所示.. :

1号[模式]参数是要渲染的基本图元的类型。

2号[计数]参数应该是要渲染的元素数量。即,顶点的数量。

3号[类型]参数应该是第4号参数中值的类型.. 只能是以下两种之一:

 GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT or GL_UNSIGNED_INT

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

您可以在此链接中了解更多信息。


4
第四个[indices]参数必须是指向当前绑定到GL_ELEMENT_ARRAY_BUFFER的缓冲区中存储索引的位置的指针。它不是一个指针,指向索引存储的地方。第四个参数是索引数组中的偏移量指针。请注意,原文中使用了错误的术语。 - IceCool
我引用了官方文档.. http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml - iKlsR
6
哦,是的,抱歉。它确实是一个指向索引存储位置的指针。但与普通的C指针不同,它不指向系统内存中的数据,而是指向元素缓冲区中的数据(因此0x0是IB中的第一个元素)。 - IceCool

1
我刚遇到了同样的问题。
尝试使用GL_UNSIGNED_INT
glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_INT, indices);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接