android. opengl. GLSurfaceView 개요

참고:http://www.cnblogs.com/vernon/archive/2011/07/17/1877728.html
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 데모 예 프로그램 에는 다음 과 같은 예 가 많이 있 습 니 다.
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 비트 프레임 버퍼 를 선택 하 십시오. 인 터 페 이 스 는 다음 과 같 습 니 다.
setEGLConfigChooser(boolean needDepth)

 

 


red, green, blue, alpha, depth 를 맞 추 려 면 다음 인터페이스 로:
setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)

 

 


자신 이 구현 한 EGLConfigChooser 를 사용 하여 다음 인터페이스 로:
setEGLConfigChooser(EGLConfigChooser configChooser)

 

 


지속 형 렌 더 링 모드 & 알림 형 렌 더 링 모드
대부분의 3D 응용, 예 를 들 어 게임, 시 뮬 레이 션 등 은 지속 적 으로 렌 더 링 된 애니메이션 이 고 일부 3D 응용 은 반응 식 (reactive) 이다. 그들 은 수 동적 으로 기다 리 고 사용자 가 동작 이 있 으 면 반응 한다.이런 응용 프로그램 에 대해 화면 을 계속 렌 더 링 하 는 것 은 시간 낭비 이다.반응 식 응용 을 개발 하면 아래 의 방법 을 사용 할 수 있다.
GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);

 

 


지속 렌 더 링 을 중지 합 니 다.호출
GLSurfaceView.requestRender()

 

 


프로그램 이 화면 을 렌 더 링 합 니 다.
디 버 깅
GLSurfaceView. setDebugFlags () 방법 은 log 나 오류 검출 을 활성화 할 수 있 으 며 OpenGL ES 호출 을 디 버 깅 하 는 데 도움 을 줄 수 있 습 니 다.구체 적 으로 사용 할 때 GLSurface View 의 구조 함수 에서 setRender () 를 호출 하기 전에 GLSurface View. setDebugFlags () 를 호출 하면 됩 니 다.다음은 예 입 니 다.
public ClearGLSurfaceView(Context context) {
super(context);
// Turn on error-checking and logging
setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}

좋은 웹페이지 즐겨찾기