Java OpenGL VBO-数组步长错误?

Java OpenGL VBO-数组步长错误?,java,android,arrays,opengl-es-2.0,vbo,Java,Android,Arrays,Opengl Es 2.0,Vbo,现在我希望你能帮我解决这个问题,我已经有好几天没有找到任何解决办法了。我觉得,我已经尝试了所有方法来解决这个问题,但是没有一个奏效 首先: 我的场景中有一些使用VBOs进行渲染的对象。没有其他东西,没有其他四边形、多边形等。只有屏幕截图中的那些,后面会出现 我的VBOs生成代码非常简单,希望能够清晰易懂: 生成VBO public boolean buffer() { FloatBuffer[] vertexBuffer = new FloatBuffer[1]; vertexB

现在我希望你能帮我解决这个问题,我已经有好几天没有找到任何解决办法了。我觉得,我已经尝试了所有方法来解决这个问题,但是没有一个奏效

首先: 我的场景中有一些使用VBOs进行渲染的对象。没有其他东西,没有其他四边形、多边形等。只有屏幕截图中的那些,后面会出现

我的VBOs生成代码非常简单,希望能够清晰易懂:

生成VBO

public boolean buffer() {
    FloatBuffer[] vertexBuffer = new FloatBuffer[1];
    vertexBuffer[0] = FloatBufferFactory.create(this.triangles.size() * 3 * 11);

    for (Triangle triangle : this.triangles) {
        for (int i = 0; i < 3; i++) {
            vertexBuffer[0].put(triangle.vertex[i].position.x);
            vertexBuffer[0].put(triangle.vertex[i].position.y);
            vertexBuffer[0].put(triangle.vertex[i].position.z);

            vertexBuffer[0].put(triangle.vertex[i].normal.x);
            vertexBuffer[0].put(triangle.vertex[i].normal.y);
            vertexBuffer[0].put(triangle.vertex[i].normal.z);

            vertexBuffer[0].put(triangle.vertex[i].color.r);
            vertexBuffer[0].put(triangle.vertex[i].color.g);
            vertexBuffer[0].put(triangle.vertex[i].color.b);

            vertexBuffer[0].put(triangle.vertex[i].uvset.x);
            vertexBuffer[0].put(triangle.vertex[i].uvset.y);
        }
    }

    vertexBuffer[0].position(0);

    GLES20.glGenBuffers(1, this.buffer, 0);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.buffer[0]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuffer[0].capacity() * 4, vertexBuffer[0], GLES20.GL_STATIC_DRAW);

    return true;
}
现在,按照我的理解,我的逻辑是: 一个顶点的所有字节数据是:12字节(位置)+12字节(正常)+12字节(颜色)+8字节(uv)->总之:每个顶点44字节,因此下一个顶点应该在44字节之后。->步幅:每个数据44字节

下一个想法是设置起始偏移量:0字节用于位置,12字节用于正常,24字节用于颜色,36字节用于uv。 到目前为止还不错

主要问题

现在节目中似乎发生了一些非常非常奇怪的事情。创建3个以上的对象后,在前三个对象之后生成的对象显示错误

以下是截图: 第一个示例并尝试(生成:一行5个圆环):

第二次尝试(生成2个球体、1个圆环、另一个球体、另一个圆环):

如您所见,在第一张图片中,4。五,。圆环(Tori?!)是扭曲的,看起来像豆子或透镜之类的东西。 在第二张图片中,3。球体(4.生成的对象)看起来很正常,当你只看位置时,但是纹理坐标非常奇怪

那为什么呢?我怎样才能解决这个问题


谢谢!:)

我认为这是由于您启用attrib指针的方式

你写了这个:

GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0]);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 12);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 24);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 36);
应该是这样的:

GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, 0);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, 12);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, 24);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, 36);
无论如何,我建议为偏移量计算定义一些常量


在我的C引擎中,我使用sizeof函数基于所有内容,这似乎是答案,因为当VBO被绑定时,
glvertexattributepointer
的最后一个参数是当前绑定缓冲区的字节偏移量,从0开始。@chrise:嘿,我们在两个;-)我第一次接触这个话题时犯了同样的错误;-)很高兴能帮上忙。@MaurizioBenedetti,感觉不错,伙计;)我们都不会再犯同样的错误了D
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, 0);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, 12);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, 24);
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, 36);