2012-07-23 64 views
1

假設我想在一次繪製調用中將無符號整數上傳到顯卡。我用標準維也納各組織(未VAO,我使用OpenGL 2.0),與各頂點屬性陣列組合成單個GL_ARRAY_BUFFER,並指出使用單獨glVertexAttribPointer(...),所以:VBO中的混合類型?

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId); 
    glEnableVertexAttribArray(positionAttributeId); 
    glEnableVertexAttribArray(myIntAttributeId); 
    glVertexAttribPointer(positionAttributeId, 4, GL_FLOAT, false, 0, 0); 
    glVertexAttribPointer(colorAttributeId, 4, GL_UNSIGNED_INT, false, 0, 128); 

    glClear(...); 
    glDraw*(...); 

我有這裏的問題是我的緩衝區(由vertexBufferId重新命名)必須在LWJGL中創建爲FloatBuffer,以便它可以支持GL_FLOAT類型的屬性,並且這似乎排除了在此使用GL_INT(或者,另一種方式周圍 - 它是一個或另一個,因爲緩衝區不能是兩種類型)。

任何想法?如何在本地C代碼中處理?

+0

您使用的是OpenGL還是OpenGL ES 2.0?因爲它們不是一回事。 – 2012-07-23 17:28:07

+0

@NicolBolas據我所知,我正在使用OpenGL 2.0的OpenGL ES 2.0子集。 – 2012-07-23 17:28:51

+0

OpenGL ES 2.0 *不是* OpenGL 2.0的子集。那麼你使用的是:桌面GL還是GL ES? – 2012-07-23 17:31:07

回答

2

這將會用C做這個處理(以安全的方式):

GLfloat *positions = malloc(sizeof(GLfloat) * 4 * numVertices); 
GLuint *colors = malloc(sizeof(GLuint) * 4 * numVertices); 

//Fill in data here. 

//Allocate buffer memory 
glBufferData(..., (sizeof(GLfloat) + sizeof(GLuint)) * 4 * numVertices, NULL, ...); 
//Upload arrays 
glBufferSubData(..., 0, sizeof(GLfloat) * 4 * numVertices, positions); 
glBufferSubData(..., sizeof(GLfloat) * 4 * numVertices, sizeof(GLuint) * 4 * numVertices, colors); 

free(positions); 
free(colors); 

有在做這個還有其他的方式,這涉及到很多鑄件等等。但是這段代碼模擬了你在LWJGL中必須做的事情。

+0

足夠有用;我認爲C會使用巧妙的轉換,因爲它在內存訪問方面非常靈活,但這對於LWJGL特定部分的問題完全沒有幫助。 – 2012-07-23 17:47:51

+0

它在LWJGL中如何幫助你?你不能創建一個int緩衝區,並使用'glBufferSubData'將其上傳到緩衝區的一部分?我*沒有使用C風格的轉換技巧的原因是爲了模擬你在Java中需要做什麼。 – 2012-07-23 17:55:52

+0

我想我明白了。我會試試這個。 – 2012-07-23 18:17:59