OpenGL 基本 IBO/VBO 不工作

发布于 2025-01-04 17:33:51 字数 3342 浏览 2 评论 0原文

我一直在关注列出的教程 这里

我想使用索引缓冲区对象、顶点缓冲区对象、我自己的顶点和片段着色器以及我自己的顶点结构来绘制单个三角形。

我的问题是当我绘图时什么也没有显示。我不确定我做错了什么。我的着色器工作正常,我在没有使用 ibo/vbo 的情况下测试了它们,它们很好。

这是我的代码:

GLuint  vao[1], vbo_vertex[1], index_buffer[1];

typedef struct{
    GLfloat x,y,z;      // Vertex.
    GLfloat r,g,b;  // Colors.
} spicyVertex;

void initializeBuffers(){

    spicyVertex* simple_triangle = new spicyVertex[3];
    // V0 - bottom
    simple_triangle[0].x = 0.0f;
    simple_triangle[0].y = -0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V1 - top right
    simple_triangle[0].x = 0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V2 - top left
    simple_triangle[0].x = -0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // Setup the vertex buffer data.
    glGenBuffers(1, &vbo_vertex[0]);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW);


    // Index setup
    GLushort *indices = new GLushort[3];
    indices[0]=0;
    indices[1]=1;
    indices[2]=2;
    glGenBuffers(1, &index_buffer[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW);

    // By this point all of our data should be on the graphics device.


    // VAO setup.
    glGenVertexArrays(1, &vao[0]);
    glBindVertexArray(vao[0]);

    // Bind the vertex buffer and setup pointers for the VAO.
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(3);

    // Bind the index buffeer for the VAO.
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);

    // Cleanup.
    delete [] simple_triangle;
    delete [] indices;
    glBindVertexArray(0);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
}

void Draw_indexed_Vao(){
    glBindVertexArray(vao[0]);      // select first VAO
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL);
    glBindVertexArray(0);
}

static void display(void){
    glUseProgramObjectARB( programObj );

    Draw_indexed_Vao();
}

当我使用更基本的方法绘制所有内容时,我没有执行任何视图转换,所有内容都很好地显示在相机前面。我确实认为这与我声明这些缓冲区的方式有关。

编辑1:该应用程序是双缓冲的。

编辑2:已解决。 3 个顶点 V0、V1 和 V2 都修改同一个数组元素。例如,我没有使用 simple_triangle[0]simple_triangle[1]simple_triangle[2],但我只是在工作与simple_triangle[0]。再次感谢您发现我的愚蠢错误。

I've been following the tutorial listed here.

I want to draw a single triangle using an Index Buffer Object, a Vertex Buffer Object, my own Vertex and Fragment Shader, and my own vertex structure.

My problem is that nothing shows up when I draw. I'm not sure what i'm doing wrong. My shaders work fine, I've tested them without the use of ibo/vbo's and they are fine.

Here is my code:

GLuint  vao[1], vbo_vertex[1], index_buffer[1];

typedef struct{
    GLfloat x,y,z;      // Vertex.
    GLfloat r,g,b;  // Colors.
} spicyVertex;

void initializeBuffers(){

    spicyVertex* simple_triangle = new spicyVertex[3];
    // V0 - bottom
    simple_triangle[0].x = 0.0f;
    simple_triangle[0].y = -0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V1 - top right
    simple_triangle[0].x = 0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V2 - top left
    simple_triangle[0].x = -0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // Setup the vertex buffer data.
    glGenBuffers(1, &vbo_vertex[0]);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW);


    // Index setup
    GLushort *indices = new GLushort[3];
    indices[0]=0;
    indices[1]=1;
    indices[2]=2;
    glGenBuffers(1, &index_buffer[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW);

    // By this point all of our data should be on the graphics device.


    // VAO setup.
    glGenVertexArrays(1, &vao[0]);
    glBindVertexArray(vao[0]);

    // Bind the vertex buffer and setup pointers for the VAO.
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(3);

    // Bind the index buffeer for the VAO.
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);

    // Cleanup.
    delete [] simple_triangle;
    delete [] indices;
    glBindVertexArray(0);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
}

void Draw_indexed_Vao(){
    glBindVertexArray(vao[0]);      // select first VAO
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL);
    glBindVertexArray(0);
}

static void display(void){
    glUseProgramObjectARB( programObj );

    Draw_indexed_Vao();
}

I'm not performing any view transformations, when I use more basic means of drawing everything shows up just fine right in front of the camera. I really do think it's something about the way I'm declaring these buffers.

EDIT 1: The application is double buffered.

EDIT 2: SOLVED. The 3 vertices V0, V1 and V2 were all modifying the same array element. As in, I wasn't using simple_triangle[0],simple_triangle[1], simple_triangle[2], but that I was only working with simple_triangle[0]. Thank you again for catching my silly error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

难得心□动 2025-01-11 17:33:51

添加实际答案。

V1 和 V2 都在修改 simple_triangle[0],因此只有一个顶点。

Adding an actual answer.

V1 and V2 are both modifying simple_triangle[0] so there is only ever one vertex.

浅忆 2025-01-11 17:33:51

您可能需要调用 glFlush() 才能将绘制的缓冲区内容推送到屏幕上。另外,根据您是否使用双缓冲,所需的调用可能是 glutSwapBuffers() (如果您使用的是 GLUT)或其他一些交换调用。

You might need to call glFlush() in order to push the contents of the buffers you've drawn to onto the screen. Also, depending on whether you're using double buffering, the call required may be glutSwapBuffers() (if you're using GLUT) or some other swap call.

深海不蓝 2025-01-11 17:33:51

您可能想更改

' glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

'glColorAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

但我不是100%确定。

You might wanna change

' glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

to

'glColorAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

But I'm not 100% sure.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文