假设我想在一次绘制调用中将无符号整数和浮点数据上传到图形卡。我使用标准的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>
答案 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中必须做的事情。