VBO的混合类型?

时间:2012-07-23 17:25:53

标签: opengl types lwjgl vbo

假设我想在一次绘制调用中将无符号整数浮点数据上传到图形卡。我使用标准的VBO(不是VAO,我使用的是OpenGL 2.0),各种顶点属性数组合成单GL_ARRAY_BUFFER,并使用glVertexAttribPointer(...)单独指向,所以:

    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,以便它可以支持{{1}类型的属性这似乎排除了在这里使用GL_FLOAT(或者反过来说 - 它是一个或另一个,因为缓冲区不能是两种类型)。

有什么想法吗?如何在本机C代码中处理它?<​​/ p>

1 个答案:

答案 0 :(得分: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中必须做的事情。