OpenGL VBO每个顶点具有单个浮点问题

问题描述 投票:1回答:1

我昨天整天都被这个问题困住了,无法解决。下面是代码,但通常我想为1.Postions 2.Indices 3.Normals和4.单个float值提供网格顶点属性。这些值全部存储在不同的VBO中,并且在绑定每个vbo之后,我声明vertexAttribPointer。我不能同时使用法线和浮点值。我所看到的好像浮点值的位置是前一个vbo中法线vec3的x y或z部分。

GL4 gl = GLContext.getCurrentGL().getGL4();

int[] vaoids = new int[1];
gl.glGenVertexArrays(1,vaoids,0);

int[] vboids = new int[4];
gl.glGenBuffers(4,vboids,0);

gl.glBindVertexArray(vaoids[0]);

FloatBuffer verticesBuffer = FloatBuffer.allocate(mesh.vertices.length);
verticesBuffer.put(mesh.vertices);
verticesBuffer.flip();

gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboids[0]);
gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.vertices.length * 4 ,verticesBuffer,gl.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(0);
gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, false, 0, 0);
verticesBuffer.clear();
verticesBuffer = null;

//normal buffer
FloatBuffer normalBuffer = FloatBuffer.allocate(mesh.normals.length);
normalBuffer.put(mesh.normals);
normalBuffer.flip();

gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboids[2]);
gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.normals.length * 4 ,normalBuffer,gl.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(2);
gl.glVertexAttribPointer(2, 3, gl.GL_FLOAT, false, 0, 0);
normalBuffer.clear();
normalBuffer = null;


//color buffer
float[] colors = new float[mesh.vertices.length/3];
Arrays.fill(colors,255.0f);
FloatBuffer colorBuffer = FloatBuffer.allocate(colors.length);
colorBuffer.put(colors);
colorBuffer.flip();

gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboids[3]);
gl.glBufferData(gl.GL_ARRAY_BUFFER, colors.length * 4 ,colorBuffer,gl.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(3);
gl.glVertexAttribPointer(3, 1, gl.GL_FLOAT,false, 0, 0);
colorBuffer.clear();
colorBuffer = null;

IntBuffer indicesBuffer = IntBuffer.allocate(mesh.indices.length);
indicesBuffer.put(mesh.indices);
indicesBuffer.flip();

gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, vboids[1]);
gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, mesh.indices.length * 4 ,indicesBuffer,gl.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(1);
gl.glVertexAttribPointer(1, mesh.type.equals(MeshType.TRIANGLE) ? 3 : mesh.type.equals(MeshType.LINE) ? 2 : mesh.type.equals(MeshType.POINT) ? 1:0, gl.GL_UNSIGNED_INT, false, 0, 0);
indicesBuffer.clear();
indicesBuffer = null;

//gl.glBindBuffer(gl.GL_ARRAY_BUFFER,0);
gl.glBindVertexArray(0);

此代码声明了vao和vbos。我使用glDrawElements进行渲染,并在此之前启用所需的VertexAttributeArray索引。在我的着色器中,按如下方式访问值:

layout (location=0) in vec3 position;
layout (location=2) in vec3 normal;
layout (location=3) in float color;

out vec3 normals;
out vec4 positionWorldSpace;
out flat float vertexColor;

和片段着色器

in flat float color;

我可以让它们两个都分开工作,但是如果我都声明它们,则float值不再正确。但是法线似乎是正确的。正如我所说的,浮动中的值似乎是来自法线的值。从正常vbo到浮动vbo会发生某种溢出吗?在看了几个小时的代码后,我无法发现错误。

java opengl vbo vao vertex-array-object
1个回答
1
投票

索引不是属性。 [Index buffer](索引缓冲区)(GL_ELEMENT_ARRAY_BUFFER)直接在VAO中声明。参见Vertex Specification。当您使用glDrawArrays时,数组中顶点坐标的顺序顶点坐标将定义glDrawArrays。如果要使用不同的顺序或要为不同的图元使用顶点,则必须使用primitives。当使用glDrawElements时,图元由glDrawElements缓冲区中的顶点索引定义:

glDrawElements
GL_ELEMENT_ARRAY_BUFFER
© www.soinside.com 2019 - 2024. All rights reserved.