iOS開発-OpenGL ES入門チュートリアル4
5086 ワード
チュートリアル
OpenGL ES入門チュートリアル1-Tutorial 01-GLKit OpenGL ES入門チュートリアル2-Tutorial 02-shader入門OpenGL ES入門チュートリアル3-Tutorial 03-3 D変換今回はGLKitを使って、グラフィック変換、テクスチャマップ、シェーディング、深度テスト(コードはこちら)をより簡単に実現します.
OpenGL ESシリーズチュートリアルはこちらです.OpenGL ESシリーズチュートリアルのコードアドレス-あなたのstarとforkは私のソースで、あなたの意見は私をもっと遠くに行かせることができます.
効果の表示
コア構想
GLKitを使用してグラフィック変換、テクスチャマップロード、深度テストを行い、GLKBaseEffectを使用してテクスチャマップを管理し、シェーディングを行います.
詳細
1、頂点のプロパティ
typedef NS_ENUM(GLint, GLKVertexAttrib)
{
GLKVertexAttribPosition,
GLKVertexAttribNormal,
GLKVertexAttribColor,
GLKVertexAttribTexCoord0,
GLKVertexAttribTexCoord1
} NS_ENUM_AVAILABLE(10_8, 5_0);
GLKEffectsで使用される頂点プロパティは定義されており、使用時に直接列挙量で値を割り当てます.次の図では、頂点の位置、色、テクスチャ座標を直接割り当てます.
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8, (GLfloat *)NULL);
//
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, 4 * 8, (GLfloat *)NULL + 3);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4 * 8, (GLfloat *)NULL + 6);
2、テクスチャ
カスタムshaderでテクスチャを使用するには、CoreGraphicsで画像をbitmapdataに変換し、テクスチャメモリを申請し、画像データを転送し、最後にbitmapdataを解放する必要があります.GLKitでは、次の3行のコードだけでテクスチャのロードを完了できます.
//
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"for_test" ofType:@"png"];
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:@(1), GLKTextureLoaderOriginBottomLeft, nil];
GLKTextureInfo* textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];
GLKTextureLoaderOriginBottomLeft
パラメータは、テクスチャ座標系と世界座標系の原点が異なるため、テクスチャの上下が逆転しないようにします.最後にシェーダを作成し、テクスチャを有効にし、作成したtextureInfoのnameをシェーダに割り当てます.
//
self.mEffect = [[GLKBaseEffect alloc] init];
self.mEffect.texture2d0.enabled = GL_TRUE;
self.mEffect.texture2d0.name = textureInfo.name;
3、図形変換
OpenGL ESでは,グラフィック変換の表現形式がマトリクス操作であり,GLKitも多くのマトリクス操作関数を提供している.
//
CGSize size = self.view.bounds.size;
float aspect = fabs(size.width / size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(90.0), aspect, 0.1f, 10.f);
projectionMatrix = GLKMatrix4Scale(projectionMatrix, 1.0f, 1.0f, 1.0f);
self.mEffect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 modelViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, -2.0f);
self.mEffect.transform.modelviewMatrix = modelViewMatrix;
GLKMatrix4MakePerspective
はパース投影変換GLKMatrix4Translate
はパン変換/**
*
*/
- (void)update {
GLKMatrix4 modelViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0f, 0.0f, -2.0f);
modelViewMatrix = GLKMatrix4RotateX(modelViewMatrix, self.mDegreeX);
modelViewMatrix = GLKMatrix4RotateY(modelViewMatrix, self.mDegreeY);
modelViewMatrix = GLKMatrix4RotateZ(modelViewMatrix, self.mDegreeZ);
self.mEffect.transform.modelviewMatrix = modelViewMatrix;
}
シーン変換関数では,
GLKMatrix4RotateY
がY軸回りに回転し,その他の分はそれぞれX軸回り,Z軸回りに回転する.4、深さテスト
前のチュートリアルで説明したように、深度テストを開くには、深度テストのバッファを割り当て、対応するフレームバッファにマウントする必要があります.GLKitコードでは,深さテストのオンは非常に簡単である.
glEnable(GL_DEPTH_TEST);
を呼び出して、新しいコンテキストで深さテストを開始します. // OpenGL ES
self.mContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView* view = (GLKView *)self.view;
view.context = self.mContext;
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[EAGLContext setCurrentContext:self.mContext];
glEnable(GL_DEPTH_TEST);
シーンをレンダリングする場合は、
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearパラメータをGL_DEPTH_BUFFER_BIT
に追加します./**
*
*/
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.mEffect prepareToDraw];
glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);
}
まとめ
OpenGL ESの入門はもう少なく、後には多くの知識があり、必要に応じて勉強すればいい.このいくつかのチュートリアルをまとめるのに1週間ほどかかりました.学習の過程で最もつらい部分はいくつかあります.
最後の感想は、コンピュータグラフィックと線形代数は結局基礎であり、自分で多くの時間をかけて勉強し、核心競争力に育成するのは非常に良い.