0

概要

立方体の側面のテクスチャのレンダリングに問題があります。立方体の上部と下部のテクスチャは正常にレンダリングされましたが、側面はレンダリングできません。

私が持っているもの

私は 48 要素でいっぱいのテクスチャ バッファを持っています (面ごとに 4*2 要素と 6 つの面は 48 です)。

立方体の形状は描画されていますが、側面はレンダリングされていません。 キューブのスクリーンショット

私が描いている画像は、立方体の上から見てわかるように、1 から 9 までの数字の単純な画像です。textureBuffer は何度も何度も同じパターンです...

        texture[0] = 0;
        texture[1] = 0;
        texture[2] = 1;
        texture[3] = 0;
        texture[4] = 1;
        texture[5] = 1;
        texture[6] = 0;
        texture[7] = 1;
        texture[8] = 0;
        texture[9] = 0;
        texture[10] = 1;
        texture[11] = 0;
        texture[12] = 1;
        texture[13] = 1;
        texture[14] = 0;
        texture[15] = 1;
        texture[16] = 0f;
        texture[17] = 0f;
        texture[18] = 1f;
        texture[19] = 0f;
        texture[20] = 1f;
        texture[21] = 1f;
        texture[22] = 0f;
        texture[23] = 1f;

これは単にテクスチャ バッファをロードして、完全なテクスチャをレンダリングします。

考えられる問題##

最初の 16 のテクスチャ座標のみが描画され、使用されているように見えます。これは、長方形の上面と底面のみがテクスチャ処理されているためです。私はそれをデバッグしましたが、 TextureBuffer を設定すると、サイズは 48 になります。

レンダリング コード

@Override
public void draw(GL10 gl)
{
    super.draw(gl);

    //gl.glColor4f(255, 0, 0, 150);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnable(GL10.GL_ALPHA_TEST);
    gl.glAlphaFunc(GL10.GL_GREATER, 0.0f);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);

    gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_BLEND);

    gl.glFrontFace(GL10.GL_CCW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);

    gl.glDrawElements(GL10.GL_TRIANGLES,indexBuffer.capacity(),GL10.GL_UNSIGNED_SHORT,indexBuffer);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
    gl.glDisable(GL10.GL_ALPHA_TEST);
    gl.glDisable(GL10.GL_TEXTURE_2D);
    gl.glColor4f(255, 255, 255, 255);
}

変数 textureBuffer の作成

入ってくるパラメータ変数 texture には 48 個の要素が含まれています

public void constructTextureBuffer(float[] texture)
{
    ByteBuffer vbb = ByteBuffer.allocateDirect(texture.length*4);
    vbb.order(ByteOrder.nativeOrder());
    textureBuffer = vbb.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);
}

vertexBuffer は正しくセットアップされ、インデックス バッファーを使用してキューブをレンダリングします。立方体の側面がレンダリングされない理由を知っていますか?

新着!!

手でシェイプを作成しようとしましたが、テクスチャ バッファで同じ状況に陥っています。2 つの顔をレンダリングできますが、3 番目の顔はレンダリングできません! 8 を超えるテクスチャ頂点は機能しないようです。

この写真は私の新しい形を示しています。水平方向の拡張に注意してください。それらのテクスチャ座標に何をしても、そのテクスチャは変わりません。これは、ランダム オブジェクトの 3 番目の面でもあります。

ここに画像の説明を入力

4

1 に答える 1

0

インデックス バッファとテクスチャを連携させるには、まだ取得する必要があります。私はほとんどすべてを試しました!その代わりに (そして残念なことに) 私はたくさんの三角形を作っています。Blender によって生成された .obj ファイルを解析するために、頂点バッファーとテクスチャ バッファーを作成するこの関数を作成しました。

