gpt4 book ai didi

C++ 顶点缓冲区问题

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

我正在尝试将顶点缓冲区添加到 pixel city 的 Mesh.cpp 文件中程序性城市生成程序。当前代码的一部分如下所示:

for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) {
glBegin (GL_QUAD_STRIP);
for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) {
glTexCoord2fv (&_vertex[*n].uv.x);
glVertex3fv (&_vertex[*n].position.x);
}
glEnd ();
}

这会将纹理绘制到某些建筑物的矩形边上。刚刚结束我在网上找到的 VBO 教程,我尝试将其转换为使用像这样的顶点缓冲区(我将 vboId 存储在 Mesh.h 中):

for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) {
void * varray = (char *) malloc(sizeof(GLfloat)*5*qsi->index_list.size());
GLfloat *p = (GLfloat*)varray;

int counter = 0;
for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) {
memcpy(&p[counter+0],&_vertex[*n].uv.x, sizeof(GLfloat)*2);
memcpy(&p[counter+2],&_vertex[*n].position.x, sizeof(GLfloat)*3);
counter+=5;
}
glGenBuffersARB(1, &vboId);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat)*5*qsi->index_list.size(), p, GL_STATIC_DRAW_ARB);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*5, (GLfloat*)0);
glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5, (GLfloat*)2);

glDrawArrays(GL_QUAD_STRIP, 0, qsi->index_list.size());

glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

free(varray);
}

但是,这段代码根本不起作用。没有渲染。有时,当我将参数弄乱到 glTexCoordPointer 或 glVertexPointer 中时,我确实扭曲了/垃圾了屏幕上绘制的数据(或程序崩溃),但没有什么比远程工作更接近了。

最佳答案

你的顶点指针是错误的。使用 VBO 时,指针被解释为相对于当前绑定(bind)缓冲区的字节偏移量。因此,您需要 sizeof(GLfloat)*2 字节作为偏移量。

glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5,  (char*)0 +sizeof(GLfloat)*2);

作为旁注:如果您创建具有正确大小但 NULL 作为数据指针(基本上创建数据存储)和内存映射的 VBO,则可以保存额外的数据拷贝它与 glMapBuffer() 一起使用,完全避免了您使用的 malloc()ed 临时缓冲区。

关于C++ 顶点缓冲区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510662/

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