diff options
Diffstat (limited to 'indra')
13 files changed, 102 insertions, 25 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index d29c9a2b77..63863fb836 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -93,8 +93,7 @@ void main()  	norm = decode_normal(norm.xy); // unpack norm  	norm = normalize(norm);  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2)); -	vec3 diff = pow(texture2DRect(diffuseRect, frag.xy).rgb, vec3(2.2)); +	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	vec3 out_col = vec3(0,0,0);  	vec3 npos = normalize(-pos); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 5129ecf128..377df49815 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -181,7 +181,6 @@ void main()  	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -	diff_tex = pow(diff_tex, vec3(2.2));  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	if (proj_tc.z > 0.0 && @@ -222,7 +221,6 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	if (spec.a > 0.0)  	{ diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index fa514e5585..332b610197 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -108,7 +108,7 @@ void main()  	float noise = texture2D(noiseMap, frag.xy/128.0).b; -	vec3 col = pow(texture2DRect(diffuseRect, frag.xy).rgb, vec3(2.2)); +	vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;  	float fa = falloff+1.0;  	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  	float lit = da * dist_atten * noise; @@ -116,7 +116,6 @@ void main()  	col = color.rgb*lit*col;  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	if (spec.a > 0.0)  	{  		vec3 npos = -normalize(pos); diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl new file mode 100644 index 0000000000..404e284abb --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -0,0 +1,44 @@ +/**  + * @file postDeferredGammaCorrect.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; + +uniform vec2 screen_res; +VARYING vec2 vary_fragcoord; + +void main()  +{ +	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); +	frag_color = pow(diff, vec4(0.454545, 0.454545, 0.454545, 1.0)); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl index cceb1b11ab..eb5beeef39 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -42,6 +42,6 @@ void main()  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);  	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); -	frag_color = pow(diff + bloom, vec4(0.454545, 0.454545, 0.454545, 1.0)); +	frag_color = diff + bloom;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 8600f69b8a..026039a0e7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -294,9 +294,7 @@ void main()  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);  	vec4 diffuse = texture2DRect(diffuseRect, tc); -	diffuse.rgb = pow(diffuse.rgb, vec3(2.2));  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	vec3 col;  	float bloom = 0.0;  	if (diffuse.a < 0.9) diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 4b4063f51c..a339f6506e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -187,7 +187,6 @@ void main()  	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -	diff_tex = pow(diff_tex, vec3(2.2));  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	if (proj_tc.z > 0.0 && @@ -228,7 +227,6 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	if (spec.a > 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 cfdb53b5cc..31f5c8afbb 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -196,7 +196,6 @@ void main()  	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -	diff_tex = pow(diff_tex, vec3(2.2));  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	if (proj_tc.z > 0.0 && @@ -237,7 +236,6 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	if (spec.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 e8f3a02c5a..c7e5908d39 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -296,7 +296,6 @@ void main()  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);  	vec4 diffuse = texture2DRect(diffuseRect, tc); -	diffuse.rgb = pow(diffuse.rgb, vec3(2.2));  	vec3 col;  	float bloom = 0.0; @@ -304,7 +303,6 @@ void main()  	if (diffuse.a < 0.9)  	{  		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -		spec.rgb = pow(spec.rgb, vec3(2.2));  		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;  		float scol = max(scol_ambocc.r, diffuse.a);  diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 7ce327d1e0..65a14c542c 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -197,8 +197,6 @@ void main()  	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -	 -	diff_tex = pow(diff_tex, vec3(2.2));  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	if (proj_tc.z > 0.0 && @@ -239,7 +237,6 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); -	spec.rgb = pow(spec.rgb, vec3(2.2));  	if (spec.a > 0.0)  	{  		vec3 ref = reflect(normalize(pos), norm); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 8096738197..4ce98f0e02 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -200,6 +200,7 @@ LLGLSLShader			gDeferredEmissiveProgram;  LLGLSLShader			gDeferredPostProgram;  LLGLSLShader			gDeferredCoFProgram;  LLGLSLShader			gDeferredDoFCombineProgram; +LLGLSLShader			gDeferredPostGammaCorrectProgram;  LLGLSLShader			gFXAAProgram;  LLGLSLShader			gDeferredPostNoDoFProgram;  LLGLSLShader			gDeferredWLSkyProgram; @@ -1110,6 +1111,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredPostProgram.unload();		  		gDeferredCoFProgram.unload();		  		gDeferredDoFCombineProgram.unload(); +		gDeferredPostNoDoFProgram.unload(); +		gDeferredPostGammaCorrectProgram.unload();  		gFXAAProgram.unload();  		gDeferredWaterProgram.unload();  		gDeferredWLSkyProgram.unload(); @@ -1650,6 +1653,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);  	} +	 +	if (success) +	{ +		gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correct Shader"; +		gDeferredPostGammaCorrectProgram.mShaderFiles.clear(); +		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredGammaCorrect.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredPostGammaCorrectProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredPostGammaCorrectProgram.createShader(NULL, NULL); +	}  	if (success)  	{ diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 38310ed7cf..a3c2adae20 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -331,9 +331,6 @@ extern LLGLSLShader			gDeferredNonIndexedDiffuseProgram;  extern LLGLSLShader			gDeferredSkinnedDiffuseProgram;  extern LLGLSLShader			gDeferredSkinnedBumpProgram;  extern LLGLSLShader			gDeferredSkinnedAlphaProgram; -#if LL_DARWIN -extern LLGLSLShader			gDeferredSkinnedAlphaProgramMac; -#endif  extern LLGLSLShader			gDeferredBumpProgram;  extern LLGLSLShader			gDeferredTerrainProgram;  extern LLGLSLShader			gDeferredTreeProgram; @@ -354,6 +351,7 @@ extern LLGLSLShader			gDeferredCoFProgram;  extern LLGLSLShader			gDeferredDoFCombineProgram;  extern LLGLSLShader			gFXAAProgram;  extern LLGLSLShader			gDeferredPostNoDoFProgram; +extern LLGLSLShader			gDeferredPostGammaCorrectProgram;  extern LLGLSLShader			gDeferredAvatarShadowProgram;  extern LLGLSLShader			gDeferredAttachmentShadowProgram;  extern LLGLSLShader			gDeferredAlphaProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index eff892c1bc..c02a51ef59 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -398,7 +398,7 @@ void validate_framebuffer_object();  bool addDeferredAttachments(LLRenderTarget& target)  { -	return target.addColorAttachment(GL_RGBA) && //specular +	return target.addColorAttachment(GL_SRGB8_ALPHA8) && //specular  			target.addColorAttachment(GL_RGB10_A2); //normal+z  } @@ -908,11 +908,17 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		BOOL ssao = RenderDeferredSSAO;  		//allocate deferred rendering color buffers -		if (!mDeferredScreen.allocate(resX, resY, GL_RGBA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!mDeferredScreen.allocate(resX, resY, GL_SRGB8_ALPHA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!addDeferredAttachments(mDeferredScreen)) return false; -		if (!mScreen.allocate(resX, resY, GL_RGBA16, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		GLuint screenFormat = GL_RGBA16; +		if (gGLManager.mIsATI) +		{ +			screenFormat = GL_RGBA12; +		} +		 +		if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (samples > 0)  		{  			if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false; @@ -7101,10 +7107,41 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	gGL.loadIdentity();  	LLGLDisable test(GL_ALPHA_TEST); - +	  	gGL.setColorMask(true, true);  	glClearColor(0,0,0,0); +	 +	if (sRenderDeferred) +	{ +		mScreen.bindTarget(); +		// Apply gamma correction to the frame here. +		gDeferredPostGammaCorrectProgram.bind(); +		//mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +		S32 channel = 0; +		channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); +		if (channel > -1) +		{ +			mScreen.bindTexture(0,channel); +			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +		} +		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); +		gGL.begin(LLRender::TRIANGLE_STRIP); +		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); +		gGL.vertex2f(-1,-1); +		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); +		gGL.vertex2f(-1,3); +		 +		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); +		gGL.vertex2f(3,-1); +		 +		gGL.end(); +		 +		gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); +		gDeferredPostGammaCorrectProgram.unbind(); +		mScreen.flush(); +	} +	  	{  		{  			LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); | 
