顶点限制,如何加载大型模型?

时间:2015-09-05 18:44:45

标签: java android opengl-es

我正在使用顶点缓冲区:

    private FloatBuffer     vertexBuffer;

    private float   vertices[] =
                {
                        1.00f,  0.02f, -1.00f,
                        1.00f,  0.02f,  1.00f,
                        -1.00f,  0.02f,  1.00f,
                        -1.00f,  0.02f, -1.00f,
                        1.00f,  2.02f, -1.00f,
                        1.00f,  2.02f,  1.00f,
                        -1.00f,  2.02f,  1.00f,
                        -1.00f,  2.02f, -1.00f
                        ....
                        ....
                };

    private byte indices[] =
        {
                46, 0, 2,
                3, 1, 47,
                44, 2, 4,
                5, 3, 45 
                ...
        }

    ByteBuffer vbb = ByteBuffer.allocateDirect( vertices.length * 4 );
    vbb.order(ByteOrder.nativeOrder()); 
    vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(vertices);        
    vertexBuffer.position( 0 );   

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,                 GL10.GL_UNSIGNED_BYTE, indexBuffer);  

问题是当我想要定义一个超过255个顶点的模型时,我显然遇到了编译错误。为了能够定义数千个顶点的模型,我该怎么办?

我得到的错误:

错误:(609,26)错误:可能会丢失精度 必需:字节 发现:int

2 个答案:

答案 0 :(得分:1)

gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);

GL10.GL_UNSIGNED_BYTE从0到255,所以正如您所说,您无法获得更高的索引。

但您可以使用GL10.GL_UNSIGNED_SHORT(从0到65535,长度为2个字节)。

然后,使用IntBuffer代替索引。

答案 1 :(得分:1)

private byte indices[]=...

如果您需要高于255的值,请不要使用byte类型.OpenGL ES 2.0支持索引数组的8位和16位类型,因此在单个绘制调用中最多可以引用65536个不同的顶点。如果您需要更多,则需要将其拆分为多个数组。

请注意,很多设备也可能支持32位索引,但规范并不要求这样做。它由OES_element_index_uint扩展

提供