OpenGL Gameテンプレートを読みやすくする


OpenGL GameテンプレートにはGLKitの機能を使って描画を行うコードと、従来のシェーダーを使って描画を行うコードが混在しています。このままでは読みにくいので、GLKitを使った描画以外の部分のコードを消して、読みやすくして見ましょう。大分前に書いたつもりでいたのですが、どうも英語版のブログの方に記事を書いたまま、こっちには書いていなかったので転記しておきます。

GLKitとシェーダー

OpenGL Gameテンプレートを起動すると、赤青二つの立方体が画面に表示されます。赤い方の立方体はGLKitの機能を使って描画され、青い方はシェーダーを使って描画されています。両方のコードが混在しているためOpenGL Gameテンプレートは読みにくくなっています。シェーダーを使う方のコードを削って、読みやすくしてみましょう。

シェーダー関連のメソッド

ViewControllerのメソッドのうち、シェーダー関連のメソッドは下記の四つです。

- (BOOL)loadShaders;
- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
- (BOOL)linkProgram:(GLuint)prog;
- (BOOL)validateProgram:(GLuint)prog;

これらのメソッドの実装と定義を消してしまいましょう。幸いこれらのメソッドの実装は、

#pragma mark -  OpenGL ES 2 shader compilation

という行の下にまとまっていますので、まとめて消してしまえばOKです。また、これらのメソッドを呼び出している部分も消しましょう。

glkView:drawInRect:メソッド内にあるシェーダーを使って立方体の描画を行っている下記のコードも不要です。

// Render the object again with ES2
 glUseProgram(_program);
 
 glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
 glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
 
 glDrawArrays(GL_TRIANGLES, 0, 36);

updateメソッドにもマトリクスを更新するコードがありますが、これも不要です。

// Compute the model view matrix for the object rendered with ES2
 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f);
 modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
 modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
 
 _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
 
 _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);

最後に不要になった下記のインスタンス変数と、それらを解放しているコードを消します。

GLuint _program;
GLKMatrix4 _modelViewProjectionMatrix;
GLKMatrix3 _normalMatrix;

tearDownGL内でprogramを解放しているコード

 if (_program) {
   glDeleteProgram(_program);
   _program = 0;
 }

不要なシェーダーファイルの削除

Shader.vsh, Shader.fshは不要なので、削除しましょう。

結論

GLKitの最低限の機能を使って立方体を一つ描画するだけのコードになり、大分読みやすくなりました。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です