2012-02-20 1 views
6

私はOpenGL ES 2.0ゲームを作成しています(iOS上)。シェーダを作成するにはどうすればよいですか(シェーダで行う方が簡単だと思います)ので、原点(Z軸上)から遠いジオメトリは暗く見えますか?この画像でOpenGL ES 2.0で奥行きに基づいて物を色付けするにはどうすればいいですか?

水は私が考えている効果

Zarch http://www.bytecellar.com/wp-content/uploads/2010/12/Zarch_screen.png

+0

おそらく、Open GL ES 2.0の照明を探してください。 – Lordalcol

答えて

8

を示しているあなたは自分のジオメトリのZ位置を使用したい場合、これは行うことは非常に簡単です。私は例を持っている

Depth-shaded OpenGL teapot

:以下表情を生み出す

attribute vec4 position; 

varying float zDepth; 

uniform mat4 modelViewProjMatrix; 

void main() 
{ 
    vec4 newPosition = modelViewProjMatrix * position; 
    gl_Position = newPosition; 
    zDepth = (2.0 - (1.0 + newPosition.z))/2.0; 
} 

とフラグメントシェーダのような

varying highp float zDepth; 

void main() 
{ 
    gl_FragColor = vec4(zDepth, zDepth, 0.0, 1.0); 
} 

:あなたは、次のように頂点シェーダを持つことができますこれはthis iPad sample codeです。私はOpenGL ES 2.0クラスのために組み立てました。

+0

これはうまくいきます。特に、オブジェクトの色を組み込むと効果的です。コード内の '2.0'は、あなたのz深度に関係なく変更する必要があります。 – Piku

0

@bradが提供するもので、かなり興味深いテストをしました。私はちょうどラインを変更する:

gl_FragColor = vec4(1.0, 1.0, 0.0, zDepth); 

アルファに何も起こらない。それは私ですか、それともAlphaのようなものがありますか?

+0

glBlendFuncが設定されていないだけでなく、ほとんどの深度値が1に近いか、GL_BLENDが無効になっています。 –

関連する問題