瀏覽代碼

Fix Sky Shader. Should now work on Windows and Mac (#5602)

- use simplified Rayleigh function for performance and ANGLE
- add back original in case anyone wishes to experiment wavelengths
Joshua Koo 10 年之前
父節點
當前提交
7644de76d6
共有 1 個文件被更改,包括 21 次插入3 次删除
  1. 21 3
      examples/js/SkyShader.js

+ 21 - 3
examples/js/SkyShader.js

@@ -75,6 +75,14 @@ THREE.ShaderLib['sky'] = {
 		"const float e = 2.71828182845904523536028747135266249775724709369995957;",
 		"const float e = 2.71828182845904523536028747135266249775724709369995957;",
 		"const float pi = 3.141592653589793238462643383279502884197169;",
 		"const float pi = 3.141592653589793238462643383279502884197169;",
 
 
+		"const float n = 1.0003; // refractive index of air",
+		"const float N = 2.545E25; // number of molecules per unit volume for air at",
+								"// 288.15K and 1013mb (sea level -45 celsius)",
+		"const float pn = 0.035;	// depolatization factor for standard air",
+
+		"// wavelength of used primaries, according to preetham",
+		"const vec3 lambda = vec3(680E-9, 550E-9, 450E-9);",
+
 		"// mie stuff",
 		"// mie stuff",
 		"// K coefficient for the primaries",
 		"// K coefficient for the primaries",
 		"const vec3 K = vec3(0.686, 0.678, 0.666);",
 		"const vec3 K = vec3(0.686, 0.678, 0.666);",
@@ -93,10 +101,18 @@ THREE.ShaderLib['sky'] = {
 		"const float cutoffAngle = pi/1.95;",
 		"const float cutoffAngle = pi/1.95;",
 		"const float steepness = 1.5;",
 		"const float steepness = 1.5;",
 
 
+
+		"vec3 totalRayleigh(vec3 lambda)",
+		"{",
+			"return (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn));",
+		"}",
+
+		// see http://blenderartists.org/forum/showthread.php?321110-Shaders-and-Skybox-madness
 		"// A simplied version of the total Reayleigh scattering to works on browsers that use ANGLE",
 		"// A simplied version of the total Reayleigh scattering to works on browsers that use ANGLE",
-		"vec3 totalRayleigh()",
+		"vec3 simplifiedRayleigh()",
 		"{",
 		"{",
 			"return 0.0005 / vec3(94, 40, 18);",
 			"return 0.0005 / vec3(94, 40, 18);",
+			// return 0.00054532832366 / (3.0 * 2.545E25 * pow(vec3(680E-9, 550E-9, 450E-9), vec3(4.0)) * 6.245);
 		"}",
 		"}",
 
 
 		"float rayleighPhase(float cosTheta)",
 		"float rayleighPhase(float cosTheta)",
@@ -156,7 +172,9 @@ THREE.ShaderLib['sky'] = {
 
 
 			"// extinction (absorbtion + out scattering) ",
 			"// extinction (absorbtion + out scattering) ",
 			"// rayleigh coefficients",
 			"// rayleigh coefficients",
-			"vec3 betaR = totalRayleigh() * reileighCoefficient;",
+
+			// "vec3 betaR = totalRayleigh(lambda) * reileighCoefficient;",
+			"vec3 betaR = simplifiedRayleigh() * reileighCoefficient;",
 
 
 			"// mie coefficients",
 			"// mie coefficients",
 			"vec3 betaM = totalMie(lambda, K, turbidity) * mieCoefficient;",
 			"vec3 betaM = totalMie(lambda, K, turbidity) * mieCoefficient;",
@@ -248,4 +266,4 @@ THREE.Sky = function () {
 	this.uniforms = skyUniforms;
 	this.uniforms = skyUniforms;
 
 
 
 
-};
+};