Java Opengl使用1个缓冲区存储所有顶点数据
我用所有顶点数据(位置、纹理坐标、法线)创建了1个浮点缓冲区和1个vbo,它们存储如下:Java Opengl使用1个缓冲区存储所有顶点数据,java,lwjgl,Java,Lwjgl,我用所有顶点数据(位置、纹理坐标、法线)创建了1个浮点缓冲区和1个vbo,它们存储如下: bf.put(vertices[i].position.x); bf.put(vertices[i].position.y); bf.put(vertices[i].position.z); bf.put(vertices[i].texCoords.x); bf.put(vertices[
bf.put(vertices[i].position.x);
bf.put(vertices[i].position.y);
bf.put(vertices[i].position.z);
bf.put(vertices[i].texCoords.x);
bf.put(vertices[i].texCoords.y);
bf.put(vertices[i].normals.x);
bf.put(vertices[i].normals.y);
bf.put(vertices[i].normals.z);
如何使用GLVertexAttribute指针将它们传递到着色器
是否可以执行以下操作:
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(/*arguments for sending position*/);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(/*arguments for sending texture coordinates*/);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(/*arguments for sending normals*/);
?
如果是,请帮助我理解glvertexattributepointer以及我应该输入的参数。您用于属性的数据排列通常称为“交错”,实际上是在VBO中存储多个属性的推荐方式。它支持本地数据访问,因为顶点的所有属性在内存中都相邻,这反过来又会导致高速缓存命中率高 让我们看看
glvertexattributepointer()
的签名,然后更详细地解释参数。我有意不抄袭文档中的解释,希望其他措辞能帮助您更好地理解它们。在LWJGL中,其定义为:
static void glVertexAttribPointer(
int index, int size, int type, boolean normalized,
int stride, long pointerOffset)
:顶点着色器中顶点属性的位置,如使用index
指定的,通过glBindAttribLocation()
获取,或在着色器代码中使用glGetAttribLocation()
布局限定符指定的位置
:属性中的组件数。例如,3个用于具有3个坐标的位置,2个用于具有2个组件的纹理坐标,等等size
:属性的类型。主要是类型
GL\u FLOAT
:浮点属性不重要,如果您开始使用整型属性,请仔细阅读normalized
:后续顶点之间的间距(以字节为单位)。除非顶点之间有填充(这是相当罕见的),否则这与顶点的大小(以字节为单位)相同stride
:由于历史原因,它的名称中有“pointer”,但实际上是属性第一次出现时相对于缓冲区开始的字节偏移量。在交错排列中,这对应于顶点内属性的偏移量(以字节为单位)pointerOffset
stride
将是32,因为每个顶点由8个浮点组件组成,每个浮点组件有4个字节
第一个属性的pointerOffset
为0,其余所有属性的相对字节偏移量均为0,剩余两个属性的偏移量分别为12和20
这就需要调用您的示例:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * 4, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 8 * 4, 3 * 4);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8 * 4, (3 + 2) * 4);
有关参数,请参见“我已经阅读了文档,但无法使用vbo使其工作”,我需要一个示例。