1

AndroidでOPENGLライブラリを使用して3Dキューブを作成しました。キューブは正常に機能しますが、キューブに印刷する画像が表示されません...

これが私のRender(javaクラス)のコードです:

public class GLRenderEx implements Renderer {

    private GLCube cube;
    Context c;

    public GLRenderEx(Context c) {
        cube = new GLCube();
        this.c = c;
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glDisable(GL10.GL_DITHER);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        GLU.gluLookAt(gl, 0, 0, -3, 0, 0, 0, 0, 2, 0);

        long time = SystemClock.uptimeMillis() % 4000L;
        float angle = .090f * ((int) time);
        gl.glRotatef(angle, 2, 4, 3);

        cube.draw(gl);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
        gl.glViewport(0, 0, width, height);
        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig egl) {
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(0f, 0f, 0f, 1);
        gl.glClearDepthf(1f);
    }

}

これが私のキューブのコードです:

    public class GLCube {

    /** The buffer holding the vertices */
    private FloatBuffer vertexBuffer;
    /** The buffer holding the texture coordinates */
    private FloatBuffer textureBuffer;
    /** The buffer holding the indices */
    private ByteBuffer indexBuffer;

    /** Our texture pointer */
    private int[] textures = new int[1];

    /**
     * The initial vertex definition
     * 
     * Note that each face is defined, even if indices are available, because of
     * the texturing we want to achieve
     */
    private float vertices[] = {
            // Vertices according to faces
            -1.0f,
            -1.0f,
            1.0f, // Vertex 0
            1.0f,
            -1.0f,
            1.0f, // v1
            -1.0f,
            1.0f,
            1.0f, // v2
            1.0f,
            1.0f,
            1.0f, // v3

            1.0f,
            -1.0f,
            1.0f, // ...
            1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,

            1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f,
            1.0f, -1.0f,

            -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
            1.0f, 1.0f,

            -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
            -1.0f, 1.0f,

            -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f,
            1.0f, -1.0f, };

    /** The initial texture coordinates (u, v) */
    private float texture[] = {
            // Mapping coordinates for the vertices
            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

            0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,

    };

    /** The initial indices definition */
    private byte indices[] = {
            // Faces definition
            0, 1, 3, 0, 3,
            2, // Face front
            4, 5, 7, 4, 7,
            6, // Face right
            8, 9, 11, 8, 11,
            10, // ...
            12, 13, 15, 12, 15, 14, 16, 17, 19, 16, 19, 18, 20, 21, 23, 20, 23,
            22, };

    /**
     * The Cube constructor.
     * 
     * Initiate the buffers.
     */
    public GLCube() {
        //
        ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        vertexBuffer = byteBuf.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);

        //
        byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        textureBuffer = byteBuf.asFloatBuffer();
        textureBuffer.put(texture);
        textureBuffer.position(0);

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

    /**
     * The object own drawing function. Called from the renderer to redraw this
     * instance with possible changes in values.
     * 
     * @param gl
     *            - The GL Context
     */
    public void draw(GL10 gl) {
        // Bind our only previously generated texture in this case
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        // Point to our buffers
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        // Set the face rotation
        gl.glFrontFace(GL10.GL_CCW);

        // Enable the vertex and texture state
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

        // Draw the vertices as triangles, based on the Index Buffer information
        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
                GL10.GL_UNSIGNED_BYTE, indexBuffer);

        // Disable the client state before leaving
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }

    /**
     * Load the textures
     * 
     * @param gl
     *            - The GL Context
     * @param context
     *            - The Activity context
     */
    public void loadGLTexture(GL10 gl, Context context) {
        // Get the texture from the Android resource directory
        InputStream is = context.getResources().openRawResource(
                R.drawable.ic_launcher);
        Bitmap bitmap = null;
        try {
            // BitmapFactory is an Android graphics utility for images
            bitmap = BitmapFactory.decodeStream(is);

        } finally {
            // Always clear and close
            try {
                is.close();
                is = null;
            } catch (IOException e) {
            }
        }

        // Generate one texture pointer...
        gl.glGenTextures(1, textures, 0);
        // ...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

        // Create Nearest Filtered Texture
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                GL10.GL_LINEAR);

        // Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                GL10.GL_CLAMP_TO_EDGE);

        // Use the Android GLUtils to specify a two-dimensional texture image
        // from our bitmap
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

        // Clean up
        bitmap.recycle();
    }
}

コードのビットマップがキューブに表示されないのはなぜですか??!!

ありがとう。

4

3 に答える 3

2

私はあなたのコードを調べましたが、あなたが電話をかける場所が見つかりませんでしたloadGLTexture()。テクスチャを作成するためにコードを実装したとき、cube.loadGLTexture(gl, c);上記cube.draw(gl);onDrawFrame()メソッドに追加しました。お役に立てば幸いです。

于 2013-10-19T06:01:21.273 に答える
1

オブジェクトにテクスチャリングする場合は、でテクスチャリングを有効にする必要がありますglEnable(GL_TEXTURE_2D);

これはあなたのコードのどこにも見当たりません。

于 2012-09-23T20:44:42.723 に答える
0

私はあなたとしていくつかの問題を抱えています。

私の問題の原因は、テクスチャが立方体と正確に一致していないことでした。

コードを注意深くチェックしてください。いくつかの不一致に気付く場合があります。

于 2012-09-26T08:24:04.720 に答える