gpt4 book ai didi

C++ VBO 渲染问题

转载 作者:行者123 更新时间:2023-11-30 05:28:32 25 4
gpt4 key购买 nike

此代码工作正常,呈现正确(没有发布所有相关代码,因为我认为这些部分有问题):

std::vector<GLuint> vboId;
std::vector< std::vector<GLfloat> > verts;

...初始化:

verts[num].push_back(x);
verts[num].push_back(y);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y + TILE_SIZE);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset + zsize);

verts[num].push_back(x);
verts[num].push_back(y + TILE_SIZE);
//verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset + zsize);
...
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]);
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW);

...渲染:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]);

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*2));
glVertexPointer(2,GL_FLOAT,sizeof(verts[num]),0);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, verts[num].size());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

但是当我尝试通过修改代码来添加 Z 值时,一切都变得一团糟:

...初始化

verts[num].push_back(x);
verts[num].push_back(y);
verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y);
verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset);

verts[num].push_back(x + TILE_SIZE);
verts[num].push_back(y + TILE_SIZE);
verts[num].push_back(0);
// texture offset
verts[num].push_back(1);
verts[num].push_back(offset + zsize);

verts[num].push_back(x);
verts[num].push_back(y + TILE_SIZE);
verts[num].push_back(0);
// texture offset
verts[num].push_back(0);
verts[num].push_back(offset + zsize);
...
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]);
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW);

...渲染:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]);

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*3));
glVertexPointer(3,GL_FLOAT,sizeof(verts[num]),0);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, verts[num].size());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

有人可以解释我在这里做错了什么吗?为什么第一个代码有效,而最后一个代码无效?

最佳答案

我想我解决了它..这段代码呈现它应该的样子:

glTexCoordPointer(2,GL_FLOAT,sizeof(GLfloat) * 5,(void*)(sizeof(GLfloat) * 3));
glVertexPointer(3,GL_FLOAT,sizeof(GLfloat) * 5,(void*)0);
...
glDrawArrays(GL_QUADS, 0, verts[num].size() / 5);

但我不确定它是否真的正确,我没有看到任何人工制品,但也不知道幕后发生了什么......感谢您的帮助,如果有人可以确认代码是否正确,请执行

但我这里理解的是,glTexCoordPointer(* 5, * 3)从第三个数组索引(第一个纹理坐标)开始,每次向前增加5(索引* 5)个元素。 glVertexPointer(* 5, 0) 从数组索引 0 开始,每次也增加 5。因此:

verts[num].push_back(x); // index 0
verts[num].push_back(y); // index 1
verts[num].push_back(0); // index 2
// texture offset
verts[num].push_back(0); // index 3
verts[num].push_back(offset); // index 4

我可以回来添加更多内容嘿 http://i.imgur.com/Iemih6d.png

关于C++ VBO 渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782999/

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