ページ 11

OpenGL ES2.0でテクスチャの透明度を連続的に変える

Posted: 2012年12月31日(月) 14:35
by HK
Objective-C + OpenGL ES 2.0 で iPhone用の簡単なゲームを作っています。
ゲームの全体像はできており、あとは描画処理を工夫して見た目をきれいに整えるだけというところです。

そこで、特定の画像”だけ”を、透明度を連続的に変化させたいと考えています。
イメージとしては、幽霊みたいな画像を、透明→半透明→不透明→半透明→透明 という感じです。

いまは全ての画像が同じブレンド方法で描画されています。コードは以下です。
http://www.raywenderlich.com/9743/how-t ... kit-part-1
を参考にしています。)

コード:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { //毎フーレム呼ばれるメソッド
    glClearColor(1, 0.9, 0.9, 1);  //背景色
    glClear(GL_COLOR_BUFFER_BIT);  //バッファをクリア
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  //ブレンド方法の指定
    glEnable(GL_BLEND);  //ブレンドを使えるようにする
    [self.scene renderWithModelViewMatrix:GLKMatrix4Identity]; //レンダー(以下参照)
}
-------------

コード:

- (void)renderWithModelViewMatrix:(GLKMatrix4)modelViewMatrix { //レンダー
    [super renderWithModelViewMatrix:modelViewMatrix];  
    self.effect.texture2d0.name = self.textureInfo.name; 
    self.effect.texture2d0.enabled = YES;
    self.effect.transform.modelviewMatrix = GLKMatrix4Multiply(modelViewMatrix, [self modelMatrix:YES]);
    [self.effect prepareToDraw];

   /*-------ポリゴンの位置座標、テクスチャの座標の計算をしている部分------------------------*/
    long offset = (long)&_quad;
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex),
    (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), 
    (void *) (offset + offsetof(TexturedVertex, textureVertex)));
   /*---------------------------------------------------------------------------------------------------------*/

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //描画
}
全てのスプライトに対して同じ方法で描画を行っているのが問題かなと考えています。
自分の考えでは、各スプライトごとに透明度を保持するプロパティ(例: ghost.alpha )を与え、その透明度を以て描画できればいいな と考えています。


iPhoneアプリを作り始めて日が浅いのでわからないことばかりです。
なにか些細なヒントでも良いので、お気付きの点がございましたらお教えください。よろしくお願いします。

Re: OpenGL ES2.0でテクスチャの透明度を連続的に変える

Posted: 2012年12月31日(月) 16:06
by ISLe
HK さんが書きました:自分の考えでは、各スプライトごとに透明度を保持するプロパティ(例: ghost.alpha )を与え、その透明度を以て描画できればいいな と考えています。
未確認ですが、描画する前後をglColor4f等で挟んで、α値を設定すると反映されるらしいです。

コード:

glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
// ここで描画したものは50%の透明度
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

Re: OpenGL ES2.0でテクスチャの透明度を連続的に変える

Posted: 2012年12月31日(月) 17:05
by HK
返信ありがとうございます。
示していただいた通りにやっても、私の書き方が悪いのか、透過されませんでした。また、特定のシーンを描画しようとするとアプリが強制終了するという謎のバグもでました。う〜ん。もうちょっと色々試してみて、何かわかったらご報告致します。

他に、なにか良いアイデアがございましたら教えてください。

Re: OpenGL ES2.0でテクスチャの透明度を連続的に変える

Posted: 2013年1月01日(火) 23:59
by HK
あけましておめでとうございます。
解決方法がわかりましたので記しておきます。

GLKitというフレームワークを用いて、乗算するRGBAカラーを指定してから描画するとうまくいきました。そのRGBAは
GLKVector4Make(1.0,1.0,1.0,0.5); のように指定すればOKでした。

ご協力ありがとうございました。