Android OpenglESチュートリアル(1)


Android OpenglESチュートリアル(1)
これは私が書いたAndroidゲーム開発ノートの最初の1編で、この1編と次のいくつかの編は海外のある達人が書いたチュートリアルから翻訳されていますが、彼は名前を残していません.ここで感謝します.はい、始めます.
AndroidモバイルプラットフォームでのOpenglESチュートリアルを書くつもりです.openglesの理論は多くのハードウェアプラットフォームで同じなので、相互変換も簡単です.
私は牛ではありません.私はチュートリアルのすべての場所が正しいことを保証することができません.だから、もしあなたが間違いを見つけたり、困ったりしたら、私のブログに伝言を残してください.
OK、始めましょう!
第1課では、AndroidのOpenglESウィンドウを作る方法を教えてあげます.このような始まりはちょうどいいです.
OpenglESウィンドウの作成
Openglを知っていれば、Openglウィンドウを作るのは難しくありません.Androidプラットフォームでは、彼も簡単です.実際には、2つのことをする必要があります.
GLSurfaceView
GLSurfaceViewはAndroidが提供するAPIクラスで、openglesのプログラムを書くのを助けることができます.彼の具体的な機能は以下の通りです.
  • openglesコード表示システムへの接続
  • を提供する
  • openglesのコードをActivityのライフサイクルで
  • を実行できるようにする
  • Making it easy to choose an appropriate frame buffer pixel format.(よくわからないのでそのまま貼ってきました)
  • レンダリングを管理するスレッドを作成し、より良い効果を得る
  • openglのデバッグをより便利にする
  • コンセプトの話が終わり、次に最も重要な部分に入ります.
    呼び出す方法は1つしかありません
    public void setRenderer(GLSurfaceView.Renderer renderer);
    もっと知りたければAndroidのAPI:GLSurfaceViewを検索できます.
    GLSurfaceView.Renderer
     
     GLSurfaceView.Renderer          ,                     ,       .
    :
    // surface ,
    public void onSurfaceCreated(GL10 gl, EGLConfig config);  
    //  
    public void onDrawFrame(GL10 gl) ;
    //
    public void onSurfaceChanged(GL10 gl, int width, int height);
    onSurfaceCreated
    , , opengl 。
    onDrawFrame

    onSurfaceChanged
    , , ,
    , Android API:GLSurfaceView.Renderer

     
     
    プログラムインスタンス
    私たちはactivityを作成します.彼は簡単です.
    package se.jayway.opengl.tutorial; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; public class TutorialPartI extends Activity {/** Called when the activity is first created. */@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView view = new GLSurfaceView(this); view.setRenderer(new OpenGLRenderer()); setContentView(view); } }  
     
    この部分をレンダリングするのは少し面倒です
    package se.jayway.opengl.tutorial; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLU; import android.opengl.GLSurfaceView.Renderer; public class OpenGLRenderer implements Renderer {/* * (non-Javadoc) * * @see * android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax. * microedition.khronos.opengles.GL10, javax.microedition.khronos. * egl.EGLConfig) */public void onSurfaceCreated(GL10 gl, EGLConfig config) {//Set the background color to black ( rgba ). gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);//OpenGL docs.//Enable Smooth Shading, default not really needed. gl.glShadeModel(GL10.GL_SMOOTH);//OpenGL docs.//Depth buffer setup. gl.glClearDepthf(1.0f);//OpenGL docs.//Enables depth testing. gl.glEnable(GL10.GL_DEPTH_TEST);//OpenGL docs.//The type of depth testing to do. gl.glDepthFunc(GL10.GL_LEQUAL);//OpenGL docs.//Really nice perspective calculations. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,//OpenGL docs. GL10.GL_NICEST); }/* * (non-Javadoc) * * @see * android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax. * microedition.khronos.opengles.GL10) */public void onDrawFrame(GL10 gl) {//Clears the screen and depth buffer. gl.glClear(GL10.GL_COLOR_BUFFER_BIT |//OpenGL docs. GL10.GL_DEPTH_BUFFER_BIT); }/* * (non-Javadoc) * * @see * android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax. * microedition.khronos.opengles.GL10, int, int) */public void onSurfaceChanged(GL10 gl, int width, int height) {//Sets the current view port to the new size. gl.glViewport(0, 0, width, height);//OpenGL docs.//Select the projection matrix gl.glMatrixMode(GL10.GL_PROJECTION);//OpenGL docs.//Reset the projection matrix gl.glLoadIdentity();//OpenGL docs.//Calculate the aspect ratio of the window GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.1f, 100.0f);//Select the modelview matrix gl.glMatrixMode(GL10.GL_MODELVIEW);//OpenGL docs.//Reset the modelview matrix gl.glLoadIdentity();//OpenGL docs. } }  
    フルスクリーンモード
    次のコードを追加すると、プログラムがフルスクリーンになります.
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE);//(NEW) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//(NEW) ...//Previous code. }  
     
     
    次はあなたがこのプログラムを実行する必要があります.私たちのこのプログラムは簡単で、黒い画面しか見えません.
     
    END