IllegalArgumentException GLSurfaceView - PullRequest
       0

IllegalArgumentException GLSurfaceView

1 голос
/ 18 декабря 2011

Я только начинаю с OpenGL и работаю над некоторыми базовыми уроками. Однако я пытаюсь создать треугольник с Textur. Похоже, это

public class demo_Textur extends GameActivity implements GameListener
{

    private FloatBuffer vertices;
    private FloatBuffer texCoords;
    private int texturID;
    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
        setGameListner(this);
    }

    @Override
    public void setup(GameActivity activity, GL10 gl) 
    {
        ByteBuffer buffer = ByteBuffer.allocate(3*3*4);
        buffer.order(ByteOrder.nativeOrder());
        vertices = buffer.asFloatBuffer();

        vertices.put(-0.5f);
        vertices.put(-0.5f);
        vertices.put(0);

        vertices.put(0.5f);
        vertices.put(-0.5f);
        vertices.put(0);

        vertices.put(0);
        vertices.put(0.5f);
        vertices.put(0);

        vertices.rewind();

        ByteBuffer textbuffer = ByteBuffer.allocate(3*4*2);
        textbuffer.order(ByteOrder.nativeOrder());
        texCoords = textbuffer.asFloatBuffer();

        texCoords.put(0);
        texCoords.put(1);

        texCoords.put(1);
        texCoords.put(1);

        texCoords.put(0.5f);
        texCoords.put(0);

        texCoords.rewind();

        Bitmap bitmap = null;
        try 
        {
            bitmap = BitmapFactory.decodeStream(getAssets().open("droid.png"));
        } catch (Exception ex) 
        {
            Log.d("Texture Sample", "Couldn't load bitmap 'droid.png'");
        }
        int[] texturIDs = new int[1];
        gl.glGenTextures(1,texturIDs,0);
        texturID = texturIDs[0];
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        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);
        bitmap.recycle();       
    }

    @Override
    public void mainLoopIteration(GameActivity activity, GL10 gl) 
    {
        gl.glViewport(0, 0, activity.getViewPortWidht(), activity.getViewPortHeight());
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);

        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);

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

    }
}

После первого звонка glEnableCLientState() я получаю IllegalArgumentException в классе GLSurfaceView.

Кто-нибудь сталкивался с такой ошибкой или с идеей, в чем может быть проблема?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

Помните также, что вам нужно вызывать соответствующие glDisableClientState() для каждого включенного состояния после glDrawArrays().

Также вам нужно установить glViewport() только при изменении размера области просмотра (обычно в onSurfaceChanged() / onSurfaceCreated() в вашем GLSurfaceView.Renderer);

0 голосов
/ 19 декабря 2011

В вашем mainLoopIteration() попробуйте связать непосредственно с элементом текстуры, а не с массивом элементов текстуры.

//Like this
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID[0]);

//Instead of like this
//gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...