C 如何使用VBO绘制三角形?
我试图让我的VBO绘图,但我什么也看不见。我试图画一个三角形(在我看来,一个三角形是正确方向上的一个良好开端)。一切都编译并运行而不中断C 如何使用VBO绘制三角形?,c,windows,opengl,vbo,C,Windows,Opengl,Vbo,我试图让我的VBO绘图,但我什么也看不见。我试图画一个三角形(在我看来,一个三角形是正确方向上的一个良好开端)。一切都编译并运行而不中断 void initGraphics(int width, int height) { glViewport(0, 0, width, height); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBlendFunc(GL
void initGraphics(int width, int height) {
glViewport(0, 0, width, height);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(1.0, 1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, width, height, 0.0);
glMatrixMode(GL_MODELVIEW);
}
GLuint vboId;
void initVbo(void) {
GLsizei dataSize;
GLfloat* vertices;
int vCount = 3;
dataSize = sizeof(GLfloat) * 3 * vCount;
vertices = (GLfloat*)malloc(dataSize);
vertices[0] = 0;
vertices[1] = 0;
vertices[2] = 0;
vertices[3] = 100;
vertices[4] = 0;
vertices[5] = 0;
vertices[6] = 100;
vertices[7] = 100;
vertices[8] = 0;
glewInit();
glGenBuffersARB(1, &vboId);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);
free(vertices);
//glDeleteBuffersARB(1, &vboId); // edit #1
}
unsigned int indices[] = { 0, 1, 2 }; // edit #3
void drawVbo(void) {
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1.0, 1.0, 1.0, 1.0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
//edit #1, #2
glDrawElements(GL_TRIANGLES, 3 /*1*/, /*GL_UNSIGNED_BYTE*/ GL_UNSIGNED_INT, &indices);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
这些是正在被调用的函数。我在windows上运行,我避免发布一堆与windows相关的代码
编辑#1
修改代码以反映genpfault的建议
编辑#2
修改代码以反映Nicol Bolas的建议
评论#1
以下代码起作用(只是为了证明投影设置正确):
编辑#3
修改代码以反映Nicol Bolas的建议
更新#1
修改后的代码现在可以工作了。尽管我很好奇如何让GLDrawArray正常工作……但我的实现看起来像:
glDrawArrays(GL_TRIANGLES, 0, 0);
这在我看来似乎不对,但报告说:
模式:指定要渲染的基本体的类型。接受符号常量GL_点、GL_线带、GL_线环、GL_线、GL_三角形带、GL_三角形扇形、GL_三角形、GL_四边形带、GL_四边形和GL_多边形
第一:指定启用数组中的起始索引
计数:指定要渲染的索引数
根据Nicol Bolas所说的,因为我不需要索引,所以0,0作为参数是有意义的。对吧?
glGenBuffersARB(1, &vboId);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);
free(vertices);
glDeleteBuffersARB(1, &vboId); // wat
调用glDeleteBuffersARB()
后,指向的VBO ID无效,无法在glbindbuffersarb()
中使用
此外:
您已经将索引
定义为无符号整数
,因此应该使用GL\u无符号整数
而不是GL\u无符号字节
glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);
调用glDeleteBuffersARB()
后,指向的VBO ID无效,无法在glbindbuffersarb()
中使用
此外:
您已经将索引
定义为无符号整数
,因此应该使用GL\u无符号整数
而不是GL\u无符号字节
glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);
您可能知道,三角形由三个顶点组成。您正在发送一个(第二个参数)。你不能从一个位置画三角形
您可能知道,三角形由三个顶点组成。您正在发送一个(第二个参数)。您不能从一个位置绘制三角形。我已更新代码以反映您的建议,尽管,我仍有相同的问题。我已更新代码以反映您的建议,尽管,我仍有相同的问题。我已更新代码以反映您的建议,尽管,我仍然有同样的问题。你必须实际使用三个索引。数组中只有一个元素。另外,为什么要使用
glpaurements
?为什么不使用glDrawArrays
,这是在没有索引时使用的。就像你的代码一样。Tbh…这是因为我试图遵循以下原则:我现在将尝试使用glDrawArrays。我已经更新了我的代码以反映你的建议,不过,我仍然有同样的问题。你必须实际使用三个索引。数组中只有一个元素。另外,为什么要使用glpaurements
?为什么不使用glDrawArrays
,这是在没有索引时使用的。就像你的代码一样。Tbh…这是因为我一直试图遵循这个:我现在将尝试使用GLDrawArray。
glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);