diff options
| author | Dave Parks <davep@lindenlab.com> | 2011-11-21 16:00:52 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2011-11-21 16:00:52 -0600 | 
| commit | 08f364bfc9aaeb771145d660287427c41b1dc0bf (patch) | |
| tree | f818af730ea8a4d305e4710fb3e5a5420b18544c | |
| parent | 5c690db63ff118b6bc66fe1607624a59f4162b30 (diff) | |
SH-2708 Fix for broken shadows on alpha objects
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl | 2 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl | 5 | ||||
| -rw-r--r-- | indra/newview/lldrawpool.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 27 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 3 | 
7 files changed, 29 insertions, 15 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index 46d42d2a4a..c1fb7b55d4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -37,7 +37,7 @@ VARYING vec2 vary_texcoord0;  void main()   { -	float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a * vertex_color.a; +	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;  	if (alpha < minimum_alpha)  	{ diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl index 6a3cba771b..7d3b06c56e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl @@ -34,15 +34,18 @@ VARYING vec4 post_pos;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; +void passTextureIndex(); +  void main()  {  	//transform vertex  	vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0); -	  	post_pos = pos;  	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +	passTextureIndex(); +  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  	vertex_color = diffuse_color;  } diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index c7acbb42c6..5a2981e749 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -133,7 +133,6 @@ public:  		PASS_ALPHA,  		PASS_ALPHA_MASK,  		PASS_FULLBRIGHT_ALPHA_MASK, -		PASS_ALPHA_SHADOW,  		NUM_RENDER_TYPES,  	}; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 18ae83e3b6..bddc07b395 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1338,6 +1338,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader"; +		gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;  		gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();  		gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index baab191cb6..3d013f286c 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4896,11 +4896,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  				{  					registerFace(group, facep, LLRenderPass::PASS_ALPHA);  				} - -				if (LLPipeline::sRenderDeferred) -				{ -					registerFace(group, facep, LLRenderPass::PASS_ALPHA_SHADOW); -				}  			}  			else if (gPipeline.canUseVertexShaders()  				&& group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD  diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index d8e271811a..f3d5f94813 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6159,13 +6159,13 @@ void LLPipeline::resetVertexBuffers()  	LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping);  } -void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture) +void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)  {  	LLMemType mt_ro(LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS);  	assertInitialized();  	gGL.loadMatrix(gGLModelView);  	gGLLastMatrix = NULL; -	mSimplePool->pushBatches(type, mask); +	mSimplePool->pushBatches(type, mask, texture, batch_texture);  	gGL.loadMatrix(gGLModelView);  	gGLLastMatrix = NULL;		  } @@ -8195,7 +8195,14 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	}  	LLPipeline::sShadowRender = TRUE; -	U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY, LLRenderPass::PASS_BUMP, LLRenderPass::PASS_FULLBRIGHT_SHINY }; +	U32 types[] = {  +		LLRenderPass::PASS_SIMPLE,  +		LLRenderPass::PASS_FULLBRIGHT,  +		LLRenderPass::PASS_SHINY,  +		LLRenderPass::PASS_BUMP,  +		LLRenderPass::PASS_FULLBRIGHT_SHINY  +	}; +  	LLGLEnable cull(GL_CULL_FACE);  	if (use_shader) @@ -8267,7 +8274,15 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  		LLFastTimer ftm(FTM_SHADOW_ALPHA);  		gDeferredShadowAlphaMaskProgram.bind();  		gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f); -		renderObjects(LLRenderPass::PASS_ALPHA_SHADOW, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, TRUE); +		 +		U32 mask =	LLVertexBuffer::MAP_VERTEX |  +					LLVertexBuffer::MAP_TEXCOORD0 |  +					LLVertexBuffer::MAP_COLOR |  +					LLVertexBuffer::MAP_TEXTURE_INDEX; + +		renderObjects(LLRenderPass::PASS_ALPHA_MASK, mask, TRUE, TRUE); +		renderObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, mask, TRUE, TRUE); +		renderObjects(LLRenderPass::PASS_ALPHA, mask, TRUE, TRUE);  		gDeferredTreeShadowProgram.bind();  		gDeferredTreeShadowProgram.setMinimumAlpha(0.598f);  		renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE); @@ -8589,7 +8604,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  					LLPipeline::RENDER_TYPE_TERRAIN,  					LLPipeline::RENDER_TYPE_WATER,  					LLPipeline::RENDER_TYPE_VOIDWATER, -					LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW, +					LLPipeline::RENDER_TYPE_PASS_ALPHA, +					LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, +					LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,  					LLPipeline::RENDER_TYPE_PASS_GRASS,  					LLPipeline::RENDER_TYPE_PASS_SIMPLE,  					LLPipeline::RENDER_TYPE_PASS_BUMP, diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 8b6532ca25..c6b2e20fa5 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -231,7 +231,7 @@ public:  	void postSort(LLCamera& camera);  	void forAllVisibleDrawables(void (*func)(LLDrawable*)); -	void renderObjects(U32 type, U32 mask, BOOL texture = TRUE); +	void renderObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE);  	void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);  	void grabReferences(LLCullResult& result); @@ -408,7 +408,6 @@ public:  		RENDER_TYPE_PASS_ALPHA					= LLRenderPass::PASS_ALPHA,  		RENDER_TYPE_PASS_ALPHA_MASK				= LLRenderPass::PASS_ALPHA_MASK,  		RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK	= LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, -		RENDER_TYPE_PASS_ALPHA_SHADOW = LLRenderPass::PASS_ALPHA_SHADOW,  		// Following are object types (only used in drawable mRenderType)  		RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,  		RENDER_TYPE_VOLUME, | 
