我使用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