2012-07-23 66 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