1. MainActivity

아래 코드를 보면 알 수 있듯이, MainActivity자체는 별로 하는 일이 없다. setContentView로 화면에 보여질 뷰를 MainGLSurfaceView로 설정한다. openGLVerstion는 MainGLSurfaceView 클래스 내에서, GL버전을 설정하는데 쓰인다.


public class MainActivity extends Activity {
	public static MainGLSurfaceView view;
	public static Context 			context = null;
	public static final int			openGLVerstion = 2;
        
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		context = this;
		
		/*
		 * Setting OpenGL.
		 * Version : 2.0 
		 * Renderer : MainGLRenderer
		 */
		view = new MainGLSurfaceView(this);
		setContentView(view);
	}
}


2. GLSurfaceView 

  아래 클래스는 GLSurfaceView를 상속받아 커스톰하게 만들었다. 사실 커스톰 클래스로 만들지 않아도 되지만, 나중에 이벤트 처리 때문에, 그렇게 만들었다(자세한 내용은 이벤트 처리 설명에서..). 

public class MainGLSurfaceView extends GLSurfaceView 
{
	MainGLRenderer mRenderer;
	public MainGLSurfaceView(Context con)
	{
		super(con);
		mRenderer = new MainGLRenderer();
		this.setEGLContextClientVersion(MainActivity.openGLVerstion);
		this.setPreserveEGLContextOnPause(MainActivity.saveGLSurface);
		this.setRenderer(mRenderer);
	}
}


  - setEGLContextClientVersion : opengles버전을 설정한다. 버전을 설정하기 위해서는, AndroidManifast.xml, 

jni/Android.mk 파일들도 수정해야 한다(아래 예제 참고).

- setPreserveEGLContextOnPause : 이 함수를 사용하지 않으면, pause시 opengles와 관련된 데이터들이 모두 지워진다. 때문에,

     resume 시 다시 gl데이터를 다시 복구 시켜줘야하는데, 그 과정이 생각보다 귀찮다. API11부터는 이 함수를 이용해 gl데이터가 

     사라지지 않도록 할 수 있다.

  - setRenderer : 렌더러 객체를 설정한다.



3. Renderer 인터페이스

  Renderer인터페이스를 사용하기 위해서는, onDrawFrame, onSurfaceChanged, onSurfaceCreated함수를 구현해 주어야 한다. 아래 클래스는 그 예이다.


public class MainGLRenderer implements Renderer { long preTime; long diffTime; boolean isFirst = true; float frameTime = 1000/30; @Override public void onDrawFrame(GL10 gl) { if(isFirst) { MainNDK.render(0); preTime = System.currentTimeMillis(); isFirst = false;

return;

} diffTime = System.currentTimeMillis() - preTime; MainNDK.render(diffTime);

} @Override public void onSurfaceChanged(GL10 gl, int width, int height) { Log.i("AndroidOpenGL", "onSurfaceChanged start"); MainNDK.onResize(width, height); Log.i("AndroidOpenGL", "onSurfaceChanged end"); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { Log.i("AndroidOpenGL", "onSurfaceCreated start"); MainNDK.init(); MainActivity.isGLCreated = true; Log.i("AndroidOpenGL", "onSurfaceCreated end"); } }


  - onDrawFrame : 매 프레임마다 호출되는 함수이다. 내가 설정한 프레임 속도에 맞춰 c++의 render함수를 호출한다

    (추후 JNI글에서 설명).

  - onSurfaceChanged : 화면이 생성되거나, 회전 등에 의해 화면 크기가 변경되는 경우에 호출 된다. 여기서 c++의 onResize함수 호출

  - onSurfaceCreated : gl뷰가 생성되었을 때, 딱 한번 호출된다. 이 함수가 호출돼야 c++에서 gl함수를 사용할 수 있다. 한마디로 gl문맥이 만들어 졌다고 생각하면 된다. 여기서 c++의 init함수 호출




4. AndroidManifast.xml파일


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.snj.opengles"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="11"

        android:targetSdkVersion="18" />

    <uses-feature android:glEsVersion="0x00020000" android:required="true" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" 

        android:hardwareAccelerated="true">

        <meta-data android:name="com.google.android.gms.version"

               android:value="@integer/google_play_services_version"/>

        <activity

            android:name="com.snj.opengles.MainActivity"

            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

            android:label="@string/app_name" 

             android:screenOrientation="landscape"

            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"

         >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

<activity android:name="com.google.android.gms.ads.AdActivity"

             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

    </application>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.INTERNET"/>

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  <uses-permission android:name="android.permission.BLUETOOTH" />

</manifest>



'NDK & OpenGL ES' 카테고리의 다른 글

OpenGLES2.0 GLSL, 2D Basic shader  (1) 2014.09.18
OpenGLES 2.0,GLSL lighting code  (0) 2014.09.15
GLSL, OpenGLES2.0 glFog  (0) 2014.09.12
NDK AdMob, Can't see admob on Framelayout  (0) 2014.09.10
GLSurfaceView & GLRenderer 설정  (0) 2014.04.15
이클립스 NDK설정  (0) 2014.04.15