2012-03-25 3 views
4

非常にシンプルな空を生成しようとする試みの一環として、スカイボックス(基本的に(-1、-1、-1)から(1,1,1)私のジオメトリのすべての後に描かれ、次のような単純なバーテックスシェーダを経由してバックを余儀なくされた。このことからシンプルな手続きスカイボックス

#version 330 
layout(location = 0) in vec4 position; 
layout(location = 1) in vec4 normal; 

out Data 
{ 
    vec4 eyespace_position; 
    vec4 eyespace_normal; 
    vec4 worldspace_position; 
    vec4 raw_position; 
} vtx_data; 

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 

void main() 
{ 
    mat4 view_without_translation = view; 
    view_without_translation[3][0] = 0.0f; 
    view_without_translation[3][1] = 0.0f; 
    view_without_translation[3][2] = 0.0f; 

    vtx_data.raw_position = position; 
    vtx_data.worldspace_position = model * position; 
    vtx_data.eyespace_position = view_without_translation * vtx_data.worldspace_position; 

    gl_Position = (projection * vtx_data.eyespace_position).xyww; 
} 

、私は、深い青色から非常に単純な勾配としての私の空のディスプレイを持ってしようとしています

明らかに、各フラグメントのY座標に基づいて私の2つの色を混ぜることは非常に悪く見えます:あなたがドームではなくボックスを見ているという事実は、すぐにクリアRとしては、ここに見られる:

wrong skybox

注ボックスの左上と右上にはかなり目に見える「コーナー」。

本来、各断片の位置を正規化し、単位球上の位置を取得し、次にそれのY座標を取ることが明らかになったと考えていました。私は、もしそれが理にかなっているならば、与えられた "高度"に対して一定であろう値をもたらすと思った。このように:

#version 330 
in Data 
{ 
    vec4 eyespace_position; 
    vec4 eyespace_normal; 
    vec4 worldspace_position; 
    vec4 raw_position; 
} vtx_data; 

out vec4 outputColor; 

const vec4 skytop = vec4(0.0f, 0.0f, 1.0f, 1.0f); 
const vec4 skyhorizon = vec4(0.3294f, 0.92157f, 1.0f, 1.0f); 

void main() 
{ 
    vec4 pointOnSphere = normalize(vtx_data.worldspace_position); 
    float a = pointOnSphere.y; 
    outputColor = mix(skyhorizon, skytop, a); 
} 

結果は、しかし、(必要であれば、私はそれを投稿することができますが、それは最初に視覚的に似ているので、私は今この質問を短くするために、それをスキップしています)くらいの最初のスクリーンショットと同じです。

は、いくつかのランダムなあいた後(カーゴ・カルト・プログラミング、私が知っている:/):

void main() 
{ 
    vec3 pointOnSphere = normalize(vtx_data.worldspace_position.xyz); 
    float a = pointOnSphere.y; 
    outputColor = mix(skyhorizon, skytop, a); 
} 

唯一の違いは、私はそれがWコンポーネントのなしで位置を正規化することで、私はこれが機能することを実現しました。ここ

とは、作業の結果だ:だから(差はスクリーンショットでは微妙ですが、運動ではかなり顕著です) correct skybox

、最終的には、私の質問:以前のバージョンが失敗したときに、なぜこの仕事をしますか?私は同質の座標について非常に基本的なことを誤解しているに違いないが、私の脳は今すぐクリックしていない!

答えて

3

GLSL normalizeは、均質座標そのものを処理しません。座標はR^4に属すると解釈されます。これは一般的にあなたが望むものではありません。ただし、vtx_data.worldspace_position.w == 0の場合、正規化は同じ結果を生成するはずです。

vec3 pointOnSphere = normalize(vtx_data.worldspace_position);の意味はわかりません。左側には、タイプvec4もあるはずですから。

+0

vec3 pointOnSphere = normalize(vtx_data.worldspace_position)は、この質問のスクリーンショットを生成するためのコードを飛ばしている間、私の一部の誤字です。o申し訳ありません!答えに感謝します! –