Android: два разных применения Renderer - PullRequest
1 голос
/ 17 февраля 2012

Я использую два способа Renderer, чтобы нарисовать треугольник. Один - это работа, а другой - нет.

Вот мои два решения.

Первое решение: не может работать при запуске. I emplements Renderer (Вы должны увидеть строку: glView.setRenderer метод. В этом основное отличие моих двух решений.)

package com.test;

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.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;

public class TriangleOpenGLTest extends Activity implements Renderer{

    FloatBuffer vertices;
    ByteBuffer byteBuffer;
    GL10 gl;
    GLSurfaceView glView;


    @Override 
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        byteBuffer = ByteBuffer.allocateDirect(3*2*4);
        byteBuffer.order(ByteOrder.nativeOrder());

        vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
        vertices.flip();

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

    }

    @Override
    public void onResume(){
        super.onResume();
            gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrthof(0, 320, 0, 480, 1, -1);
            gl.glColor4f(1, 0, 0, 1);
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glVertexPointer( 2, GL10.GL_FLOAT, 0, vertices);
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);       
    }

            @Override
        public void onDrawFrame(GL10 gl) {
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {

        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        }
}

Решение 2. Я создаю новый подкласс для своего Renderer.

package com.test;

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.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;

public class TriangleOpenGLTest extends Activity {

    FloatBuffer vertices;
    ByteBuffer byteBuffer;
    GL10 gl;
    GLSurfaceView glView;


    @Override 
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        byteBuffer = ByteBuffer.allocateDirect(3*2*4);
        byteBuffer.order(ByteOrder.nativeOrder());

        vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] { 0.0f, 0.0f, 319.0f, 0.0f, 160.0f, 479.0f});
        vertices.flip();

        glView = new GLSurfaceView(this);
        glView.setRenderer(new DrawTriangle());
        setContentView(glView);

    }

    @Override
    public void onResume(){
        super.onResume();
    }

    public class DrawTriangle implements Renderer{

        public DrawTriangle(){

        }
        @Override
        public void onDrawFrame(GL10 gl) {

            gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrthof(0, 320, 0, 480, 1, -1);
            gl.glColor4f(1, 0, 0, 1);
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glVertexPointer( 2, GL10.GL_FLOAT, 0, 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

        }

    }

}

Кто может объяснить мне, в чем разница между двумя вышеупомянутыми решениями, пожалуйста.

спасибо:)

1 Ответ

2 голосов
/ 17 февраля 2012

В первом решении у вас есть пустой метод onDrawFrame (). Вероятно, поэтому он не работает. См. GLSurfaceView.Renderer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...