diff options
| author | Graham Linden <graham@lindenlab.com> | 2013-07-12 08:04:40 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2013-07-12 08:04:40 -0700 | 
| commit | b588865f3f56a338fc068b55ab1a408f89307f2b (patch) | |
| tree | 7061c460d8a01e97502b2f347c144efbff97427b | |
| parent | a8c9d81a376244a372de60b8c2af44c577ee51e0 (diff) | |
NORSPEC-291 WIP first attempt at materials in reflection/waterdis maps
| -rwxr-xr-x | indra/newview/pipeline.cpp | 620 | ||||
| -rwxr-xr-x | indra/newview/pipeline.h | 1 | 
2 files changed, 608 insertions, 13 deletions
| diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c605735170..cac347b3a5 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8891,6 +8891,539 @@ void LLPipeline::renderDeferredLighting()  } +void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) +{ +	if (!sCull) +	{ +		return; +	} + +	{ +		LLFastTimer ftm(FTM_RENDER_DEFERRED); + +		LLViewerCamera* camera = LLViewerCamera::getInstance(); + +		/*{ +			LLGLDepthTest depth(GL_TRUE); +			mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), +							0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);	 +		}*/ + +		LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); + +		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) +		{ +			gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); +		} + +		//ati doesn't seem to love actually using the stencil buffer on FBO's +		LLGLDisable stencil(GL_STENCIL_TEST); +		//glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); +		//glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + +		gGL.setColorMask(true, true); +		 +		//draw a cube around every light +		LLVertexBuffer::unbind(); + +		LLGLEnable cull(GL_CULL_FACE); +		LLGLEnable blend(GL_BLEND); + +		glh::matrix4f mat = glh_copy_matrix(gGLModelView); + +		LLStrider<LLVector3> vert;  +		mDeferredVB->getVertexStrider(vert); +		 +		vert[0].set(-1,1,0); +		vert[1].set(-1,-3,0); +		vert[2].set(3,1,0); +		 +		{ +			setupHWLights(NULL); //to set mSunDir; +			LLVector4 dir(mSunDir, 0.f); +			glh::vec4f tc(dir.mV); +			mat.mult_matrix_vec(tc); +			mTransformedSunDir.set(tc.v); +		} + +		gGL.pushMatrix(); +		gGL.loadIdentity(); +		gGL.matrixMode(LLRender::MM_PROJECTION); +		gGL.pushMatrix(); +		gGL.loadIdentity(); + +		if (RenderDeferredSSAO || RenderShadowDetail > 0) +		{ +			mDeferredLight.bindTarget(); +			{ //paint shadow/SSAO light map (direct lighting lightmap) +				LLFastTimer ftm(FTM_SUN_SHADOW); +				bindDeferredShader(gDeferredSunProgram, 0); +				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				glClearColor(1,1,1,1); +				mDeferredLight.clear(GL_COLOR_BUFFER_BIT); +				glClearColor(0,0,0,0); + +				glh::matrix4f inv_trans = glh_get_current_modelview().inverse().transpose(); + +				const U32 slice = 32; +				F32 offset[slice*3]; +				for (U32 i = 0; i < 4; i++) +				{ +					for (U32 j = 0; j < 8; j++) +					{ +						glh::vec3f v; +						v.set_value(sinf(6.284f/8*j), cosf(6.284f/8*j), -(F32) i); +						v.normalize(); +						inv_trans.mult_matrix_vec(v); +						v.normalize(); +						offset[(i*8+j)*3+0] = v.v[0]; +						offset[(i*8+j)*3+1] = v.v[2]; +						offset[(i*8+j)*3+2] = v.v[1]; +					} +				} + +				gDeferredSunProgram.uniform3fv("offset", slice, offset); +				gDeferredSunProgram.uniform2f("screenRes", mDeferredLight.getWidth(), mDeferredLight.getHeight()); +				 +				{ +					LLGLDisable blend(GL_BLEND); +					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); +					stop_glerror(); +					mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); +					stop_glerror(); +				} +				 +				unbindDeferredShader(gDeferredSunProgram); +			} +			mDeferredLight.flush(); +		} +				 +		stop_glerror(); +		gGL.popMatrix(); +		stop_glerror(); +		gGL.matrixMode(LLRender::MM_MODELVIEW); +		stop_glerror(); +		gGL.popMatrix(); +		stop_glerror(); + +		// Done by callers... +		// +		//target->bindTarget(); +		// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky +		//glClearColor(0,0,0,0); +		//target->clear(GL_COLOR_BUFFER_BIT); +		 +		if (RenderDeferredAtmospheric) +		{ //apply sunlight contribution  +			LLFastTimer ftm(FTM_ATMOSPHERICS); +			bindDeferredShader(gDeferredSoftenProgram);	 +			{ +				LLGLDepthTest depth(GL_FALSE); +				LLGLDisable blend(GL_BLEND); +				LLGLDisable test(GL_ALPHA_TEST); + +				//full screen blit +				gGL.pushMatrix(); +				gGL.loadIdentity(); +				gGL.matrixMode(LLRender::MM_PROJECTION); +				gGL.pushMatrix(); +				gGL.loadIdentity(); + +				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				 +				mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); + +				gGL.popMatrix(); +				gGL.matrixMode(LLRender::MM_MODELVIEW); +				gGL.popMatrix(); +			} + +			unbindDeferredShader(gDeferredSoftenProgram); +		} + +		{ //render non-deferred geometry (fullbright, alpha, etc) +			LLGLDisable blend(GL_BLEND); +			LLGLDisable stencil(GL_STENCIL_TEST); +			gGL.setSceneBlendType(LLRender::BT_ALPHA); + +			gPipeline.pushRenderTypeMask(); +			 +			gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, +										LLPipeline::RENDER_TYPE_CLOUDS, +										LLPipeline::RENDER_TYPE_WL_SKY, +										LLPipeline::END_RENDER_TYPES); +								 +			 +			renderGeomPostDeferred(*LLViewerCamera::getInstance(), false); +			gPipeline.popRenderTypeMask(); +		} + +		BOOL render_local = RenderLocalLights; +				 +		if (render_local) +		{ +			gGL.setSceneBlendType(LLRender::BT_ADD); +			std::list<LLVector4> fullscreen_lights; +			LLDrawable::drawable_list_t spot_lights; +			LLDrawable::drawable_list_t fullscreen_spot_lights; + +			for (U32 i = 0; i < 2; i++) +			{ +				mTargetShadowSpotLight[i] = NULL; +			} + +			std::list<LLVector4> light_colors; + +			LLVertexBuffer::unbind(); + +			{ +				bindDeferredShader(gDeferredLightProgram); +				 +				if (mCubeVB.isNull()) +				{ +					mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB); +				} + +				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				 +				LLGLDepthTest depth(GL_TRUE, GL_FALSE); +				for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter) +				{ +					LLDrawable* drawablep = *iter; +					 +					LLVOVolume* volume = drawablep->getVOVolume(); +					if (!volume) +					{ +						continue; +					} + +					if (volume->isAttachment()) +					{ +						if (!sRenderAttachedLights) +						{ +							continue; +						} +					} + + +					LLVector4a center; +					center.load3(drawablep->getPositionAgent().mV); +					const F32* c = center.getF32ptr(); +					F32 s = volume->getLightRadius()*1.5f; + +					LLColor3 col = volume->getLightColor(); +					 +					if (col.magVecSquared() < 0.001f) +					{ +						continue; +					} + +					if (s <= 0.001f) +					{ +						continue; +					} + +					LLVector4a sa; +					sa.splat(s); +					if (camera->AABBInFrustumNoFarClip(center, sa) == 0) +					{ +						continue; +					} + +					sVisibleLightCount++; +										 +					if (camera->getOrigin().mV[0] > c[0] + s + 0.2f || +						camera->getOrigin().mV[0] < c[0] - s - 0.2f || +						camera->getOrigin().mV[1] > c[1] + s + 0.2f || +						camera->getOrigin().mV[1] < c[1] - s - 0.2f || +						camera->getOrigin().mV[2] > c[2] + s + 0.2f || +						camera->getOrigin().mV[2] < c[2] - s - 0.2f) +					{ //draw box if camera is outside box +						if (render_local) +						{ +							if (volume->isLightSpotlight()) +							{ +								drawablep->getVOVolume()->updateSpotLightPriority(); +								spot_lights.push_back(drawablep); +								continue; +							} +							 +							/*col.mV[0] = powf(col.mV[0], 2.2f); +							col.mV[1] = powf(col.mV[1], 2.2f); +							col.mV[2] = powf(col.mV[2], 2.2f);*/ +							 +							LLFastTimer ftm(FTM_LOCAL_LIGHTS); +							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); +							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s); +							gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV); +							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f); +							gGL.syncMatrices(); +							 +							mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center)); +							stop_glerror(); +						} +					} +					else +					{	 +						if (volume->isLightSpotlight()) +						{ +							drawablep->getVOVolume()->updateSpotLightPriority(); +							fullscreen_spot_lights.push_back(drawablep); +							continue; +						} + +						glh::vec3f tc(c); +						mat.mult_matrix_vec(tc); +					 +						fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s)); +						light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f)); +					} +				} +				unbindDeferredShader(gDeferredLightProgram); +			} + +			if (!spot_lights.empty()) +			{ +				LLGLDepthTest depth(GL_TRUE, GL_FALSE); +				bindDeferredShader(gDeferredSpotLightProgram); + +				mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + +				gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); + +				for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter) +				{ +					LLFastTimer ftm(FTM_PROJECTORS); +					LLDrawable* drawablep = *iter; + +					LLVOVolume* volume = drawablep->getVOVolume(); + +					LLVector4a center; +					center.load3(drawablep->getPositionAgent().mV); +					const F32* c = center.getF32ptr(); +					F32 s = volume->getLightRadius()*1.5f; + +					sVisibleLightCount++; + +					setupSpotLight(gDeferredSpotLightProgram, drawablep); +					 +					LLColor3 col = volume->getLightColor(); +					/*col.mV[0] = powf(col.mV[0], 2.2f); +					col.mV[1] = powf(col.mV[1], 2.2f); +					col.mV[2] = powf(col.mV[2], 2.2f);*/ +					 +					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); +					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s); +					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV); +					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f); +					gGL.syncMatrices(); +										 +					mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center)); +				} +				gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); +				unbindDeferredShader(gDeferredSpotLightProgram); +			} + +			//reset mDeferredVB to fullscreen triangle +			mDeferredVB->getVertexStrider(vert); +			vert[0].set(-1,1,0); +			vert[1].set(-1,-3,0); +			vert[2].set(3,1,0); + +			{ +				LLGLDepthTest depth(GL_FALSE); + +				//full screen blit +				gGL.pushMatrix(); +				gGL.loadIdentity(); +				gGL.matrixMode(LLRender::MM_PROJECTION); +				gGL.pushMatrix(); +				gGL.loadIdentity(); + +				U32 count = 0; + +				const U32 max_count = LL_DEFERRED_MULTI_LIGHT_COUNT; +				LLVector4 light[max_count]; +				LLVector4 col[max_count]; + +				F32 far_z = 0.f; + +				while (!fullscreen_lights.empty()) +				{ +					LLFastTimer ftm(FTM_FULLSCREEN_LIGHTS); +					light[count] = fullscreen_lights.front(); +					fullscreen_lights.pop_front(); +					col[count] = light_colors.front(); +					light_colors.pop_front(); +					 +					/*col[count].mV[0] = powf(col[count].mV[0], 2.2f); +					col[count].mV[1] = powf(col[count].mV[1], 2.2f); +					col[count].mV[2] = powf(col[count].mV[2], 2.2f);*/ +					 +					far_z = llmin(light[count].mV[2]-light[count].mV[3], far_z); +					//col[count] = pow4fsrgb(col[count], 2.2f); +					count++; +					if (count == max_count || fullscreen_lights.empty()) +					{ +						U32 idx = count-1; +						bindDeferredShader(gDeferredMultiLightProgram[idx]); +						gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count); +						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light); +						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col); +						gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z); +						far_z = 0.f; +						count = 0;  +						mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +						mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); +					} +				} +				 +				unbindDeferredShader(gDeferredMultiLightProgram[0]); + +				bindDeferredShader(gDeferredMultiSpotLightProgram); + +				gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); + +				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + +				for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter) +				{ +					LLFastTimer ftm(FTM_PROJECTORS); +					LLDrawable* drawablep = *iter; +					 +					LLVOVolume* volume = drawablep->getVOVolume(); + +					LLVector3 center = drawablep->getPositionAgent(); +					F32* c = center.mV; +					F32 s = volume->getLightRadius()*1.5f; + +					sVisibleLightCount++; + +					glh::vec3f tc(c); +					mat.mult_matrix_vec(tc); +					 +					setupSpotLight(gDeferredMultiSpotLightProgram, drawablep); + +					LLColor3 col = volume->getLightColor(); +					 +					/*col.mV[0] = powf(col.mV[0], 2.2f); +					col.mV[1] = powf(col.mV[1], 2.2f); +					col.mV[2] = powf(col.mV[2], 2.2f);*/ +					 +					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); +					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s); +					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV); +					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f); +					mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); +				} + +				gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); +				unbindDeferredShader(gDeferredMultiSpotLightProgram); + +				gGL.popMatrix(); +				gGL.matrixMode(LLRender::MM_MODELVIEW); +				gGL.popMatrix(); +			} +		} + +		gGL.setColorMask(true, true); +	} + +	target->flush(); + +	//gamma correct lighting +	gGL.matrixMode(LLRender::MM_PROJECTION); +	gGL.pushMatrix(); +	gGL.loadIdentity(); +	gGL.matrixMode(LLRender::MM_MODELVIEW); +	gGL.pushMatrix(); +	gGL.loadIdentity(); + +	{ +		LLGLDepthTest depth(GL_FALSE, GL_FALSE); + +		LLVector2 tc1(0,0); +		LLVector2 tc2((F32) target->getWidth()*2, +				  (F32) target->getHeight()*2); + +		target->bindTarget(); +		// Apply gamma correction to the frame here. +		gDeferredPostGammaCorrectProgram.bind(); +		//mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +		S32 channel = 0; +		channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, target->getUsage()); +		if (channel > -1) +		{ +			target->bindTexture(0,channel); +			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); +		} +		 +		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, target->getWidth(), target->getHeight()); +		 +		F32 gamma = 1.0/2.2; + +		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); +		 +		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(target->getUsage()); +		gDeferredPostGammaCorrectProgram.unbind(); +		target->flush(); +	} + +	gGL.matrixMode(LLRender::MM_PROJECTION); +	gGL.popMatrix(); +	gGL.matrixMode(LLRender::MM_MODELVIEW); +	gGL.popMatrix();	 + +	target->bindTarget(); + +	{ //render non-deferred geometry (alpha, fullbright, glow) +		LLGLDisable blend(GL_BLEND); +		LLGLDisable stencil(GL_STENCIL_TEST); + +		pushRenderTypeMask(); +		andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, +						 LLPipeline::RENDER_TYPE_FULLBRIGHT, +						 LLPipeline::RENDER_TYPE_VOLUME, +						 LLPipeline::RENDER_TYPE_GLOW, +						 LLPipeline::RENDER_TYPE_BUMP, +						 LLPipeline::RENDER_TYPE_PASS_SIMPLE, +						 LLPipeline::RENDER_TYPE_PASS_ALPHA, +						 LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, +						 LLPipeline::RENDER_TYPE_PASS_BUMP, +						 LLPipeline::RENDER_TYPE_PASS_POST_BUMP, +						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, +						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, +						 LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, +						 LLPipeline::RENDER_TYPE_PASS_GLOW, +						 LLPipeline::RENDER_TYPE_PASS_GRASS, +						 LLPipeline::RENDER_TYPE_PASS_SHINY, +						 LLPipeline::RENDER_TYPE_PASS_INVISIBLE, +						 LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, +						 LLPipeline::RENDER_TYPE_AVATAR, +						 LLPipeline::RENDER_TYPE_ALPHA_MASK, +						 LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, +						 END_RENDER_TYPES); +		 +		renderGeomPostDeferred(*LLViewerCamera::getInstance()); +		popRenderTypeMask(); +	} + +	// Done by callers for flexibility +	//target->flush();				 +} +  void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)  {  	//construct frustum @@ -9145,7 +9678,9 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			LLPipeline::sUseOcclusion = 0;  			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  			glClearColor(0,0,0,0); +  			mWaterRef.bindTarget(); +  			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER0;  			gGL.setColorMask(true, true);  			mWaterRef.clear(); @@ -9182,19 +9717,39 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			if (LLDrawPoolWater::sNeedsReflectionUpdate)  			{ -			//initial sky pass (no user clip plane) -			{ //mask out everything but the sky -				gPipeline.pushRenderTypeMask(); -				gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, -					LLPipeline::RENDER_TYPE_WL_SKY, -					LLPipeline::RENDER_TYPE_CLOUDS, -					LLPipeline::END_RENDER_TYPES); +				//initial sky pass (no user clip plane) +				{ //mask out everything but the sky +					gPipeline.pushRenderTypeMask(); +					gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, +						LLPipeline::RENDER_TYPE_WL_SKY, +						LLPipeline::RENDER_TYPE_CLOUDS, +						LLPipeline::END_RENDER_TYPES); -				static LLCullResult result; -				updateCull(camera, result); -				stateSort(camera, result); +					static LLCullResult result; +					updateCull(camera, result); +					stateSort(camera, result); -					renderGeom(camera, TRUE); +#if MATERIALS_IN_REFLECTIONS +					if (LLPipeline::sRenderDeferred) +					{ +						gGL.setColorMask(true, true); +						renderGeomDeferred(camera); +						gPipeline.mDeferredScreen.flush(); +						if(LLRenderTarget::sUseFBO) +						{ +							LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),  +								gPipeline.mDeferredScreen.getHeight(), 0, 0,  +								gPipeline.mDeferredScreen.getWidth(),  +								gPipeline.mDeferredScreen.getHeight(),  +								GL_DEPTH_BUFFER_BIT, GL_NEAREST); +						} +						renderDeferredLightingToRT(&mWaterRef); +					} +					else +#endif +					{ +						renderGeom(camera, TRUE); +					}					  					gPipeline.popRenderTypeMask();  				}					 @@ -9236,7 +9791,27 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  					{  						gPipeline.grabReferences(ref_result);  						LLGLUserClipPlane clip_plane(plane, mat, projection); -						renderGeom(camera); + +#if MATERIALS_IN_REFLECTIONS +						if (LLPipeline::sRenderDeferred) +						{ +							renderGeomDeferred(camera); +							gPipeline.mDeferredScreen.flush(); +							if(LLRenderTarget::sUseFBO) +							{ +								LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),  +									gPipeline.mDeferredScreen.getHeight(), 0, 0,  +									gPipeline.mDeferredScreen.getWidth(),  +									gPipeline.mDeferredScreen.getHeight(),  +									GL_DEPTH_BUFFER_BIT, GL_NEAREST); +							} +							renderDeferredLightingToRT(&mWaterRef); +						} +						else +#endif +						{ +							renderGeom(camera); +						}						  					}  				}	 @@ -9293,9 +9868,28 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  				gGL.setColorMask(true, true);  				mWaterDis.clear(); -				gGL.setColorMask(true, false); +#if MATERIALS_IN_REFLECTIONS +				if (LLPipeline::sRenderDeferred) +				{ +					renderGeomDeferred(camera); +					gPipeline.mDeferredScreen.flush(); +					if(LLRenderTarget::sUseFBO) +					{ +						LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),  +							gPipeline.mDeferredScreen.getHeight(), 0, 0,  +							gPipeline.mDeferredScreen.getWidth(),  +							gPipeline.mDeferredScreen.getHeight(),  +							GL_DEPTH_BUFFER_BIT, GL_NEAREST); +					} +					renderDeferredLightingToRT(&mWaterDis); +				} +				else +#endif +				{ +					gGL.setColorMask(true, false);  					renderGeom(camera); +				}  			} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 2f0fc3491d..36b293b998 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -288,6 +288,7 @@ public:  	void unbindDeferredShader(LLGLSLShader& shader);  	void renderDeferredLighting(); +	void renderDeferredLightingToRT(LLRenderTarget* target);  	void generateWaterReflection(LLCamera& camera);  	void generateSunShadow(LLCamera& camera); | 
