diff options
Diffstat (limited to 'indra')
8 files changed, 74 insertions, 38 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0e26013152..c2416ba970 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8217,7 +8217,7 @@      <key>Type</key>      <string>U32</string>      <key>Value</key> -    <real>128</real> +    <real>512</real>    </map>    <key>RenderSpecularResY</key> @@ -8241,7 +8241,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>8</real> +    <real>384</real>    </map>    <key>RenderDeferred</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 179c721a2f..ef2d70ca58 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -126,7 +126,7 @@ void main()  				if (sa > 0.0)  				{ -					sa = texture2D(lightFunc,vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0); +					sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);  					sa *= noise;  					col += da*sa*light_col[i].rgb*spec.rgb;  				} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index b673d00d6e..f5a577c04a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -107,7 +107,7 @@ void main()  		float sa = dot(normalize(lv-normalize(pos)),norm);  		if (sa > 0.0)  		{ -			sa = texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0); +			sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);  			sa *= noise;  			col += da*sa*color.rgb*spec.rgb;  		} diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 51110ae4df..2b0671b47f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -299,7 +299,7 @@ void main()  			//  			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));  			float sa = dot(refnormpersp, sun_dir.xyz); -			vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).r; +			vec3 dumbshiny = vary_SunlitColor*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r);  			// add the two types of shiny together  			vec3 spec_contrib = dumbshiny * spec.rgb; diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 97f3063a9e..471a4e0236 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -307,7 +307,7 @@ void main()  			//  			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));  			float sa = dot(refnormpersp, sun_dir.xyz); -			vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).r; +			vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r);  			// add the two types of shiny together  			vec3 spec_contrib = dumbshiny * spec.rgb; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 093b84413a..ab45aae5cc 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -181,6 +181,16 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue)  	return true;  } +static bool handleLUTBufferChanged(const LLSD& newvalue) +{ +	if (gPipeline.isInit()) +	{ +		gPipeline.releaseLUTBuffers(); +		gPipeline.createLUTBuffers(); +	} +	return true; +} +  static bool handleAnisotropicChanged(const LLSD& newvalue)  {  	LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean(); @@ -569,9 +579,9 @@ void settings_setup_listeners()  	gSavedSettings.getControl("RenderUIBuffer")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderDepthOfField")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); -	gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); -	gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); -	gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); +	gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2)); +	gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2)); +	gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2));  	gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2));  	gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c523a78b22..b7417549ab 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1032,11 +1032,7 @@ void LLPipeline::releaseGLBuffers()  		mTrueNoiseMap = 0;  	} -	if (mLightFunc) -	{ -		LLImageGL::deleteTextures(1, &mLightFunc); -		mLightFunc = 0; -	} +	releaseLUTBuffers();  	mWaterRef.release();  	mWaterDis.release(); @@ -1052,6 +1048,15 @@ void LLPipeline::releaseGLBuffers()  	LLVOAvatar::resetImpostors();  } +void LLPipeline::releaseLUTBuffers() +{ +	if (mLightFunc) +	{ +		LLImageGL::deleteTextures(1, &mLightFunc); +		mLightFunc = 0; +	} +} +  void LLPipeline::releaseScreenBuffers()  {  	mUIScreen.release(); @@ -1146,50 +1151,69 @@ void LLPipeline::createGLBuffers()  			gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);  		} +		createLUTBuffers(); +	} + +	gBumpImageList.restoreGL(); +} + +void LLPipeline::createLUTBuffers() +{ +	if (sRenderDeferred) +	{  		if (!mLightFunc)  		{  			U32 lightResX = gSavedSettings.getU32("RenderSpecularResX");  			U32 lightResY = gSavedSettings.getU32("RenderSpecularResY"); -			U8* lg = new U8[lightResX*lightResY]; - +			U8* ls = new U8[lightResX*lightResY]; +			F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); +            // Calculate the (normalized) Blinn-Phong specular lookup texture.  			for (U32 y = 0; y < lightResY; ++y)  			{  				for (U32 x = 0; x < lightResX; ++x)  				{ -					//spec func +					ls[y*lightResX+x] = 0;  					F32 sa = (F32) x/(lightResX-1);  					F32 spec = (F32) y/(lightResY-1); -					//lg[y*lightResX+x] = (U8) (powf(sa, 128.f*spec*spec)*255); - -					//F32 sp = acosf(sa)/(1.f-spec); - -					sa = powf(sa, gSavedSettings.getF32("RenderSpecularExponent")); -					F32 a = acosf(sa*0.25f+0.75f); -					F32 m = llmax(0.5f-spec*0.5f, 0.001f); -					F32 t2 = tanf(a)/m; -					t2 *= t2; - -					F32 c4a = (3.f+4.f*cosf(2.f*a)+cosf(4.f*a))/8.f; -					F32 bd = 1.f/(4.f*m*m*c4a)*powf(F_E, -t2); - -					lg[y*lightResX+x] = (U8) (llclamp(bd, 0.f, 1.f)*255); +					F32 n = spec * spec * specExp; +					 +					// Nothing special here.  Just your typical blinn-phong term. +					spec = powf(sa, n); +					 +					// Apply our normalization function. +					// Note: This is the full equation that applies the full normalization curve, not an approximation. +					// This is fine, given we only need to create our LUT once per buffer initialization. +					// The only trade off is we have a really low dynamic range. +					// This means we have to account for things not being able to exceed 0 to 1 in our shaders. +					spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n))); +					 +					// Always sample at a 1.0/2.2 curve. +					// This "Gamma corrects" our specular term, boosting our lower exponent reflections. +					spec = powf(spec, 1.f/2.2f); +					 +					// Easy fix for our dynamic range problem: divide by 6 here, multiply by 6 in our shaders. +					// This allows for our specular term to exceed a value of 1 in our shaders. +					// This is something that can be important for energy conserving specular models where higher exponents can result in highlights that exceed a range of 0 to 1. +					// Technically, we could just use an R16F texture, but driver support for R16F textures can be somewhat spotty at times. +					// This works remarkably well for higher specular exponents, though banding can sometimes be seen on lower exponents. +					// Combined with a bit of noise and trilinear filtering, the banding is hardly noticable. +					ls[y*lightResX+x] = (U8)(llclamp(spec * (1.f / 6), 0.f, 1.f) * 255);  				}  			} - +			  			LLImageGL::generateTextures(1, &mLightFunc);  			gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc); -			LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R8, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, lg); +			LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R8, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls);  			gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);  			gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); - -			delete [] lg; +			 +			delete [] ls;  		}  	} - -	gBumpImageList.restoreGL();  } -void LLPipeline::restoreGL()  + +void LLPipeline::restoreGL()  {  	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_RESTORE_GL);  	assertInitialized(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 9c78048c46..8db27dd0f7 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -113,8 +113,10 @@ public:  	void resetVertexBuffers();  	void resizeScreenTexture();  	void releaseGLBuffers(); +	void releaseLUTBuffers();  	void releaseScreenBuffers();  	void createGLBuffers(); +	void createLUTBuffers();  	void allocateScreenBuffer(U32 resX, U32 resY);  	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples); | 
