Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGl处理大量顶点_C++_Opengl_3d - Fatal编程技术网

C++ OpenGl处理大量顶点

C++ OpenGl处理大量顶点,c++,opengl,3d,C++,Opengl,3d,我有渲染模型的代码,但如果我使用了太多的顶点,我会遇到一个问题:程序无法分配足够的内存来处理所有顶点 glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3,GL_FLOAT,0,VertexArray); glNormalPointer(GL_FLOAT,0,NormalArray);

我有渲染模型的代码,但如果我使用了太多的顶点,我会遇到一个问题:程序无法分配足够的内存来处理所有顶点

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
 glVertexPointer(3,GL_FLOAT,0,VertexArray);
 glNormalPointer(GL_FLOAT,0,NormalArray);
 glColorPointer(3,GL_FLOAT,0,ColorArray);
这是我的代码,它只是它的一部分,但我想足够了。VertexArray是通过使用新运算符获得的,它是数组上的指针。但如果我使用长度数组,例如10000000个值,我会得到一个错误


有没有办法从RAM的不同部分分配内存?或者找到解决方案的任何其他方法?

如果您正在绘制第一次调用后不会经常修改的模型,您可以切换到使用并使用STATIC_DRAW标志,这很可能会告诉您的GPU将它们放入视频内存中,如果您对不需要不断更改的模型使用某些VBO,或者在CPU上随时可以访问所有顶点数据,您将拥有更多的内存空间。(即使没有,也有方法访问此顶点数据并进行更新,例如glBufferSubData,并改用“动态_绘制”标志)

VBO存储在GPU内存中,而不是存储在系统内存中,在您开始达到内存上限之前,可以为您提供更多的容量


旧的glVertexPointer方法没有这个好处。

对不起,我不明白。“VBO存储在GPU内存中,而不是系统内存中,为您提供了更大的容量”。什么?GPU内存比RAM大?这不是真的…顺便说一句,我正在写体素编辑器(3d模型编辑器),所以我的对象正在改变。不,但你不必在RAM中保留这些对象的顶点信息,你只需要存储一些关于模型在GPU上的位置的信息(VAO)。您可以生成顶点缓冲区对象(用于存储所有模型信息、顶点位置、法线、纹理坐标,每个顶点的任何内容都可以使用顶点属性指针进行描述),并且您可以使用GLDrawArray或glDrawElements调用来绘制模型,而无需调用GLVertexPoint,使用指向存储在RAM上的顶点位置数组的指针。像我引用的链接一样使用VBO和VAOs,可以节省大量内存。如果有多次绘制的重复对象(即,如果正在进行体素编辑器,则为“立方体”),还可以通过使用实例进一步减少所需的内存量。因此,您只需要在GPU内存中存储一个“立方体”对象,就可以存储它的许多实例的坐标或原点。这将为您节省大量内存,您目前必须使用这些内存来存储系统内存/RAM上的所有顶点位置。这些数组来自何处?@nicol bolas from voxel octtree。我的意思更一般地说是指它们来自哪里。让我们看看他们的声明。如果您在堆上分配它们,让我们看看这些分配。还有,你会犯什么样的错误?你在哪里犯的错误?到底是什么错误?给我们一个