diff options
Diffstat (limited to 'indra')
12 files changed, 138 insertions, 376 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index bd5e9dd758..0fad5b4b50 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -10,13 +10,11 @@  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap; -uniform sampler2DRect giLightMap;  uniform float dist_factor;  uniform float blur_size;  uniform vec2 delta; -uniform vec3 kern[32]; -uniform int kern_length; +uniform vec3 kern[4];  uniform float kern_scale;  varying vec2 vary_fragcoord; @@ -50,7 +48,7 @@ void main()  	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'  	vec4 col = defined_weight.xyxx * ccol; -	for (int i = 1; i < kern_length; i++) +	for (int i = 1; i < 4; i++)  	{  		vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;  	        vec3 samppos = getPosition(tc).xyz;  @@ -61,12 +59,22 @@ void main()  			defined_weight += kern[i].xy;  		}  	} +	for (int i = 1; i < 4; i++) +	{ +		vec2 tc = vary_fragcoord.xy - kern[i].z*dlt; +	        vec3 samppos = getPosition(tc).xyz;  +		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +		if (d*d <= 0.003) +		{ +			col += texture2DRect(lightMap, tc)*kern[i].xyxx; +			defined_weight += kern[i].xy; +		} +	}  	col /= defined_weight.xyxx;  	gl_FragColor = col; -	 -	//gl_FragColor = ccol;  } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 2c8d90d1a6..82e9450e68 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -7,6 +7,8 @@  #version 120 +//class 1 -- no shadows +  #extension GL_ARB_texture_rectangle : enable  uniform sampler2DRect diffuseRect; @@ -14,7 +16,6 @@ uniform sampler2DRect specularRect;  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform samplerCube environmentMap; -uniform sampler2DRect lightMap;  uniform sampler2D noiseMap;  uniform sampler2D lightFunc;  uniform sampler2D projectionMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index b4b0d0ce9d..9cf60aad48 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -11,6 +11,7 @@ uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect positionMap;  uniform sampler2DRect normalMap; +uniform sampler2DRect lightMap;  uniform sampler2DRect depthMap;  uniform sampler2D	  noiseMap;  uniform samplerCube environmentMap; @@ -40,7 +41,7 @@ uniform float scene_light_strength;  uniform vec3 env_mat[3];  //uniform mat4 shadow_matrix[3];  //uniform vec4 shadow_clip; -//uniform mat3 ssao_effect_mat; +uniform mat3 ssao_effect_mat;  varying vec4 vary_light;  varying vec2 vary_fragcoord; @@ -178,7 +179,17 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  	temp2.x += .25;  	//increase ambient when there are more clouds -	vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;	 +	vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5; +	 +	/*  decrease value and saturation (that in HSV, not HSL) for occluded areas +	 * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html +	 * // The following line of code performs the equivalent of: +	 * float ambAlpha = tmpAmbient.a; +	 * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis +	 * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); +	 * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); +	 */ +	tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);  	//haze color  	setAdditiveColor( @@ -250,10 +261,14 @@ void main()  	vec4 diffuse = texture2DRect(diffuseRect, tc);  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	calcAtmospherics(pos.xyz, 0.0); +	vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +	float scol = max(scol_ambocc.r, diffuse.a);  +	float ambocc = scol_ambocc.g; +	 +	calcAtmospherics(pos.xyz, ambocc);  	vec3 col = atmosAmbient(vec3(0)); -	col += atmosAffectDirectionalLight(clamp(da, diffuse.a, 1.0)); +	col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));  	col *= diffuse.rgb; @@ -261,12 +276,12 @@ void main()  	{  		vec3 ref = normalize(reflect(pos.xyz, norm.xyz));  		float sa = dot(ref, vary_light.xyz); -		col.rgb += vary_SunlitColor*spec.rgb*texture2D(lightFunc, vec2(sa, spec.a)).a; +		col.rgb += vary_SunlitColor*scol_ambocc.r*spec.rgb*texture2D(lightFunc, vec2(sa, spec.a)).a;  	}  	col = atmosLighting(col);  	col = scaleSoftClip(col); -	 +		  	gl_FragColor.rgb = col;  	gl_FragColor.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 2a7234fd83..f320dbb400 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -161,17 +161,6 @@ void main()  		}  	} -	/*if (spec.a > 0.0) -	{ -		//vec3 ref = reflect(normalize(pos), norm); -		float sa = dot(normalize(lv-normalize(pos)),norm);; -		//sa = max(sa, 0.0); -		//sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0); -		sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); -		sa *= noise; -		col += da*sa*lcol*spec.rgb; -	}*/ -	  	gl_FragColor.rgb = col;	  	gl_FragColor.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl index fafc2ae3cc..56e4055c02 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl @@ -5,206 +5,11 @@   * $License$   */ -#extension GL_ARB_texture_rectangle : enable - -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform sampler2DRectShadow shadowMap0; -uniform sampler2DRectShadow shadowMap1; -uniform sampler2DRectShadow shadowMap2; -uniform sampler2DRectShadow shadowMap3; -uniform sampler2DRectShadow shadowMap4; -uniform sampler2DRectShadow shadowMap5; -uniform sampler2D noiseMap; - -uniform sampler2D		lightFunc; - - -// Inputs -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform float ssao_radius; -uniform float ssao_max_radius; -uniform float ssao_factor; -uniform float ssao_factor_inv; - -varying vec2 vary_fragcoord; -varying vec4 vary_light; - -uniform mat4 inv_proj; -uniform vec2 screen_res; - -uniform float shadow_bias; -uniform float shadow_offset; - -vec4 getPosition(vec2 pos_screen) -{ -	float depth = texture2DRect(depthMap, pos_screen.xy).a; -	vec2 sc = pos_screen.xy*2.0; -	sc /= screen_res; -	sc -= vec2(1.0,1.0); -	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); -	vec4 pos = inv_proj * ndc; -	pos /= pos.w; -	pos.w = 1.0; -	return pos; -} +//class 1, no shadow, no SSAO, should never be called -//calculate decreases in ambient lighting when crowded out (SSAO) -float calcAmbientOcclusion(vec4 pos, vec3 norm) -{ -	float ret = 1.0; -	 -	float dist = dot(pos.xyz,pos.xyz); -	 -	if (dist < 64.0*64.0) -	{ -		vec2 kern[8]; -		// exponentially (^2) distant occlusion samples spread around origin -		kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; -		kern[1] = vec2(1.0, 0.0) * 0.250*0.250; -		kern[2] = vec2(0.0, 1.0) * 0.375*0.375; -		kern[3] = vec2(0.0, -1.0) * 0.500*0.500; -		kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; -		kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; -		kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; -		kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; - -		vec2 pos_screen = vary_fragcoord.xy; -		vec3 pos_world = pos.xyz; -		vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; -		 -		float angle_hidden = 0.0; -		int points = 0; -		 -		float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); -		 -		// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) -		for (int i = 0; i < 8; i++) -		{ -			vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); -			vec3 samppos_world = getPosition(samppos_screen).xyz;  -			 -			vec3 diff = pos_world - samppos_world; -			float dist2 = dot(diff, diff); -			 -			// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area -			// --> solid angle shrinking by the square of distance -			//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 -			//(k should vary inversely with # of samples, but this is taken care of later) -			 -			//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces -			//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) -			angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); -			 -			// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  -			points = points + int(diff.z > -1.0); -		} -		 -		angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); -		 -		ret = (1.0 - (float(points != 0) * angle_hidden)); -		ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0); -	} -	 -	return min(ret, 1.0); -} +#extension GL_ARB_texture_rectangle : enable  void main()   { -	vec2 pos_screen = vary_fragcoord.xy; -	 -	//try doing an unproject here -	 -	vec4 pos = getPosition(pos_screen); -	 -    vec3 norm = texture2DRect(normalMap, pos_screen).xyz*2.0-1.0; -	 -	/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL -	{ -		gl_FragColor = vec4(0.0); // doesn't matter -		return; -	}*/ -	 -	float shadow = 1.0; -    float dp_directional_light = max(0.0, dot(norm, vary_light.xyz)); - -	vec4 spos = vec4(pos.xyz + norm.xyz * (-pos.z/64.0*shadow_offset+shadow_bias), 1.0); -	 -	//vec3 debug = vec3(0,0,0); -	 -	if (dp_directional_light == 0.0) -	{ -		// if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup -		shadow = 0.0; -	} -	else if (spos.z > -shadow_clip.w) -	{	 -		vec4 lpos; -		 -		if (spos.z < -shadow_clip.z) -		{ -			lpos = shadow_matrix[3]*spos; -			lpos.xy *= screen_res; -			shadow = shadow2DRectProj(shadowMap3, lpos).x; -			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); -		} -		else if (spos.z < -shadow_clip.y) -		{ -			lpos = shadow_matrix[2]*spos; -			lpos.xy *= screen_res; -			shadow = shadow2DRectProj(shadowMap2, lpos).x; -		} -		else if (spos.z < -shadow_clip.x) -		{ -			lpos = shadow_matrix[1]*spos; -			lpos.xy *= screen_res; -			shadow = shadow2DRectProj(shadowMap1, lpos).x; -		} -		else -		{ -			lpos = shadow_matrix[0]*spos; -			lpos.xy *= screen_res; -			shadow = shadow2DRectProj(shadowMap0, lpos).x; -		} - -		// take the most-shadowed value out of these two: -		//  * the blurred sun shadow in the light (shadow) map -		//  * an unblurred dot product between the sun and this norm -		// the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting -		shadow = min(shadow, dp_directional_light); -		 -		/*debug.r = lpos.y / (lpos.w*screen_res.y); -		 -		lpos.xy /= lpos.w*32.0; -		if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) -		{ -			debug.gb = vec2(0.5, 0.5); -		} -		 -		debug += (1.0-shadow)*0.5;*/ -		 -	} -	else -	{ -		// more distant than the shadow map covers - just use directional shading as shadow -		shadow = dp_directional_light; -	} -	 -	gl_FragColor[0] = shadow; -	gl_FragColor[1] = calcAmbientOcclusion(pos, norm); -	 -	//spotlight shadow 1 -	vec4 lpos = shadow_matrix[4]*spos; -	lpos.xy *= screen_res; -	gl_FragColor[2] = shadow2DRectProj(shadowMap4, lpos).x;  -	 -	//spotlight shadow 2 -	lpos = shadow_matrix[5]*spos; -	lpos.xy *= screen_res; -	gl_FragColor[3] = shadow2DRectProj(shadowMap5, lpos).x;  - -	//gl_FragColor.rgb = pos.xyz; -	//gl_FragColor.b = shadow; -	//gl_FragColor.rgb = debug; +	gl_FragColor = vec4(0,0,0,0);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 3e29c684e8..5308e5bb1e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -230,9 +230,6 @@ void main()  		}  	} -	//attenuate point light contribution by SSAO component -	col *= texture2DRect(lightMap, frag.xy).g; -	  	gl_FragColor.rgb = col;	  	gl_FragColor.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 249ac7ef9b..589a292751 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -11,6 +11,7 @@ uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap; +uniform sampler2DRect depthMap;  uniform sampler2D	  noiseMap;  uniform samplerCube environmentMap;  uniform sampler2D	  lightFunc; @@ -41,7 +42,6 @@ uniform vec3 env_mat[3];  uniform vec4 shadow_clip;  uniform mat3 ssao_effect_mat; -uniform sampler2DRect depthMap;  uniform mat4 inv_proj;  uniform vec2 screen_res; @@ -282,13 +282,5 @@ void main()  	col = scaleSoftClip(col);  	gl_FragColor.rgb = col; -	 -	//gl_FragColor.rgb = gi_col.rgb;  	gl_FragColor.a = 0.0; -	 -	//gl_FragColor.rg = scol_ambocc.rg; -	//gl_FragColor.rgb = texture2DRect(lightMap, vary_fragcoord.xy).rgb; -	//gl_FragColor.rgb = norm.rgb*0.5+0.5; -	//gl_FragColor.rgb = vec3(ambocc); -	//gl_FragColor.rgb = vec3(scol);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 6617e33c0d..eeaecc157f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -179,10 +179,6 @@ void main()  		}  	} -	//attenuate point light contribution by SSAO component -	col *= texture2DRect(lightMap, frag.xy).g; -	 -  	gl_FragColor.rgb = col;	  	gl_FragColor.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 50502dbdad..04c9a4d19a 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -7,6 +7,8 @@  #extension GL_ARB_texture_rectangle : enable +//class 2, shadows, no SSAO +  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform sampler2DRectShadow shadowMap0; @@ -52,66 +54,6 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } -//calculate decreases in ambient lighting when crowded out (SSAO) -float calcAmbientOcclusion(vec4 pos, vec3 norm) -{ -	float ret = 1.0; -	 -	float dist = dot(pos.xyz,pos.xyz); -	 -	if (dist < 64.0*64.0) -	{ -		vec2 kern[8]; -		// exponentially (^2) distant occlusion samples spread around origin -		kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; -		kern[1] = vec2(1.0, 0.0) * 0.250*0.250; -		kern[2] = vec2(0.0, 1.0) * 0.375*0.375; -		kern[3] = vec2(0.0, -1.0) * 0.500*0.500; -		kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; -		kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; -		kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; -		kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; - -		vec2 pos_screen = vary_fragcoord.xy; -		vec3 pos_world = pos.xyz; -		vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; -		 -		float angle_hidden = 0.0; -		int points = 0; -		 -		float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); -		 -		// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) -		for (int i = 0; i < 8; i++) -		{ -			vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect); -			vec3 samppos_world = getPosition(samppos_screen).xyz;  -			 -			vec3 diff = pos_world - samppos_world; -			float dist2 = dot(diff, diff); -			 -			// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area -			// --> solid angle shrinking by the square of distance -			//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 -			//(k should vary inversely with # of samples, but this is taken care of later) -			 -			//if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0)  // -0.05*norm to shift sample point back slightly for flat surfaces -			//	angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional.  max of 1.0 (= ssao_factor_inv * ssao_factor) -			angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); -			 -			// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  -			points = points + int(diff.z > -1.0); -		} -		 -		angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); -		 -		ret = (1.0 - (float(points != 0) * angle_hidden)); -		ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0); -	} -	 -	return min(ret, 1.0); -} -  float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)  {  	stc.xyz /= stc.w; @@ -232,7 +174,7 @@ void main()  	}  	gl_FragColor[0] = shadow; -	gl_FragColor[1] = calcAmbientOcclusion(pos, norm); +	gl_FragColor[1] = 1.0;  	//spotlight shadow 1  	vec4 lpos = shadow_matrix[4]*spos; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index d071baf72c..b773b95917 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -552,6 +552,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));  	gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +	gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));  	gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2)); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 5b7b464e91..50e5522174 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -973,10 +973,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		S32 level = 0; +		std::string fragment; + +		if (gSavedSettings.getBOOL("RenderDeferredSSAO")) +		{ +			fragment = "deferred/sunLightSSAOF.glsl"; +		} +		else +		{ +			fragment = "deferred/sunLightF.glsl"; +		} +  		gDeferredSunProgram.mName = "Deferred Sun Shader";  		gDeferredSunProgram.mShaderFiles.clear();  		gDeferredSunProgram.mShaderFiles.push_back(make_pair("deferred/sunLightV.glsl", GL_VERTEX_SHADER_ARB)); -		gDeferredSunProgram.mShaderFiles.push_back(make_pair("deferred/sunLightF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredSunProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));  		gDeferredSunProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredSunProgram.createShader(NULL, NULL);  	} diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e378fb4d08..fc81241080 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6268,16 +6268,16 @@ void LLPipeline::renderDeferredLighting()  			glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);  		} -		if (gSavedSettings.getS32("RenderShadowDetail") > 0) -		{ -			glPushMatrix(); -			glLoadIdentity(); -			glMatrixMode(GL_PROJECTION); -			glPushMatrix(); -			glLoadIdentity(); +		glPushMatrix(); +		glLoadIdentity(); +		glMatrixMode(GL_PROJECTION); +		glPushMatrix(); +		glLoadIdentity(); -			mDeferredLight[0].bindTarget(); -			if (gSavedSettings.getBOOL("RenderDeferredSun")) +		mDeferredLight[0].bindTarget(); + +		if (gSavedSettings.getBOOL("RenderDeferredSSAO") || gSavedSettings.getS32("RenderShadowDetail") > 0) +		{  			{ //paint shadow/SSAO light map (direct lighting lightmap)  				LLFastTimer ftm(FTM_SUN_SHADOW);  				bindDeferredShader(gDeferredSunProgram, 0); @@ -6318,18 +6318,22 @@ void LLPipeline::renderDeferredLighting()  				unbindDeferredShader(gDeferredSunProgram);  			} -			else -			{ -				mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT); -			} +		} +		else +		{ +			glClearColor(1,1,1,1); +			mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT); +			glClearColor(0,0,0,0); +		} -			mDeferredLight[0].flush(); +		mDeferredLight[0].flush(); +		{ //global illumination specific block (still experimental)  			if (gSavedSettings.getBOOL("RenderDeferredBlurLight") && -			    gSavedSettings.getBOOL("RenderDeferredGI")) -			{ +				gSavedSettings.getBOOL("RenderDeferredGI")) +			{   				LLFastTimer ftm(FTM_EDGE_DETECTION); -				//get edge map +				//generate edge map  				LLGLDisable blend(GL_BLEND);  				LLGLDisable test(GL_ALPHA_TEST);  				LLGLDepthTest depth(GL_FALSE); @@ -6426,79 +6430,79 @@ void LLPipeline::renderDeferredLighting()  					unbindDeferredShader(gDeferredPostGIProgram);  				}  			} +		} -			if (gSavedSettings.getBOOL("RenderDeferredBlurLight")) -			{ //soften direct lighting lightmap -				LLFastTimer ftm(FTM_SOFTEN_SHADOW); -				//blur lightmap -				mDeferredLight[1].bindTarget(); +		if (gSavedSettings.getBOOL("RenderDeferredSSAO")) +		{ //soften direct lighting lightmap +			LLFastTimer ftm(FTM_SOFTEN_SHADOW); +			//blur lightmap +			mDeferredLight[1].bindTarget(); -				glClearColor(1,1,1,1); -				mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT); -				glClearColor(0,0,0,0); -				 -				bindDeferredShader(gDeferredBlurLightProgram); +			glClearColor(1,1,1,1); +			mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT); +			glClearColor(0,0,0,0); +			 +			bindDeferredShader(gDeferredBlurLightProgram); -				LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian"); -				const U32 kern_length = 4; -				F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize"); -				F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor"); +			LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian"); +			const U32 kern_length = 4; +			F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize"); +			F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor"); -				// sample symmetrically with the middle sample falling exactly on 0.0 -				F32 x = 0.f; +			// sample symmetrically with the middle sample falling exactly on 0.0 +			F32 x = 0.f; -				LLVector3 gauss[32]; // xweight, yweight, offset +			LLVector3 gauss[32]; // xweight, yweight, offset -				for (U32 i = 0; i < kern_length; i++) -				{ -					gauss[i].mV[0] = llgaussian(x, go.mV[0]); -					gauss[i].mV[1] = llgaussian(x, go.mV[1]); -					gauss[i].mV[2] = x; -					x += 1.f; -				} +			for (U32 i = 0; i < kern_length; i++) +			{ +				gauss[i].mV[0] = llgaussian(x, go.mV[0]); +				gauss[i].mV[1] = llgaussian(x, go.mV[1]); +				gauss[i].mV[2] = x; +				x += 1.f; +			} -				gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f); -				gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor); -				gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV); -				gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV); -				gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f)); +			gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f); +			gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor); +			gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV); +			gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV); +			gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f)); +		 +			{ +				LLGLDisable blend(GL_BLEND); +				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); +				stop_glerror(); +				glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); +				stop_glerror(); +			} -				{ -					LLGLDisable blend(GL_BLEND); -					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -					stop_glerror(); -					glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -					stop_glerror(); -				} -				 -				mDeferredLight[1].flush(); -				unbindDeferredShader(gDeferredBlurLightProgram); +			mDeferredLight[1].flush(); +			unbindDeferredShader(gDeferredBlurLightProgram); -				bindDeferredShader(gDeferredBlurLightProgram, 1); -				mDeferredLight[0].bindTarget(); +			bindDeferredShader(gDeferredBlurLightProgram, 1); +			mDeferredLight[0].bindTarget(); -				gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f); +			gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f); -				{ -					LLGLDisable blend(GL_BLEND); -					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -					stop_glerror(); -					glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -					stop_glerror(); -				} -				mDeferredLight[0].flush(); -				unbindDeferredShader(gDeferredBlurLightProgram); +			{ +				LLGLDisable blend(GL_BLEND); +				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); +				stop_glerror(); +				glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); +				stop_glerror();  			} - -			stop_glerror(); -			glPopMatrix(); -			stop_glerror(); -			glMatrixMode(GL_MODELVIEW); -			stop_glerror(); -			glPopMatrix(); -			stop_glerror(); +			mDeferredLight[0].flush(); +			unbindDeferredShader(gDeferredBlurLightProgram);  		} +		stop_glerror(); +		glPopMatrix(); +		stop_glerror(); +		glMatrixMode(GL_MODELVIEW); +		stop_glerror(); +		glPopMatrix(); +		stop_glerror(); +  		//copy depth and stencil from deferred screen  		//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),  		//					0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); | 
