【问题标题】:A simple Vertex Buffer Object (C++) that doesnt render一个不渲染的简单顶点缓冲区对象 (C++)
【发布时间】:2012-10-26 02:55:46
【问题描述】:

我尝试使用 VBO 将普通的 2d 纹理正方形渲染到 FBO 上。即时模式功能完美无缺,但不是这个 VBO。代码已启用 GL_TEXTURE_2D。它有什么问题?

unsigned int VBOid = 0;
unsigned int Iid = 0;

float *geometry;
unsigned int *indices;

int num_geometry = 1;
int num_vertices = 4;
int num_indices = num_geometry*num_vertices;
geometry = new float[num_geometry*num_vertices*4];
indices = new unsigned int[num_indices];

indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 3;

/* Fill geometry: 0, 1, = vertex_xy
*                2, 3 = tex_coord_uv
*/
geometry[0] = 0.0f;
geometry[1] = 0.0f;
geometry[2] = 0.0f;
geometry[3] = 0.0f;

geometry[4] = 50.0f;
geometry[5] = 0.0f;
geometry[6] = 1.0f;
geometry[7] = 0.0f;

geometry[8] = 50.0f;
geometry[9] = 50.0f;
geometry[10] = 1.0f;
geometry[11] = 1.0f;

geometry[12] = 0.0f;
geometry[13] = 50.0f;
geometry[14] = 0.0f;
geometry[15] = 1.0f;

glGenBuffers(1, &VBOid);
glBindBuffer(GL_ARRAY_BUFFER, VBOid);
glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), geometry, GL_STATIC_DRAW);

glGenBuffers(1, &Iid);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Iid);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

//GL_TEXTURE_2D is already enabled here
//Buffers are already bound from above

glBindTexture( GL_TEXTURE_2D, 2); //I used 2 just to test to see if it is rendering a texture correctly. Yes, 2 does exist in my program thats why i arbitrarily used it
//glClientActiveTexture(GL_TEXTURE0); I dont know what this is for and where to put it

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glActiveTexture(GL_TEXTURE0); same here I dont know what this is for or where to put it
glVertexPointer(2, GL_FLOAT, sizeof(GLfloat)*4, 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*4, (float*)(sizeof(GLfloat)*2));

glDrawElements(GL_QUADS, num_indices, GL_UNSIGNED_INT, indices);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

【问题讨论】:

  • sizeof(geometry) as buffer size in glBufferData 是我能看到的第一个明显错误。这将始终返回指针(4) 的大小。另外,为什么将一些 z 值设置为 0,而将一些 z 值设置为 1?你真的应该让你的调试器运行并逐行验证你发送给 GL 的内容......
  • 这些是纹理 UV 坐标。语法是每个 xy 2 UV
  • @user1775989 你真的阅读了他评论的第一部分(这正是你的问题,如我的回答所示)还是只阅读了他不相关的第二部分?

标签: object opengl buffer vbo vertex


【解决方案1】:

问题是您在glBufferData 调用中使用了sizeof(geometry)indices 也是如此)。这些变量实际上只是指针,无论它们是否指向动态分配的数组(编译器不知道)。因此,您将始终获得指针的大小(4 或 8 个字节,具体取决于平台)。

sizeof(geometry) 替换为num_geometry*num_vertices*4*sizeof(float),将sizeof(indices) 替换为num_indices*sizeof(unsigned int)。好吧,实际上您根本不需要任何索引,只需简单地绘制整个事物即可

glDrawArrays(GL_QUADS, 0, 4);

始终注意实际(编译时大小)数组和指向动态分配数组的指针之间的区别,sizeof 运算符的结果是其中的一个差异(以及在稍后某个时间点使用 delete[] 释放后者内存的要求是另一个但同样重要的差异)。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多