gpt4 book ai didi

c++ - VBO 照明和索引

转载 作者:行者123 更新时间:2023-11-30 04:23:17 26 4
gpt4 key购买 nike

现在我正在使用索引,所以我在让我的 VBO 正确渲染法线时遇到了一些麻烦。我很确定我对普通指针的偏移有问题,但数学似乎加起来对我来说是正确的。

我如何存储数据:

struct MyVertex
{
float x, y, z; //Vertex
float nx, ny, nz; //Normal
};

下面是我如何设置 VBO:

GLuint VertexVBOID, IndexVBOID;
glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*NumOfV, &ModelV[0].x, GL_STATIC_DRAW);

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*NumOfF*3, &ModelI[0], GL_STATIC_DRAW);

我的渲染代码:

if(UsingVBO == false)
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);
glBegin(GL_TRIANGLES);
for(int i = 0; i < NumOfF*3; i+=3)
{
glNormal3f(ModelV[ModelI[i]].nx, ModelV[ModelI[i]].ny, ModelV[ModelI[i]].nz);
glVertex3f(ModelV[ModelI[i]].x, ModelV[ModelI[i]].y, ModelV[ModelI[i]].z);

glNormal3f(ModelV[ModelI[i+1]].nx, ModelV[ModelI[i+1]].ny, ModelV[ModelI[i+1]].nz);
glVertex3f(ModelV[ModelI[i+1]].x, ModelV[ModelI[i+1]].y, ModelV[ModelI[i+1]].z);

glNormal3f(ModelV[ModelI[i+2]].nx, ModelV[ModelI[i+2]].ny, ModelV[ModelI[i+2]].nz);
glVertex3f(ModelV[ModelI[i+2]].x, ModelV[ModelI[i+2]].y, ModelV[ModelI[i+2]].z);
}
glEnd();
}
else
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), 0);
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float
glDrawElements(GL_TRIANGLES, NumOfF*3, GL_UNSIGNED_INT, 0);//number of indices

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}

没有 VBO 的渲染:

Pic1

使用 VBO 渲染:

Pic2

最佳答案

glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float

你的 offset is wrong这里。您正在提供交错的顶点数据,因此前三个 float 是您的位置,接下来的三个 float 是法线。因此,法线的基本偏移量是 3 个字节的 float (跳过该位置)。 NumOfV整个模型中的顶点数,而不是MyVertex 数据结构中位置的 float 。

这最好用 the offsetof macro 完成:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, x));
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, nx));

关于c++ - VBO 照明和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424668/

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