Android - OpenGL ES: как текстурировать треугольник - PullRequest
1 голос
/ 18 февраля 2012

Я изучаю OpenGL ES.Когда я использую текстуру для треугольника, я встречаю ошибку.Вот мой код:

package com.test;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;
import android.os.Bundle;

public class TexttureTriangleTest extends Activity{

    GLSurfaceView glView;
    ByteBuffer byteBuffer;
    FloatBuffer vertices;
    AssetManager assetManager;

    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        assetManager = getAssets();

        int VERTEX_SIZE = (2+2)*4;
        byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE);
        byteBuffer.order(ByteOrder.nativeOrder());
        vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] {   0.0f, 0.0f, 1, 0, 0, 1,
                                     319.0f, 0.0f, 0, 1, 0, 1,
                                     160.0f, 479.0f, 0, 0, 1, 1});
        vertices.flip();

        glView =  new GLSurfaceView(this);
        glView.setRenderer(new Render());
        setContentView(glView);
    }

    class Render implements Renderer{

        @Override
        public void onDrawFrame(GL10 gl) {

            try { //I think error in this block of code

                Bitmap bitmap = BitmapFactory.decodeStream(assetManager.open("bobrgb888.png"));
                int textureIds[] = new int[1];
                gl.glGenTextures(1, textureIds, 0);
                int textureId = textureIds[0];
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
                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_NEAREST);
                gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
                bitmap.recycle();

            } catch (IOException e) {
                throw new RuntimeException("couldn't load asset!");
            }

            gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrthof(340, 0, 420, 0, 0, 0);

            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

            int VERTEX_SIZE = (2+2)*4;
            vertices.position(0);
            gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
            vertices.position(2);
            gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);




        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // TODO Auto-generated method stub

        }

    }

}

Я думаю, что встретил ошибку в функции onDrawFrame и в коде блока try-catch.Кто может проверить это для меня и научить меня, как это исправить, пожалуйста.

спасибо:)

1 Ответ

1 голос
/ 19 февраля 2012

Я не большой специалист по OpenGL, но, насколько я вижу, здесь есть некоторые ошибки в вашем коде.Сначала это неправильный размер для byteBuffer

int VERTEX_SIZE = (2+2)*4;
byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE);

Для вашего массива vertices вам нужен размер 18 * 4 байта.18 - это число с плавающей точкой в ​​vertices, а 4 - число байтов для каждого с плавающей точкой в ​​массиве.

Во втором, почему вы думаете, что ваша ошибка в try-catch?Ищите строку ошибки в журнале в IDE.Отправьте это здесь, и мы можем видеть проблему.bobrgb888.png файл должен присутствовать в папке ресурсов.

...