public static Mesh createMesh(int resourceID)
    {
        Mesh m = new Mesh();

        Scanner s = null;

        BufferedReader inputStream = null;

        ArrayList<Float> readInVerticies        = new ArrayList<Float>();
        ArrayList<Float> readInTextures         = new ArrayList<Float>();
        ArrayList<Short> readInVertexIndicies   = new ArrayList<Short>();
        ArrayList<Short> readInTextureIndicies  = new ArrayList<Short>();

        int numberFaces = 0;

        try
        {
            inputStream = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(resourceID)));
            s = new Scanner(inputStream);
            String line = null;

            /*
             * Read the header part of the file
             */
            line = inputStream.readLine();
            line = inputStream.readLine();
            line = inputStream.readLine();
            line = inputStream.readLine();
            line = inputStream.readLine();

            while(line.charAt(0) == 'v' && line.charAt(1) != 't')
            {
                s = new Scanner(line);
                s.next();
                readInVerticies.add(s.nextFloat());
                readInVerticies.add(s.nextFloat());
                readInVerticies.add(s.nextFloat());
                line = inputStream.readLine();
            }
            while(line.charAt(0)=='v' && line.charAt(1)=='t')
            {
                s = new Scanner(line);
                s.next(); //read in "vt"
                readInTextures.add(s.nextFloat());
                readInTextures.add(s.nextFloat());
                line = inputStream.readLine();
            }
            line = inputStream.readLine();
            line = inputStream.readLine();

            while(line != null && line.charAt(0) == 'f')
            {
                s = new Scanner(line);
                s.useDelimiter("[ /\n]");
                String buffer = s.next();
                short vi1,vi2,vi3,vi4;
                short ti1,ti2,ti3,ti4;

                vi1 = s.nextShort();
                ti1 = s.nextShort();
                vi2 = s.nextShort();
                ti2 = s.nextShort();
                vi3 = s.nextShort();
                ti3 = s.nextShort();
                vi4 = s.nextShort();
                ti4 = s.nextShort();

                readInVertexIndicies.add(vi1);
                readInVertexIndicies.add(vi2);
                readInVertexIndicies.add(vi3);
                readInVertexIndicies.add(vi4);

                readInTextureIndicies.add(ti1);
                readInTextureIndicies.add(ti2);
                readInTextureIndicies.add(ti3);
                readInTextureIndicies.add(ti4);

                numberFaces = numberFaces + 1;
                line = inputStream.readLine();      
            }

            /*
             * constructing our verticies. Use the number of faces * 6 because
             * there are 2 triangles per face and 3 verticies on a triangle but there are
             * also 3 coordinates per vertex.
             * 
             * For the texture, the same number but there are only 2 coordinates per texture
             */
            float verticies[] = new float[numberFaces * 6 * 3];
            float textures[]  = new float[numberFaces * 6 * 2];
            for(int i=0;i<numberFaces;i++)
            {
                verticies[i*18+0]       =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+0);
                verticies[i*18+1]       =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+1);
                verticies[i*18+2]       =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+2);

                textures[i*12+0]        =   readInTextures.get((readInTextureIndicies.get(i*4+0)-1)*2+0);
                textures[i*12+1]        =   readInTextures.get((readInTextureIndicies.get(i*4+0)-1)*2+1);

                verticies[i*18+3]       =   readInVerticies.get((readInVertexIndicies.get(i*4+1)-1)*3+0);
                verticies[i*18+4]       =   readInVerticies.get((readInVertexIndicies.get(i*4+1)-1)*3+1);
                verticies[i*18+5]       =   readInVerticies.get((readInVertexIndicies.get(i*4+1)-1)*3+2);

                textures[i*12+2]        =   readInTextures.get((readInTextureIndicies.get(i*4+1)-1)*2+0);
                textures[i*12+3]        =   readInTextures.get((readInTextureIndicies.get(i*4+1)-1)*2+1);

                verticies[i*18+6]       =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+0);
                verticies[i*18+7]       =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+1);
                verticies[i*18+8]       =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+2);

                textures[i*12+4]        =   readInTextures.get((readInTextureIndicies.get(i*4+2)-1)*2+0);
                textures[i*12+5]        =   readInTextures.get((readInTextureIndicies.get(i*4+2)-1)*2+1);

                verticies[i*18+9]       =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+0);
                verticies[i*18+10]      =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+1);
                verticies[i*18+11]      =   readInVerticies.get((readInVertexIndicies.get(i*4+0)-1)*3+2);

                textures[i*12+6]        =   readInTextures.get((readInTextureIndicies.get(i*4+0)-1)*2+0);
                textures[i*12+7]        =   readInTextures.get((readInTextureIndicies.get(i*4+0)-1)*2+1);

                verticies[i*18+12]      =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+0);
                verticies[i*18+13]      =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+1);
                verticies[i*18+14]      =   readInVerticies.get((readInVertexIndicies.get(i*4+2)-1)*3+2);

                textures[i*12+8]        =   readInTextures.get((readInTextureIndicies.get(i*4+2)-1)*2+0);
                textures[i*12+9]        =   readInTextures.get((readInTextureIndicies.get(i*4+2)-1)*2+1);

                verticies[i*18+15]      =   readInVerticies.get((readInVertexIndicies.get(i*4+3)-1)*3+0);
                verticies[i*18+16]      =   readInVerticies.get((readInVertexIndicies.get(i*4+3)-1)*3+1);
                verticies[i*18+17]      =   readInVerticies.get((readInVertexIndicies.get(i*4+3)-1)*3+2);

                textures[i*12+10]       =   readInTextures.get((readInTextureIndicies.get(i*4+3)-1)*2+0);
                textures[i*12+11]       =   readInTextures.get((readInTextureIndicies.get(i*4+3)-1)*2+1);
            }

            m.constructVertexBuffer(verticies);
            m.constructTextureBuffer(textures);


        } 
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return m;
    }

したがって、.obj ファイルの解析で問題が発生した場合は、これを参照またはガイドとして自由に使用してください。Blender は 4 つの頂点を持つ面のすべてを提供します。これにより、すべてが 3 になり、面ごとに 2 つの三角形が構築されます。

于 2012-12-18T15:24:16.723 に答える