diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/environment')
6 files changed, 234 insertions, 103 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl index f0837dd4ca..18f6d91804 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl @@ -1,4 +1,4 @@ -/**  +/**   * @file terrainF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ @@ -27,22 +27,38 @@  out vec4 gl_FragColor;  #endif -uniform sampler2D detail0; -uniform sampler2D detail1; -uniform sampler2D alphaRamp; +VARYING vec4 vertex_color; +VARYING vec4 vary_texcoord0; +VARYING vec4 vary_texcoord1; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; +uniform sampler2D detail_0; +uniform sampler2D detail_1; +uniform sampler2D detail_2; +uniform sampler2D detail_3; +uniform sampler2D alpha_ramp; -void main()  +vec3 atmosLighting(vec3 light); + +vec3 scaleSoftClip(vec3 color); + +void main()  { -	float a = texture2D(alphaRamp, vary_texcoord1.xy).a; -	vec3 color = mix(texture2D(detail1, vary_texcoord2.xy).rgb, -					 texture2D(detail0, vary_texcoord0.xy).rgb, -					 a); +	/// Note: This should duplicate the blending functionality currently used for the terrain rendering. +	 +	/// TODO Confirm tex coords and bind them appropriately in vert shader. +	vec4 color0 = texture2D(detail_0, vary_texcoord0.xy); +	vec4 color1 = texture2D(detail_1, vary_texcoord0.xy); +	vec4 color2 = texture2D(detail_2, vary_texcoord0.xy); +	vec4 color3 = texture2D(detail_3, vary_texcoord0.xy); -	gl_FragColor.rgb = color; -	gl_FragColor.a = texture2D(alphaRamp, vary_texcoord3.xy).a; +	float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a; +	float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a; +	float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a; +	vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal ); +	 +	/// Add WL Components +	outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb); +	 +	gl_FragColor = vec4(scaleSoftClip(outColor.rgb), 1.0);  } + diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl index d4a62db684..f183b885d1 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl @@ -1,4 +1,4 @@ -/**  +/**   * @file terrainV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ @@ -25,9 +25,6 @@  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0; -uniform mat4 texture_matrix1; -uniform mat4 texture_matrix2; -uniform mat4 texture_matrix3;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; @@ -39,14 +36,12 @@ ATTRIBUTE vec3 normal;  ATTRIBUTE vec4 diffuse_color;  ATTRIBUTE vec2 texcoord0;  ATTRIBUTE vec2 texcoord1; -ATTRIBUTE vec2 texcoord2; -ATTRIBUTE vec2 texcoord3;  VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; +VARYING vec4 vary_texcoord0; +VARYING vec4 vary_texcoord1; + +void calcAtmospherics(vec3 inPositionEye);  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); @@ -68,16 +63,26 @@ void main()  {  	//transform vertex  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); -			 -	vec4 pos = modelview_matrix * vec4(position, 1.0); + +	vec4 pos = modelview_matrix * vec4(position.xyz, 1.0);  	vec3 norm = normalize(normal_matrix * normal); -	 -	vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), diffuse_color); + +	calcAtmospherics(pos.xyz); + +	/// Potentially better without it for water. +	pos /= pos.w; + +	vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0));  	vertex_color = color; + +	// Transform and pass tex coords + 	vary_texcoord0.xy = texgen_object(vec4(position.xyz, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy; -	vary_texcoord0 = texgen_object(vec4(position.xyz, 1.0),vec4(texcoord0,0,1),texture_matrix0,object_plane_s,object_plane_t).xy; -	vary_texcoord1 = (texture_matrix1*vec4(texcoord1,0,1)).xy; -	vary_texcoord2 = texgen_object(vec4(position.xyz, 1.0),vec4(texcoord2,0,1),texture_matrix2,object_plane_s,object_plane_t).xy; -	vary_texcoord3 = (texture_matrix3*vec4(texcoord3,0,1)).xy; +	vec4 t = vec4(texcoord1,0,1); +	 +	vary_texcoord0.zw = t.xy; +	vary_texcoord1.xy = t.xy-vec2(2.0, 0.0); +	vary_texcoord1.zw = t.xy-vec2(1.0, 0.0);  } + diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl index b84f29423f..e5c7ced52c 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl @@ -1,4 +1,4 @@ -/**  +/**   * @file terrainWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ @@ -27,24 +27,39 @@  out vec4 gl_FragColor;  #endif -// this class1 shader is just a copy of terrainF +VARYING vec4 vertex_color; +VARYING vec4 vary_texcoord0; +VARYING vec4 vary_texcoord1; -uniform sampler2D detail0; -uniform sampler2D detail1; -uniform sampler2D alphaRamp; +uniform sampler2D detail_0; +uniform sampler2D detail_1; +uniform sampler2D detail_2; +uniform sampler2D detail_3; +uniform sampler2D alpha_ramp; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; +vec3 atmosLighting(vec3 light); -void main()  +vec4 applyWaterFog(vec4 color); + +void main()  { -	float a = texture2D(alphaRamp, vary_texcoord1.xy).a; -	vec3 color = mix(texture2D(detail1, vary_texcoord2.xy).rgb, -					 texture2D(detail0, vary_texcoord0.xy).rgb, -					 a); +	/// Note: This should duplicate the blending functionality currently used for the terrain rendering. +	 +	/// TODO Confirm tex coords and bind them appropriately in vert shader. +	vec4 color0 = texture2D(detail_0, vary_texcoord0.xy); +	vec4 color1 = texture2D(detail_1, vary_texcoord0.xy); +	vec4 color2 = texture2D(detail_2, vary_texcoord0.xy); +	vec4 color3 = texture2D(detail_3, vary_texcoord0.xy); -	gl_FragColor.rgb = color; -	gl_FragColor.a = texture2D(alphaRamp, vary_texcoord3.xy).a; +	float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a; +	float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a; +	float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a; +	vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal ); +	 +	/// Add WL Components +	outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb); +	 +	outColor = applyWaterFog(outColor); +	gl_FragColor = outColor;  } + diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl index 2e138d35bf..1fdb90f792 100644 --- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl @@ -30,31 +30,75 @@ out vec4 gl_FragColor;  uniform sampler2D diffuseMap;  uniform sampler2D bumpMap;     uniform sampler2D screenTex; +uniform sampler2D refTex; +uniform sampler2D screenDepth; +uniform vec4 fogCol; +uniform vec3 lightDir; +uniform vec3 specular; +uniform float lightExp; +uniform vec2 fbScale;  uniform float refScale; +uniform float znear; +uniform float zfar; +uniform float kd; +uniform vec4 waterPlane; +uniform vec3 eyeVec;  uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; +uniform vec2 screenRes;  //bigWave is (refCoord.w, view.w);  VARYING vec4 refCoord;  VARYING vec4 littleWave;  VARYING vec4 view; -void main()  +vec4 applyWaterFog(vec4 color, vec3 viewVec)  { -	vec4 color;     +	//normalize view vector +	vec3 view = normalize(viewVec); +	float es = -view.z; + +	//find intersection point with water plane and eye vector -	//get bigwave normal -	vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0; -     -	//get detail normals -	vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75; -	dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25; -	     -	//interpolate between big waves and little waves (big waves in deep water) -	wavef = (wavef+dcol)*0.5; +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	//get object depth +	float depth = length(viewVec); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	//return vec4(1.0, 0.0, 1.0, 1.0); +	return color * D + kc * L; +	//depth /= 10.0; +	//return vec4(depth,depth,depth,0.0); +} -	//crunch normal to range [-1,1] -	wavef -= vec3(1,1,1); +void main()  +{ +	vec4 color; +	     +	//get detail normals +	vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;     +	vec3 wavef = normalize(wave1+wave2+wave3);  	//figure out distortion vector (ripply)     	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5; @@ -62,6 +106,5 @@ void main()  	vec4 fb = texture2D(screenTex, distort); -	gl_FragColor.rgb = mix(waterFogColor.rgb, fb.rgb, waterFogColor.a * 0.001 + 0.999); -	gl_FragColor.a = fb.a; +	gl_FragColor = applyWaterFog(fb,view.xyz);  } diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl index 1512074dda..444c896d38 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl @@ -29,16 +29,13 @@ out vec4 gl_FragColor;  vec3 scaleSoftClip(vec3 inColor);  vec3 atmosTransport(vec3 inColor); -vec3 applyWaterFog(vec4 inColor); -uniform sampler2D diffuseMap;  uniform sampler2D bumpMap;     uniform sampler2D screenTex;  uniform sampler2D refTex;  uniform float sunAngle;  uniform float sunAngle2; -uniform float scaledAngle;  uniform vec3 lightDir;  uniform vec3 specular;  uniform float lightExp; @@ -49,7 +46,7 @@ uniform vec3 normScale;  uniform float fresnelScale;  uniform float fresnelOffset;  uniform float blurMultiplier; -uniform vec4 fogCol; +  //bigWave is (refCoord.w, view.w);  VARYING vec4 refCoord; @@ -58,58 +55,83 @@ VARYING vec4 view;  void main()   { -	vec3 viewVec = view.xyz;  	vec4 color; -	float dist = length(viewVec.xy); +	float dist = length(view.xy);  	//normalize view vector -	viewVec = normalize(viewVec); +	vec3 viewVec = normalize(view.xyz);  	//get wave normals -	vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0; - -	//get detail normals -	vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75; -	dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25; - -	//interpolate between big waves and little waves (big waves in deep water) -	wavef = (wavef + dcol) * 0.5; -	 -	//crunch normal to range [-1,1] -	wavef -= vec3(1,1,1); -	wavef = normalize(wavef); -    +	vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;  	//get base fresnel components	 -	float df = dot(viewVec,wavef) * fresnelScale + fresnelOffset; +	vec3 df = vec3( +					dot(viewVec, wave1), +					dot(viewVec, (wave2 + wave3) * 0.5), +					dot(viewVec, wave3) +				 ) * fresnelScale + fresnelOffset; +	df *= df;  	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;  	float dist2 = dist;  	dist = max(dist, 5.0); +	float dmod = sqrt(dist); +	 +	vec2 dmod_scale = vec2(dmod*dmod, dmod); +	  	//get reflected color -	vec2 refdistort = wavef.xy*dot(normScale, vec3(0.333)); -	vec2 refvec = distort+refdistort/dist; -	vec4 refcol = texture2D(refTex, refvec); +	vec2 refdistort1 = wave1.xy*normScale.x; +	vec2 refvec1 = distort+refdistort1/dmod_scale; +	vec4 refcol1 = texture2D(refTex, refvec1); +	 +	vec2 refdistort2 = wave2.xy*normScale.y; +	vec2 refvec2 = distort+refdistort2/dmod_scale; +	vec4 refcol2 = texture2D(refTex, refvec2); +	 +	vec2 refdistort3 = wave3.xy*normScale.z; +	vec2 refvec3 = distort+refdistort3/dmod_scale; +	vec4 refcol3 = texture2D(refTex, refvec3); + +	vec4 refcol = refcol1 + refcol2 + refcol3; +	float df1 = df.x + df.y + df.z; +	refcol *= df1 * 0.333; +	 +	vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5; +	 +	wavef.z *= max(-viewVec.z, 0.1); +	wavef = normalize(wavef); +	 +	float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset; +	 +	vec2 refdistort4 = wavef.xy*0.125; +	refdistort4.y -= abs(refdistort4.y); +	vec2 refvec4 = distort+refdistort4/dmod; +	float dweight = min(dist2*blurMultiplier, 1.0); +	vec4 baseCol = texture2D(refTex, refvec4); +	refcol = mix(baseCol*df2, refcol, dweight);  	//get specular component  	float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0); -	 +		  	//harden specular -	spec = pow(spec, lightExp); +	spec = pow(spec, 128.0);  	//figure out distortion vector (ripply)    -	vec2 distort2 = distort+wavef.xy*refScale/max(dist*df, 1.0); +	vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);  	vec4 fb = texture2D(screenTex, distort2);  	//mix with reflection -	color.rgb = mix(mix(fogCol.rgb, fb.rgb, fogCol.a), refcol.rgb, df); +	// Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug +	color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);  	color.rgb += spec * specular; -	//color.rgb = applyWaterFog(color);//atmosTransport(color.rgb); +	color.rgb = atmosTransport(color.rgb);  	color.rgb = scaleSoftClip(color.rgb);  	color.a = spec * sunAngle2; diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl index 45bd5c8b42..4bdfce9260 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl @@ -25,20 +25,50 @@ - +uniform vec4 lightnorm; +uniform vec4 waterPlane;  uniform vec4 waterFogColor; -uniform float waterFogEnd; +uniform float waterFogDensity; +uniform float waterFogKS; + +vec3 getPositionEye();  vec4 applyWaterFog(vec4 color)  { -	// GL_EXP2 Fog -	//float fog = exp(-gl_Fog.density * gl_Fog.density * fog_depth * fog_depth); -	// GL_EXP Fog -	// float fog = exp(-gl_Fog.density * fog_depth); -	// GL_LINEAR Fog -	float fog = (waterFogEnd - fog_depth) * gl_Fog.scale; -	fog = clamp(fog, 0.0, 1.0); -	color.rgb = mix(waterFogColor.rgb, color.rgb, fog); +	//normalize view vector +	vec3 view = normalize(getPositionEye()); +	float es = -(dot(view, waterPlane.xyz)); + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0); +	 +	//get object depth +	float depth = length(getPositionEye() - int_v); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	 +	color.rgb = color.rgb * D + kc.rgb * L; +	color.a = kc.a + color.a; +	  	return color;  } | 
