【问题标题】:FloatBuffer in Android's OpenGLAndroid OpenGL 中的 FloatBuffer
【发布时间】:2014-04-15 04:28:16
【问题描述】:

我意识到这是一个如此基本的问题,但我不知所措,因为我是 Java 新手,Android 开发新手,但有强大的 C/C++ 背景,在 OpenGL 中的工作代码符合我的要求我在这里尝试。

我采用了基本的 Cube.java 和 CubeRenderer.java 代码示例并对其进行了修改以包含二十面体的数据。我想使用浮动而不是固定,但我不知道它是否可能或如何做到。

谁能告诉我我做错了什么?它编译和启动没有错误,但只显示黑色。 Cube() 中的其他绘图算法是相同的。我尝试将 pon(正 1.0)、mon(负 1.0)、pgr(正黄金比例)、mgr(负黄金比例)的大小减小到当前值的一半。仍然显示没有渲染三角形。

我真的很茫然,如果有任何帮助,我将不胜感激。

提前谢谢你。 :-)

class Icosahedron
{
    public Icosahedron()
    {
        int one = 0x10000;
        float zro =  0.0f;
        float pon =  1.0f;
        float mon = -1.0f;
        float pgr =  1.618033989f;
        float mgr = -1.618033989f;
        float vertices[] = {
            pgr, pon, zro,
            pgr, mon, zro,
            pon, zro, pgr,
            pon, zro, mgr,
            zro, pgr, pon,
            zro, pgr, mon,
            zro, mgr, pon,
            zro, mgr, mon,
            mon, zro, pgr,
            mon, zro, mgr,
            mgr, pon, zro,
            mgr, mon, zro
        };

        int colors[] = {
              0,    0,    0,  one,
            one,    0,    0,  one,
            one,  one,    0,  one,
              0,  one,    0,  one,
              0,    0,  one,  one,
            one,    0,  one,  one,
            one,  one,  one,  one,
              0,  one,  one,  one,
              0,    0,  one,  one,
            one,    0,  one,  one,
            one,  one,  one,  one,
              0,  one,  one,  one,
              0,    0,  one,  one
        };

        byte indices[] = {
             0,  5,  4,
             0,  4,  2,
             0,  2,  1,
             0,  1,  3,
             0,  3,  5,
             1,  6,  7,
             1,  7,  3,
             1,  2,  6,
             2,  8,  6,
             2,  4,  8,
             3,  7,  9,
             3,  9,  5,
             4, 10,  8,
             4,  5, 10,
             5,  9, 10,
             6, 11,  7,
             6,  8, 11,
             7, 11,  9,
             8, 10, 11,
             9, 11, 10
        };

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

        ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
        cbb.order(ByteOrder.nativeOrder());
        mColorBuffer = cbb.asIntBuffer();
        mColorBuffer.put(colors);
        mColorBuffer.position(0);

        mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
        mIndexBuffer.put(indices);
        mIndexBuffer.position(0);
    }

    public void draw(GL10 gl)
    {
        gl.glFrontFace(GL10.GL_CW);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
        gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);
        gl.glDrawElements(GL10.GL_TRIANGLES, 20, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);
    }

    private FloatBuffer   mVertexBuffer;
    private IntBuffer     mColorBuffer;
    private ByteBuffer    mIndexBuffer;
}

【问题讨论】:

    标签: java android opengl-es


    【解决方案1】:

    我看到的唯一错误是您需要将 60 作为第二个参数传递给 glDrawElements(),而不是 20。您需要指定索引的数量,而不是三角形的数量。

    【讨论】:

    • 没错。第二个参数应该是“索引”数组的长度,即 indices.length。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多