diff options
| -rwxr-xr-x | indra/llrender/llshadermgr.cpp | 1 | ||||
| -rwxr-xr-x | indra/llrender/llshadermgr.h | 1 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl | 2 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/materialF.glsl | 7 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/skyF.glsl | 2 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl | 27 | ||||
| -rwxr-xr-x | indra/newview/lldrawpoolavatar.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/lldrawpoolbump.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolmaterials.cpp | 1 | ||||
| -rwxr-xr-x | indra/newview/llviewershadermgr.cpp | 35 | ||||
| -rwxr-xr-x | indra/newview/llviewershadermgr.h | 3 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 30 | 
12 files changed, 109 insertions, 18 deletions
| diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index ef78d43665..874996dd10 100755 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1068,6 +1068,7 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("minimum_alpha"); +	mReservedUniforms.push_back("emissive_brightness");  	mReservedUniforms.push_back("shadow_matrix");  	mReservedUniforms.push_back("env_mat"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index a33eca4448..c049e935b8 100755 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -109,6 +109,7 @@ public:  		GLOW_DELTA,  		MINIMUM_ALPHA, +		EMISSIVE_BRIGHTNESS,  		DEFERRED_SHADOW_MATRIX,  		DEFERRED_ENV_MAT, diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 975180606a..efb4d48845 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -40,8 +40,6 @@ vec3 fullbrightScaleSoftClip(vec3 light);  void main()   { -	float shadow = 1.0; -  	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;  	color.rgb = pow(color.rgb,vec3(2.2f,2.2f,2.2f)); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index fc4b8b33f8..539efa3499 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -28,6 +28,9 @@  #define DIFFUSE_ALPHA_MODE_MASK 2  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3 +#if DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE +uniform float emissive_brightness; +#endif  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) @@ -37,7 +40,6 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif -  #if HAS_SUN_SHADOW  uniform sampler2DShadow shadowMap0; @@ -472,7 +474,7 @@ void main()  	vec4 final_color = diffcol;  #if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) -	final_color.a = 0; +	final_color.a = emissive_brightness;  #endif  	vec4 final_specular = spec; @@ -646,6 +648,7 @@ void main()  	frag_color.a = max(diffcol.a*vertex_color.a, glare);  #else +  	frag_data[0] = final_color;  #ifdef UGLY_MAC_HACK diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 49ad064364..22f4729e2e 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -61,6 +61,6 @@ void main()  	/// Gamma correct for WL (soft clip effect).  	frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0);  	frag_data[1] = vec4(0.0,0.0,0.0,0.0); -	frag_data[2] = vec4(0.5,0.5,0.0,0); +	frag_data[2] = vec4(0.5,0.5,0.0,1.0); //1.0 in norm.w masks off fog  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 9197df2628..b688c1a70c 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -231,9 +231,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * 2.2); -	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * 2.2); -	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * 2.2); +	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); +	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); +	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma);  }  vec3 atmosLighting(vec3 light) @@ -308,7 +308,7 @@ void main()  		col.rgb *= ambient; -		col += atmosAffectDirectionalLight(max(min(da, 1.0) * 2.6, diffuse.a)); +		col += atmosAffectDirectionalLight(max(min(da, 1.0) * 2.6, 0.0));  		col *= diffuse.rgb; @@ -328,17 +328,28 @@ void main()  			col += spec_contrib;  		} +		col = mix(col.rgb, diffuse.rgb, diffuse.a); +  		if (envIntensity > 0.0)  		{ //add environmentmap  			vec3 env_vec = env_mat * refnormpersp; -			col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2,  +			 +			float exponent = mix(2.2, 1.0, diffuse.a); + +			col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(exponent)) * exponent,   				envIntensity);  + +			exponent = mix(1.0, 2.2, diffuse.a); +			col.rgb = pow(col.rgb, vec3(exponent))/exponent;  		} -		col = atmosLighting(col); -		col = scaleSoftClip(col); +		if (norm.w < 0.5) +		{ +			col = atmosLighting(col); +			col = scaleSoftClip(col); +		} -		col = mix(col.rgb, diffuse.rgb, diffuse.a); +		//col.g = envIntensity;  	}  	frag_color.rgb = col; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index b4ebee064e..a65240abff 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -979,7 +979,14 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()  		}  		else  		{ -			sVertexProgram = &gSkinnedObjectFullbrightShinyProgram; +			if (LLPipeline::sRenderDeferred) +			{ +				sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram; +			} +			else +			{ +				sVertexProgram = &gSkinnedObjectFullbrightShinyProgram; +			}  		}  	}  	else diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index cb40cf2039..cbd65a88e7 100755 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -513,7 +513,14 @@ void LLDrawPoolBump::beginFullbrightShiny()  	}  	else  	{ -		shader = &gObjectFullbrightShinyProgram; +		if (LLPipeline::sRenderDeferred) +		{ +			shader = &gDeferredFullbrightShinyProgram; +		} +		else +		{ +			shader = &gObjectFullbrightShinyProgram; +		}  	}  	LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL; diff --git a/indra/newview/lldrawpoolmaterials.cpp b/indra/newview/lldrawpoolmaterials.cpp index 3e0f9c9d4d..08a36bddf1 100644 --- a/indra/newview/lldrawpoolmaterials.cpp +++ b/indra/newview/lldrawpoolmaterials.cpp @@ -139,6 +139,7 @@ void LLDrawPoolMaterials::renderDeferred(S32 pass)  		}  		mShader->setMinimumAlpha(params.mAlphaMaskCutoff); +		mShader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, params.mFullbright ? 1.f : 0.f);  		pushBatch(params, mask, TRUE);  	} diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 14d98d9a5a..87c5211952 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -209,6 +209,8 @@ LLGLSLShader			gDeferredPostNoDoFProgram;  LLGLSLShader			gDeferredWLSkyProgram;  LLGLSLShader			gDeferredWLCloudProgram;  LLGLSLShader			gDeferredStarProgram; +LLGLSLShader			gDeferredFullbrightShinyProgram; +LLGLSLShader			gDeferredSkinnedFullbrightShinyProgram;  LLGLSLShader			gNormalMapGenProgram;  // Deferred materials shaders @@ -289,6 +291,8 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gDeferredAlphaProgram);  	mShaderList.push_back(&gDeferredSkinnedAlphaProgram);  	mShaderList.push_back(&gDeferredFullbrightProgram); +	mShaderList.push_back(&gDeferredFullbrightShinyProgram); +	mShaderList.push_back(&gDeferredSkinnedFullbrightShinyProgram);  	mShaderList.push_back(&gDeferredEmissiveProgram);  	mShaderList.push_back(&gDeferredAvatarEyesProgram);  	mShaderList.push_back(&gDeferredWaterProgram); @@ -1132,6 +1136,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredWLSkyProgram.unload();  		gDeferredWLCloudProgram.unload();  		gDeferredStarProgram.unload(); +		gDeferredFullbrightShinyProgram.unload(); +		gDeferredSkinnedFullbrightShinyProgram.unload();  		gNormalMapGenProgram.unload();  		for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i)  		{ @@ -1481,6 +1487,35 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredFullbrightShinyProgram.mName = "Deferred FullbrightShiny Shader"; +		gDeferredFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true; +		gDeferredFullbrightShinyProgram.mFeatures.hasGamma = true; +		gDeferredFullbrightShinyProgram.mFeatures.hasTransport = true; +		gDeferredFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1); +		gDeferredFullbrightShinyProgram.mShaderFiles.clear(); +		gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); +	} + +	if (success) +	{ +		gDeferredSkinnedFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader"; +		gDeferredSkinnedFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true; +		gDeferredSkinnedFullbrightShinyProgram.mFeatures.hasGamma = true; +		gDeferredSkinnedFullbrightShinyProgram.mFeatures.hasTransport = true; +		gDeferredSkinnedFullbrightShinyProgram.mFeatures.hasObjectSkinning = true; +		gDeferredSkinnedFullbrightShinyProgram.mFeatures.disableTextureIndex = true; +		gDeferredSkinnedFullbrightShinyProgram.mShaderFiles.clear(); +		gDeferredSkinnedFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredSkinnedFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredSkinnedFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gDeferredSkinnedFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); +	} + +	if (success) +	{  		gDeferredEmissiveProgram.mName = "Deferred Emissive Shader";  		gDeferredEmissiveProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredEmissiveProgram.mFeatures.hasGamma = true; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index a24427a7bb..eb355ff16a 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -364,8 +364,11 @@ extern LLGLSLShader			gDeferredAvatarAlphaProgram;  extern LLGLSLShader			gDeferredWLSkyProgram;  extern LLGLSLShader			gDeferredWLCloudProgram;  extern LLGLSLShader			gDeferredStarProgram; +extern LLGLSLShader			gDeferredFullbrightShinyProgram; +extern LLGLSLShader			gDeferredSkinnedFullbrightShinyProgram;  extern LLGLSLShader			gNormalMapGenProgram; +  // Deferred materials shaders  extern LLGLSLShader			gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index caf4fe9383..7fa3865675 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4067,7 +4067,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  	BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) ||  		(type == LLRenderPass::PASS_INVISIBLE) ||  		(type == LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK) || -		(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)); +		(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)) || +		(facep->getTextureEntry()->getFullbright());  	if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))  	{ @@ -5314,11 +5315,21 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			if (mat && LLPipeline::sRenderDeferred && !hud_group)  			{ +				bool material_pass = false; +  				if (fullbright)  				{  					if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  					{ -						registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); +						if (mat->getEnvironmentIntensity() > 0 || +							te->getShiny() > 0) +						{ +							material_pass = true; +						} +						else +						{ +							registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); +						}  					}  					else if (is_alpha)  					{ @@ -5326,7 +5337,15 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  					}  					else  					{ -						registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); +						if (mat->getEnvironmentIntensity() > 0 || +							te->getShiny() > 0) +						{ +							material_pass = true; +						} +						else +						{ +							registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); +						}  					}  				}  				else if (no_materials) @@ -5339,6 +5358,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  				}  				else  				{ +					material_pass = true; +				} + +				if (material_pass) +				{  					U32 pass[] =   					{  						LLRenderPass::PASS_MATERIAL, | 
