gpt4 book ai didi

c++ - OpenGL Basic IBO/VBO 不工作

转载 作者:行者123 更新时间:2023-11-28 08:10:28 24 4
gpt4 key购买 nike

我一直在关注列出的教程 here .

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

我的问题是当我绘制时没有任何显示。我不确定我做错了什么。我的着色器工作正常,我在没有使用 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();
}

我没有执行任何 View 转换,当我使用更基本的绘制方法时,一切都在镜头前显示得很好。我确实认为这与我声明这些缓冲区的方式有关。

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

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

最佳答案

添加实际答案。

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

关于c++ - OpenGL Basic IBO/VBO 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com