2016-05-08 7 views
1

私はopenGLで大気散乱を実装しようとしています。私はチュートリアルとしてこの "論文"を使用しています: http://developer.amd.com/wordpress/media/2012/10/GDC_02_HoffmanPreetham.pdf大気光散乱の実装

しかし、私はいくつかの点を理解し、いくつかの定数を理解するためにいくつかの困難を抱えています。

基本的に私は、これらの式を実装するためにしました。■ドームまで目からの距離や光源(ここでは日)の位置に、目からの距離がある場合enter image description here

は、第一に、私は知りません。 angle thetaと同じです。私は、地面から太陽に向かう角度か、目が見ているドームの位置にあるのか分かりません。

次のスライド: enter image description here 空の青い色が表示されます。レイリー散乱の原因だとわかっていますが、理解できないものがあります。上の公式の計算はすべて私にスカラーを与えます:太陽の白色光が基本的にvec3(1,1,1)である方法はスカラーで掛け合わせると青色になりますが、それはグレースケールでしか得られませんvec3(0.8,0.8,0.8)のような結果が得られるからです。私は、いくつかの異なる空の色が表示される場合、RGB値を別々に変更するために太陽光をvec3で掛けなければなりません。

シェーダの実装にいくつかの問題が発生しました。ここで 空シェーダのコードです:

#version 330 

in vec3 vpoint; 

in vec2 vtexcoord; 


out vec2 uv; 


out vec3 atmos; 


uniform mat4 M; 

uniform mat4 V; 

uniform mat4 P; 


mat4 MVP = P*V*M; 



//uniform vec3 lpos; 

vec3 lpos = vec3(100,0,0); 

uniform vec3 cpos; 



vec3 br = vec3(5.5e-6, 13.0e-6, 22.4e-6); 

vec3 bm = vec3(21e-6); 





float g = -0.75f; 


vec3 Esun = vec3(2000,2000,2000); 




vec3 Br(float theta){ 
return 3/(16*3.14) * br * (1+cos(theta)*cos(theta)); 

} 


vec3 Bm(float theta){ 
return 1/(4*3.14) * bm * ((1 - g)*(1 - g))/(pow(1+g*g- 
2*g*cos(theta),3/2)); 

} 


vec3 atmospheric(float theta, float s){ 
return (Br(theta)*Bm(theta))/(br+bm) * Esun * (1- exp(-(br+bm)*s)); 

} 


void main() { 

gl_Position = MVP * vec4(vpoint, 1.0); 
uv = vtexcoord; 

vec3 domePos = vec3(M*vec4(vpoint,1.0)); 

vec3 ldir = lpos - domePos; 

float s = length(domePos-cpos); 
float theta = acos(dot(normalize(ldir-domePos),normalize(domePos- 
cpos)*vec3(1,1,0))); 

atmos = atmospheric(theta,s)*1000000*5; 

} 

私は私が期待しています何を得ることはありません、ここで私が得るものです:

enter image description here

私は青を持っており、赤い夕日はありませんが、太陽は低く、私が見た別のチュートリアルによれば、太陽が低くなると赤みを帯びた色が現れるはずです。

+0

「太陽の白い光*」太陽が白い光を放つわけではありません。 –

+0

@JimZerあなたの照明は過飽和(画像の色深度がはるかに高い)しているので、白い部分が切り取られています。すべてのチャンネルをチャンネルごとではなく単一のベクターとして切り捨てる必要があります。また私の散乱を見てくださいhttp://stackoverflow.com/a/19659648/2521214少しシンプルです – Spektre

答えて

1

警告私はこの分野の専門家ではありませんが、これを塩の塊で取ってください。

s and Theta meanings これはほとんどすべてを言います。

sは、頂点/ピクセルとカメラの距離です。
θは太陽と視線のなす角度です。

θを計算するには、「黄色の線」と「視線」を知る必要があります。
後者は通常のシェーダの計算です。前者は、太陽がどれほど空に浮かぶかを表現する単なる方法です。太陽から地上の地点までの光線としてモデル化できます。


上記の数式はすべてベクトルです。
Lはベクターである。
e 太陽もベクターです。

スライドは基本的に下剤の概念ラディアンスと放射照度(E のようにスペクトル上で連続していると1つのライトと色を記述するためにスペクトルパワー分布を使用すべきであると述べています。
しかしながら、より高速なアプローチは、スペクトルの3つの点、すなわちR、G、およびB波長のためのものだけで数学を行うことである。
実際にはE 太陽は、3つのRGB波長の太陽の放射照度を表すベクトルです。

空の青に着色されている空の断片の高度に依存する「視線」に依存θに依存パラメータβ Rから来ます。

+0

ニース、私ははるかに理解することができます。 しかし、私は青と夕焼けがありませんが、太陽は低く、私が見た別のチュートリアルによれば、太陽が低くなると赤みを帯びた色が現れます。 私は何を得ることができる私のポストを更新します: あなたはアイデアがありますか? – JimZer

関連する問題