gpt4 book ai didi

c++ - 在 glVertexPointer OpenGL 函数中使用 C++ std::Vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:29 24 4
gpt4 key购买 nike

我有一个浮点 vector ,这个 vector 描述了一组三角形,每个三角形使用 18 个 float 来描述,前 3 个是第一个顶点,接下来的 3 个描述最后一个顶点的法线,依此类推 3 次直到描述每个三角形。

我正在使用

std::vector< GLfloat >

存储所有数字,这是我渲染三角形的代码

void Visualizer::draw3dModel()
{
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data() + 3);
glVertexPointer(3, GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data());

glPushMatrix();

glScalef(0.05f, 0.05f, 0.05f);
glColor3f(1,1,1);

glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size());

glPopMatrix();

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}

这段代码确实有效,但在某些时候我用新的三角形重新创建了浮点 vector ,它可以或多或少是三角形

在创建新三角形之前,我使用这个函数清除了顶点 vector

std::vector< GLfloat >* MarchingCubesThread::getTriangles(float minvalue_scale)
{
this->generateTriangles(minvalue_scale);

for(unsigned int i=0; i < this->num_triangles; i++)
{
for(int j=0; j < 3; j++)
{
this->vertexes.push_back(this->triangles[i].p[j].x);
this->vertexes.push_back(this->triangles[i].p[j].y);
this->vertexes.push_back(this->triangles[i].p[j].z);

this->vertexes.push_back(this->triangles[i].norm.x);
this->vertexes.push_back(this->triangles[i].norm.y);
this->vertexes.push_back(this->triangles[i].norm.z);
}
}

return &(this->vertexes);
}

void MarchingCubesThread::generateTriangles(float minvalue_scale)
{
this->vertexes.clear();
this->triangles.clear();

this->triangles = MarchingCubesDataset(this->dataset->getMaxVal() * minvalue_scale, *(this->dataset), LinearInterp, this->num_triangles);
}

尝试创建一组新的新三角形后,OpenGL 渲染器可以很好地更新网格,但在某些时刻,我会得到一些垃圾三角形和/或来自上次迭代的三角形,它们应该通过调用清除这个:

this->vertexes.clear();
this->triangles.clear();

这里是连续截取的一些截图:

original surface after creating new triangles, shows some triangles from past surface the same effect here

关于这里发生了什么的任何线索?,谢谢

PD:对于完整的源代码,这是 github 上的公共(public) git 存储库: https://github.com/joecabezas/MemoriaJoeCabezasCode/tree/visualizer

最佳答案

glDrawArrays 期望的不是缓冲区中的 float ,而是顶点数。所以正确的调用应该是:

glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size() / 6);

通过让 glDrawArrays 绘制 6 倍以上的顶点,您在有效 vector 数据结束后显示垃圾,有时它是来自上一次迭代的数据。

关于c++ - 在 glVertexPointer OpenGL 函数中使用 C++ std::Vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11338561/

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