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