将GL_PRIMITIVE_RESTART_FIXED_INDEX与Open GL ES 3.0一起使用

时间:2017-02-17 08:23:20

标签: java opengl-es

我试图在Open GL ES 3.0中使用三角形风扇绘制一个简单的立方体。启用GL_PRIMITIVE_RESTART_FIXED_INDEX让我定义绘制立方体所需的2个粉丝。

我得到的结果是错误(致命信号11(SIGSEGV),代码2,tid 3055中的故障地址0x74d7e390(GLThread 139))和应用程序崩溃......

为了帮助您找到错误的位置,我添加了下面使用的代码。

立方体定义:

    //             4--------7
    //            -|       -|
    //           - |      - |
    //          0--------3  |
    //          |  |     |  |
    //          |  5-----|--6
    //          | -      | -
    //          |-       |-
    //          1--------2
    // point 0
    coord[0]=-0.5f;
    coord[1]=0.5f;
    coord[2]=0.5f;
    coord[3]=1f;

    // point 1
    coord[4]=-0.5f;
    coord[5]=-0.5f;
    coord[6]=0.5f;
    coord[7]=1f;

    // point 2
    coord[8]=0.5f;
    coord[9]=-0.5f;
    coord[10]=0.5f;
    coord[11]=1f;

    // point 3
    coord[12]=0.5f;
    coord[13]=0.5f;
    coord[14]=0.5f;
    coord[15]=1f;

    // point 4
    coord[16]=-0.5f;
    coord[17]=0.5f;
    coord[18]=-0.5f;
    coord[19]=1f;

    // point 5
    coord[20]=-0.5f;
    coord[21]=-0.5f;
    coord[22]=-0.5f;
    coord[23]=1f;

    // point 6
    coord[24]=0.5f;
    coord[25]=-0.5f;
    coord[26]=-0.5f;
    coord[27]=1f;

    // point 7
    coord[28]=0.5f;
    coord[29]=0.5f;
    coord[30]=-0.5f;
    coord[31]=1f;

    drawingOrder=new short[17];

    // first triangle fan : front, top and left faces
    drawingOrder[0]=0;
    drawingOrder[1]=1;
    drawingOrder[2]=2;
    drawingOrder[3]=3;
    drawingOrder[4]=7;
    drawingOrder[5]=4;
    drawingOrder[6]=5;
    drawingOrder[7]=1;
    drawingOrder[8]=-1;

    // second triangle fan : bottom, back and right faces
    drawingOrder[9]=6;
    drawingOrder[10]=2;
    drawingOrder[11]=1;
    drawingOrder[12]=5;
    drawingOrder[13]=4;
    drawingOrder[14]=7;
    drawingOrder[15]=3;
    drawingOrder[16]=2;

绘制功能:

    public void draw(float [] transformMatrix) {
        GLES30.glUseProgram(programmeOpenGL);

        verticePositionIndex = GLES30.glGetAttribLocation(programmeOpenGL, "positionsSommets");

        GLES30.glEnableVertexAttribArray(verticePositionIndex);

        GLES30.glVertexAttribPointer(verticePositionIndex , NB_COORDINATES_PER_VERTICE, GLES30.GL_FLOAT, false, verticeMemorySize, verticesList);

        verticeColorIndex= GLES30.glGetAttribLocation(programmeOpenGL,"couleursSommets");

        GLES30.glEnableVertexAttribArray(verticeColorIndex);

        GLES30.glVertexAttribPointer(verticeColorIndex, 4, GLES30.GL_FLOAT, false, 16, colorList);

        transformMatrixIndex = GLES30.glGetUniformLocation(programmeOpenGL, "matriceTransformation");

        GLES30.glUniformMatrix4fv(transformMatrixIndex , 1, false, transformMatrix, 0);

        GLES30.glEnable(GLES30.GL_PRIMITIVE_RESTART_FIXED_INDEX);

        GLES30.glDrawElements(GLES30.GL_TRIANGLE_FAN,17,GLES30.GL_UNSIGNED_SHORT,verticesOrderList);

        GLES30.glDisable(GLES30.GL_PRIMITIVE_RESTART_FIXED_INDEX);

        GLES30.glDisableVertexAttribArray(verticePositionIndex );

        GLES30.glDisableVertexAttribArray(verticeColorIndex);
}

我可以补充说,如果我只绘制一个风扇(第一个或第二个风扇),它就会正确显示......

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

只需将等效二进制值0xFFFF(无符号65535)编码为Java short即可。对于签名的短0xFFFF = -1。当您在缓冲区中进行复制时,它将会正常工作"。