我使用OpenGL缓冲区和一大堆GLfloats作为顶点缓冲区,一切都很好。 GLfloats的格式为[x1, y1, z1, x2, y2, z2, ...]
。OpenGL如何填充缓冲区并将其读回?
但随后,在遵循this tutorial,它告诉我使用glm::vec3
代替:
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
下面这段代码是有效的,我不知道怎么会OpenGL的知道如何与GLM缓冲区填满:: VEC3而不是GLfloats。那么我想知道,当我从缓冲区中读取的数据后面,使用:
std::vector<glm::vec3> data;
glGetBufferSubData(mTarget, offset, vertexCount * sizeof(glm::vec3), &data[0]);`
这样会令一堆GLM的:: VEC3?所以问题是,OpenGL如何用glm::vec3
填充缓冲区,并且(如果是的话,它是怎样)将其读回的?
太棒了!这非常有帮助。就像奖金一样,你可以将“任何东西”传递给OpenGL缓冲区吗?说一个类的实例的数组。我在猜测,当你将数据读回来时,它不是很好用,还是会呢? – fordcars
这取决于什么GL反对你_ [绑定](https://www.opengl.org/sdk/docs/man3/xhtml/glBindBuffer.xml)_来。但以我的经验,如果你要上传的顶点,你将不得不使用本教程中提到的方法(即将原料阵列或GLM :: VEC3等等...基本上,'x的连续结构,所以如果你创建了一个自定义类,它只有**'x,y,z'的定义,就像'glm'(或者一个大小为3的数组)一样,你应该好好传递一个向量,包含大量的实例 – 865719
@fordcars:好了,GL缓冲对象只是与特定大小的内存一个连续的区域所以,你可以把你喜欢的任何东西,也可以读回不过,如果你打算。使用缓冲液作为OpenGL本身输入,则需要mathc一些限制,这取决于正在使用的缓冲液的类型。顶点属性可以是某些数据类型的1至4维向量,和顶点数组需要与进行布局在连续的元素之间保持连续的不断变化,把对象的实例放在那里可能会起作用,但是你可能会浪费一些内存。 – derhass