2017-03-17 96 views
0

我正在調查OpenGL Android deqp測試套裝並與其中一個案例混淆。測試是dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_binding_point。 可以找到來源here,感興趣的線是1197-1213。我不知道,這是一個竅門。ARB_vertex_attrib_binding測試案例瞭解

 const int maxUsedLocation = de::max(positionLoc, colorLoc); 
     const int bindingPoint1  = maxUsedLocation + 1; 
     const int bindingPoint2  = maxUsedLocation + 2; 
     // bind data using old api 
     gl.glBindBuffer(GL_ARRAY_BUFFER, m_buffer); 
     gl.glVertexAttribPointer(bindingPoint1, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(2 * sizeof(tcu::Vec4)), (const deUint8*)DE_NULL); 
     gl.glVertexAttribPointer(bindingPoint2, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(2 * sizeof(tcu::Vec4)), (const deUint8*)DE_NULL + sizeof(tcu::Vec4)); 
     // change buffer binding point with vertex_attrib_binding 
     gl.glVertexAttribFormat(positionLoc, 4, GL_FLOAT, GL_FALSE, 0); 
     gl.glVertexAttribFormat(colorLoc, 4, GL_FLOAT, GL_FALSE, 0); 
     gl.glVertexAttribBinding(positionLoc, bindingPoint1); 
     gl.glVertexAttribBinding(colorLoc, bindingPoint2); 

首先,bindingPoint1bindingPoint2以一種奇怪的方式(在着色器最大數量的頂點位置的增量)被初始化。然後它被用作glVertexAttribPointer中的頂點屬性位置(?)。之後,它用作glVertexAttribBinding中的頂點緩衝區綁定點。最後,沒有glBindVertexBuffer調用,哪個緩衝區bindingPoint1bindingPoint2被綁定?我試圖瞭解ARB_vertex_attrib_binding擴展,但我仍然不明白這段代碼。

對我來說,似乎glVertexAttribPointer是不正確的,因爲不正確的頂點attrib位置和glVertexAttribBinding是不正確的,因爲沒有頂點綁定點綁定到頂點緩衝區。 有人可以解釋我,這是怎麼回事?

回答

2

您正在閱讀的是一個測試,用於驗證OpenGL驅動程序是否正確實現了該功能。這是並不意味着是合理代碼的一個例子。它基本上是測試一個角落案例,一個明智的代碼通常不會觸發。

Vertex attrib binding有效地重新定義了glVertexAttribPointerspecifying that it now works by using glVertexAttribFormat/etc internally的含義。此測試旨在驗證驅動程序是否正確實施重新定義的glVertexAttribPointer

同樣,你不應該寫這樣混合兩者的代碼。但是規範允許它,所以好的測試人員應該驗證實現是否在做它的工作。

所以兩次調用glVertexAttribPointer切實做到以下幾點:

glVertexAttribFormat(bindingPoint1, ..., 0); 
glBindVertexBuffer(bindingPoint1, m_buffer, 0, (glw::GLsizei)(2 * sizeof(tcu::Vec4))); 
glVertexAttribBinding(bindingPoint1, bindingPoint1); 

glVertexAttribFormat(bindingPoint2, ..., 0); 
glBindVertexBuffer(bindingPoint2, m_buffer, sizeof(tcu::Vec4), (glw::GLsizei)(2 * sizeof(tcu::Vec4))); 
glVertexAttribBinding(bindingPoint2, bindingPoint2); 

所以這設置了兩個屬性以及兩個緩衝綁定。但着色器從未實際使用這些屬性。

後來的代碼設置了兩個屬性,但這:

gl.glVertexAttribBinding(positionLoc, bindingPoint1); 
    gl.glVertexAttribBinding(colorLoc, bindingPoint2); 

意味着他們獲得的屬性從先前建立的綁定點得到他們的頂點數據。因此,VS的兩個屬性實際上是使用從緩衝區綁定點bindingPoint1bindingPoint2獲得其緩衝區數據。另外兩個屬性,也從相同的綁定點獲取它們的數據,不被VS使用,因此是不相關的。

現在讓我再次強調,在實際的代碼中,你應該永遠不要這樣做。選擇一種API風格並堅持下去。否則,請在相同的VAO中選擇一種API風格。