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 错误地映射纹理