私はopenGLで大気散乱を実装しようとしています。私はチュートリアルとしてこの "論文"を使用しています: http://developer.amd.com/wordpress/media/2012/10/GDC_02_HoffmanPreetham.pdf大気光散乱の実装
しかし、私はいくつかの点を理解し、いくつかの定数を理解するためにいくつかの困難を抱えています。
基本的に私は、これらの式を実装するためにしました。■ドームまで目からの距離や光源(ここでは日)の位置に、目からの距離がある場合
は、第一に、私は知りません。 angle thetaと同じです。私は、地面から太陽に向かう角度か、目が見ているドームの位置にあるのか分かりません。
次のスライド: 空の青い色が表示されます。レイリー散乱の原因だとわかっていますが、理解できないものがあります。上の公式の計算はすべて私にスカラーを与えます:太陽の白色光が基本的に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;
}
私は私が期待しています何を得ることはありません、ここで私が得るものです:
私は青を持っており、赤い夕日はありませんが、太陽は低く、私が見た別のチュートリアルによれば、太陽が低くなると赤みを帯びた色が現れるはずです。
「太陽の白い光*」太陽が白い光を放つわけではありません。 –
@JimZerあなたの照明は過飽和(画像の色深度がはるかに高い)しているので、白い部分が切り取られています。すべてのチャンネルをチャンネルごとではなく単一のベクターとして切り捨てる必要があります。また私の散乱を見てくださいhttp://stackoverflow.com/a/19659648/2521214少しシンプルです – Spektre