gallery 3d 코드 분석의 glsurfaceview

원본 주소:http://www.linuxgraphics.cn/android/gallery3d_glsurfaceview.html
 
 
저자: 류 펑
날짜: 2010 - 04 - 01
안 드 로 이 드 SDK 가 제공 하 는 GlSurface View 를 어떻게 사용 하여 OpenGL ES 개발 을 하 는 지 간략하게 소개 한다.
SDK 의 android. opengl. GLSurfaceView 클래스 는 다음 과 같은 기능 을 제공 합 니 다.
  • OpenGL ES 와 View 시스템 간 에 관 계 를 구축한다.
  • OpenGL ES 는 Activity 생명주기 에서 작업 할 수 있 게 한다.
  • 적당 한 frame buffer 픽 셀 형식 을 선택 할 수 있 습 니 다.
  • 단독 렌 더 링 스 레 드 를 만 들 고 관리 하면 부 드 러 운 애니메이션 을 실현 할 수 있 습 니 다.
  • debugging 도구 와 API 를 제공 합 니 다.

  • 간단 한 GLSurface View 응용 프로그램
    package com.example.android.apis.graphics;
    
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    import android.app.Activity;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    
    public class ClearActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mGLView = new GLSurfaceView(this);
            mGLView.setRenderer(new ClearRenderer());
            setContentView(mGLView);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mGLView.onPause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mGLView.onResume();
        }
    
        private GLSurfaceView mGLView;
    }
    
    class ClearRenderer implements GLSurfaceView.Renderer {
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // Do nothing special.
        }
    
        public void onSurfaceChanged(GL10 gl, int w, int h) {
            gl.glViewport(0, 0, w, h);
        }
    
        public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        }
    }
    
    
    은 프레임 당 화면 을 검은색 으로 설정 하 는 간단 한 기능 을 가지 고 있 습 니 다.그러나 이것 은 Activity 라 이 프 사이클 에서 완전한 작업 을 하 는 OpenGL 프로그램 이다.activity 가 일시 정 지 될 때 렌 더 링 을 일시 정지 합 니 다.activity 가 계속 되면 계속 렌 더 링 합 니 다.이 프로그램 을 비 대화 형 데모 프로그램 으로 사용 할 수 있 습 니 다.ClearRenderer. onDrawFrame () 인터페이스 에 OpenGL 호출 을 추가 하여 많은 그림 을 그 릴 수 있 습 니 다.GLSurface View. Render 인 터 페 이 스 는 세 가지 방법 이 있 습 니 다.
  • onSurfaceCreated (): 이 방법 은 렌 더 링 이 시작 되 기 전에 호출 되 며 OpenGL ES 의 컨 텍스트 가 재 구축 되 었 을 때 도 호출 됩 니 다.activity 가 일시 정 지 될 때 컨 텍스트 를 그 리 는 것 을 잃 어 버 립 니 다. activity 가 계속 되면 컨 텍스트 를 그 리 는 것 이 재 건 됩 니 다.또한 장기 적 으로 존재 하 는 OpenGL 자원 (예 를 들 어 texture) 을 만 드 는 것 도 여기 서 진행 된다.
  • onSurface Changed (): surface 의 크기 가 바 뀌 었 을 때 이 방법 이 호출 됩 니 다.뷰 포트 를 설정 하 는 경우 가 많 습 니 다.만약 당신 의 camera 가 고정 되 어 있다 면, 여기에 camera 를 설치 할 수도 있 습 니 다.
  • onDrawFrame (): 각 프레임 은 이 방법 을 통 해 그립 니 다.그림 을 그 릴 때 보통 glClear 함 수 를 사용 하여 framebuffer 를 비우 고 OpenGL ES 의 시작 인 터 페 이 스 를 사용 하여 그립 니 다.

  • 입력 을 어떻게 처리 하 는 지 입력 하 십시오. 만약 에 상호작용 형 응용 프로그램 (예 를 들 어 게임) 을 개발 하려 면 하위 클래스 화 GLSurface View 가 필요 합 니 다. 이 를 통 해 입력 이 벤트 를 얻 을 수 있 습 니 다.다음 예 가 있 습 니 다.
    package com.google.android.ClearTest;
    
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    import android.app.Activity;
    import android.content.Context;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    import android.view.MotionEvent;
    
    public class ClearActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mGLView = new ClearGLSurfaceView(this);
            setContentView(mGLView);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mGLView.onPause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mGLView.onResume();
        }
    
        private GLSurfaceView mGLView;
    }
    
    class ClearGLSurfaceView extends GLSurfaceView {
        public ClearGLSurfaceView(Context context) {
            super(context);
            mRenderer = new ClearRenderer();
            setRenderer(mRenderer);
        }
    
        public boolean onTouchEvent(final MotionEvent event) {
            queueEvent(new Runnable(){
                public void run() {
                    mRenderer.setColor(event.getX() / getWidth(),
                            event.getY() / getHeight(), 1.0f);
                }});
                return true;
            }
    
            ClearRenderer mRenderer;
    }
    
    class ClearRenderer implements GLSurfaceView.Renderer {
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // Do nothing special.
        }
    
        public void onSurfaceChanged(GL10 gl, int w, int h) {
            gl.glViewport(0, 0, w, h);
        }
    
        public void onDrawFrame(GL10 gl) {
            gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        }
    
        public void setColor(float r, float g, float b) {
            mRed = r;
            mGreen = g;
            mBlue = b;
        }
    
        private float mRed;
        private float mGreen;
        private float mBlue;
    }
    
    
    이 응용 은 각 프레임 에서 화면 을 비 웁 니 다.tap 화면 에서 화면의 색 을 바 꿉 니 다.여 기 는 ClearGLSurfaceView. onTouchEvent () 에 queueEvent () 를 사 용 했 습 니 다.queueEvent () 방법 은 UI 스 레 드 와 렌 더 링 스 레 드 간 통신 에 사 용 됩 니 다.synchronized 방법 과 같은 자바 스 레 드 통신 기술 도 사용 할 수 있 지만 quueEvent 의 가장 간단 한 스 레 드 통신 방법 입 니 다.다른 GLSurface View 예 는 Android SDK 의 API Demo 예 프로그램 에서 도 많은 예 가 있 습 니 다.
  • GLSurfaceView
  • Kube
  • 반투명 GLSurfaceView: 투명 배경
  • Textured Triangle: 텍 스 처 스티커
  • Sprite Text: texture 에 텍스트 를 쓰 고 3D 장면 에 표시 합 니 다
  • 터치 회전: 회전 3D 개체
  • Surface GLSurface View 를 선택 하면 surface 를 선택 할 수 있 는 인 터 페 이 스 를 제공 합 니 다.기본적으로 GLSurface View 는 16 비트 깊이 의 RGB frame buffer 16 개 를 사용 합 니 다.당신 도 자신의 필요 에 따라 선택 할 수 있 습 니 다. 예 를 들 어 Translucent GLSurface View 예 에서 알파 채널 이 필요 합 니 다.GLSurface View 는 surface 를 선택 하 는 setEGLSurface Chooser () 방법 을 제공 합 니 다.RGB (565) 의 16 비트 framebuffer 를 선택 하 십시오. 인 터 페 이 스 는 다음 과 같 습 니 다.
    setEGLConfigChooser(boolean needDepth)
    
    
    red, green, blue, alpha 와 depth 를 맞 추 려 면 다음 과 같은 인 터 페 이 스 를 사용 하 십시오.
    setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)
    
    
    지속 형 렌 더 링 모델 & 알림 형 렌 더 링 모델 은 대부분 3D 응용 프로그램 입 니 다. 예 를 들 어 게임, 시 뮬 레이 션 등 은 지속 형 렌 더 링 애니메이션 입 니 다.또한 일부 3D 응용 은 반응 식 (reactive) 으로 사용자 가 동작 이 있 으 면 수 동적 으로 기다린다.이런 응용 프로그램 에 대해 화면 을 계속 렌 더 링 하 는 것 은 시간 낭비 이다.반응 식 응용 을 개발 하면 다음 방법
    setEGLConfigChooser(EGLConfigChooser configChooser)
    
    
    을 사용 하여 지속 적 인 렌 더 링 을 중단 할 수 있 습 니 다.호출
    GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
    
    
    시 프로그램 이 화면 을 렌 더 링 합 니 다.GLSurface View 를 디 버 깅 합 니 다. setDebugFlags () 방법 은 log 나 오류 검 사 를 활성화 할 수 있 습 니 다. OpenGL ES 호출 을 디 버 깅 하 는 데 도움 이 됩 니 다.구체 적 으로 사용 할 때 GLSurface View 의 구조 함수 에서 setRender () 를 호출 하기 전에 GLSurface View. setDebugFlags () 를 호출 하면 됩 니 다.다음은 예 입 니 다.
    GLSurfaceView.requestRender()
    
    
    Reference
  • Introducing GLSurfaceView

  •  
     

    좋은 웹페이지 즐겨찾기