OpenGLの透過&深度
JitterのOpenGLにおいて、透過テクスチャを使う場合は、@blendenable 1 @depthenable 0 と設定します。ただし、その方法では奥行き(Z軸)も使ったポイントスプライト等の描画(@depathenable 1)をしたい場合に、上記画像のようにテクスチャの枠が出てしまう問題があります。描画するメッシュのZ座標が「画家のアルゴリズム」で想定される順番と逆方向に並んでいるために、手前の画像を描く方が先だと、後ろの画像がdepth testで描画されなくなっちゃうんですね。Zソートが出来れば良いですが、Jitterには実装されていないようです。
GLSLを使ったAlpha Test(アルファテスト)
上記問題を解決するために、Alpha Testという方法があります。OpenGLのWikiに載っていたのですが、フラグメントシェーダで透過値が0なら描画をキャンセルすればOKという簡単な手法です。ただし、この方法は透過がbinaryつまり0か1のどちらかしか無い場合にしか使えないようです。
上記画像はポイントスプライトのGLSLに追加で実装してみた結果です。綺麗に描画されましたね。
GLSL / Fragment Shader
[c]
#version 120
uniform sampler2DRect tex0;
void main (void)
{
vec4 texel = texture2DRect(tex0, gl_TexCoord[0].st);
//Alpha Test
if(texel.a < 1.0)
discard;
gl_FragColor = texel;
}
[/c]
半透明ポリゴンは・・・?
Wikiに書いてあるように、Depth Sort(Z軸でメッシュの並べ替え)が必要です。Sortの方法にはBSP Tree Sorting(バイナリ空間分割)やDepth peelingという手法があるそうです。そのうち必要になったら実装してみたいと思います。
おぱんちゅ
ぱんつつくった by 貞子♂様 ありがとうございます!