1

頂点インデックスを使用してメッシュをレンダリングしています。頂点インデックスと頂点位置を渡すのに問題はありません。

しかし、テクスチャ座標の場合、インデックスを使用してそれらを渡す必要がありますか?

編集: OBJファイルを渡してレンダリングしようとしていますが、「fx / y/z」で説明されているテクスチャ座標の処理方法について混乱しています。

たとえば、立方体の場合、頂点座標を渡します。

*8頂点座標

* 36頂点インデックス:

テクスチャ(または法線)を渡すときは、次のように渡す必要があります。

* (8テクスチャ座標+ 36テクスチャ座標インデックス)。もしそうなら、レンダリング中にそれらを割り当てる方法は?

また

* (36テクスチャ座標)

これは私の抽象メッシュクラスです、

public class AbstractMesh3D {
    //private int buffers[]={0,0};
    private int vbVertices[]=new int[1];
    private int vbIndices[]=new int[1];
    private int vbNormals[]=new int[1];
    private int vbColors[]=new int[1];
    private int vbTextureCords[]=new int[1];
    private boolean bVertices=false;
    private boolean bIndices=false;
    private boolean bNormals=false;
    private int numOfVertices;
    private int numOfIndices;
    private int numOfNormals;
    private World3D _world;
    private String textureId;

    public void setTextureId(String textureId) {
        this.textureId = textureId;
    }




    public AbstractMesh3D(){


    }
    public void setWorld(World3D world){
        this._world=world;
    }
    public void setVertexBuffer(float vertexData[]){
        GLES20.glGenBuffers(1, vbVertices, 0);
        //Short
        FloatBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(vertexData.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        vertexFloatBuffer.put(vertexData);
        vertexFloatBuffer.position(0);

        //GLES20.glGenBuffers(1, vbVertices, 0);
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbVertices[0]);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexData.length*4, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
        numOfVertices=vertexData.length/3;
        bVertices=true;

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);


        //vertexFloatBuffer.
    }

    public void setNormalBuffer(float normalData[]){
        GLES20.glGenBuffers(1, vbNormals, 0);
        //Short
        FloatBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(normalData.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        vertexFloatBuffer.put(normalData);
        vertexFloatBuffer.position(0);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbNormals[0]);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, normalData.length*4, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
        bNormals=true;
        numOfNormals=normalData.length/3;

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

    }

    public void setIndices(short indices[]){
        GLES20.glGenBuffers(1, vbIndices, 0);
        ShortBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(indices.length*2).order(ByteOrder.nativeOrder()).asShortBuffer();
        vertexFloatBuffer.put(indices);
        vertexFloatBuffer.position(0);

        //GLES20.glGenBuffers(1, buffers[1], 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vbIndices[0]);
        GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indices.length*2, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
        numOfIndices=indices.length;
        bIndices=true;

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

    }

    public void render(){
        int posHandle=_world.getOgl_aPositionHandle();
        int normalHandle=_world.getOgl_aNormalHandle();

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbVertices[0]);
        GLES20.glEnableVertexAttribArray(posHandle);
        GLES20.glVertexAttribPointer(posHandle, 3, GLES20.GL_FLOAT, false, 12, 0);

        if(bNormals){
            GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbNormals[0]);
            GLES20.glEnableVertexAttribArray(normalHandle);
            GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false, 12, 0);
        }

        if(bIndices){   
            //System.out.println("render indices");
            GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vbIndices[0]);

            GLES20.glDrawElements(GLES20.GL_TRIANGLES, numOfIndices, GLES20.GL_UNSIGNED_SHORT, 0);          

        }else{
            GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numOfVertices);
        }
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

        GLES20.glDisableVertexAttribArray(posHandle);
        GLES20.glDisableVertexAttribArray(normalHandle);
        //System.out.println("rendered");





    }

}
4

1 に答える 1

4

同じインデックスを共有するように、texcoordsとverticesを並べ替える必要があります。異なる属性に個別のインデックスを使用することはできません。

頂点の数は常にtexcoordの数と等しくなければならず、法線の数と等しくなければなりません。

OBJを解析する場合、これには、この要件を満たすことができるように、いくつかの頂点/texcoordを複製することが含まれます。

于 2012-06-01T22:29:06.217 に答える