#include "../VertexLighting_PS.h"

// main֐
PS_OUTPUT main( PS_INPUT PSInput )
{
	PS_OUTPUT PSOutput ;
	float4 TextureDiffuseColor ;
	float4 TextureSpecularColor ;
	float4 ToonSpecularGradColor ;
	float4 ToonDiffuseGradColor ;
	float4 ToonSphereMapColor ;
	float4 ToonRGBtoVMaxRGBVolumeColor ;
	float3 Normal ;
	float4 TotalDiffuse ;
	float4 TotalSpecular ;
	float4 TotalLightDiffuse ;
	float3 TotalAmbient ;
	float TotalAngleGen ;
	float DiffuseAngleGen ;
	float4 TempF4 ;
	float3 TempF3 ;
	float Temp ;
	float3 ShadowRate ;
	float ShadowGen ;
	float ParamAlpha;

#if SHADOWMAP
	float2 DepthTexCoord ;
	float4 TextureDepth ;
//	float4 variance_md_p_pmax ;
#endif

	ParamAlpha = PSInput.Diffuse.a * cfFactorColor.a;

#if SUBTEXTUREMODE != 0
	float4 SubTextureColor;
#endif  // SUBTEXTUREMODE != 0

/*
#if SHADOWMAP_DRAW
	// VhE}bvւ̕` ************************************************************( Jn )

		// ylFƂďo
		PSOutput.Color0.r = PSInput.ShadowMap1Pos_ShadowMap3PosX.z;
//		PSOutput.Color0.g = PSInput.ShadowMap1Pos_ShadowMap3PosX.z * PSInput.ShadowMap1Pos_ShadowMap3PosX.z + 0.25f * ( ddx( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) * ddx( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) + ddy( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) * ddy( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) ) ;
		PSOutput.Color0.g = 0.0f ;
		PSOutput.Color0.b = 0.0f ;

		// ɂȂȂ悤ɃAt@͕KP
		PSOutput.Color0.a = 1.0f ;

	// VhE}bvւ̕` ************************************************************( I )
#else // SHADOWMAP_DRAW
*/
		TextureDiffuseColor = tex2D( DiffuseMapTexture, PSInput.TexCoords0_1.xy ) ;
	
	#ifdef USE_SPE
		#ifdef USE_SPETEX
		TextureSpecularColor = tex2D( SpecularMapTexture, PSInput.TexCoords0_1.xy ) ;
		#endif // USE_SPETEX
	#endif // USE_SPE

	#if SUBTEXTUREMODE != 0
		SubTextureColor = tex2D( SubTexture, PSInput.TexCoords0_1.zw ) ;
	#endif  // SUBTEXTUREMODE != 0

	#if SUBTEXTUREMODE == 1  // uh( MV1_LAYERBLEND_TYPE_TRANSLUCENT + 1 )
		TextureDiffuseColor.rgb = lerp( TextureDiffuseColor.rgb, SubTextureColor.rgb, SubTextureColor.a ) ;
	#endif // SUBTEXTUREMODE == 1

	#if SUBTEXTUREMODE == 2  // Z( MV1_LAYERBLEND_TYPE_ADDITIVE + 1 )
		TextureDiffuseColor.rgb += SubTextureColor.rgb;
	#endif // SUBTEXTUREMODE == 2

	#if SUBTEXTUREMODE == 3  // Z( MV1_LAYERBLEND_TYPE_MODULATE + 1 )
		TextureDiffuseColor.rgb *= SubTextureColor.rgb;
	#endif // SUBTEXTUREMODE == 3

	#if SUBTEXTUREMODE == 4  // Z~Q( MV1_LAYERBLEND_TYPE_MODULATE2 + 1 )
		TextureDiffuseColor.rgb *= SubTextureColor.rgb * 2.0f;
	#endif // SUBTEXTUREMODE == 4

		// CggȂꍇ̓J[̂܂܏o *****************************************( Jn )
		#ifndef LG_USE

			// VhE}bvւ̕` *********************************************************( Jn )
			#if SHADOWMAP_DRAW
				#if TOON
					#if TOON == 1
						// o̓ = eNX` * fBt[Y * 惿
						PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

					#else	// TOON == 1
						#if TOON_SPHEREOP_MUL
							Normal = normalize( PSInput.Normal_Fog.xyz ) ;
						
							// XtBA}bv̐F擾
							TempF3 = Normal * float3( 0.5f, -0.5f, 0.0f ) + cfZeroHalfOneTwo.yyy ;
							ToonSphereMapColor = tex2D( ToonSphereMapTexture, TempF3.xy ) ;

							PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha * ToonSphereMapColor.a ;

						#else // TOON_SPHEREOP_MUL

							PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

						#endif // TOON_SPHEREOP_MUL

					#endif		// TOON == 1
				#else  // TOON
				
					// o̓ = eNX` * fBt[Y * 惿
					PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
					
				#endif // TOON
				
				// ylFƂďo
				PSOutput.Color0.r = PSInput.ShadowMap1Pos_ShadowMap3PosX.z;
//				PSOutput.Color0.g = PSInput.ShadowMap1Pos_ShadowMap3PosX.z * PSInput.ShadowMap1Pos_ShadowMap3PosX.z + 0.25f * ( ddx( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) * ddx( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) + ddy( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) * ddy( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) ) ;
				PSOutput.Color0.g = 0.0f ;
				PSOutput.Color0.b = 0.0f ;
			
			// VhE}bvւ̕` *********************************************************( I )
			#else // SHADOWMAP_DRAW
			
				#ifdef USE_SPE

					#ifdef USE_SPETEX

						PSOutput.Color0 = PSInput.Specular * TextureSpecularColor + PSInput.Diffuse * TextureDiffuseColor ;

					#else  // USE_SPETEX

						PSOutput.Color0 = PSInput.Specular + PSInput.Diffuse * TextureDiffuseColor ;

					#endif // USE_SPETEX

				#else  // USE_SPE

					PSOutput.Color0 = PSInput.Diffuse * TextureDiffuseColor ;

				#endif // USE_SPE

				PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
				
			#endif // SHADOWMAP_DRAW

		// CggȂꍇ̓J[̂܂܏o *****************************************( I )
		#else // LG_USE
		// Cggꍇ *******************************************************************( Jn )

			// ov}bv or tHVF[fBȌꍇ =========================================( Jn )
			#if BUMPMAP || PHONG

				#if BUMPMAP

					// @ 0`1 ̒l -1.0`1.0 ɕϊ
					Normal = ( tex2D( NormalMapTexture, PSInput.TexCoords0_1.xy ).rgb - cfZeroHalfOneTwo.y ) * cfZeroHalfOneTwo.w ;

				#else // BUMPMAP

					Normal = PSInput.Normal_Fog.xyz ;

				#endif // BUMPMAP


				#ifdef    PHONG
					Normal = normalize( Normal ) ;
				#endif

				#if	SHADOWMAP
					// _̃eNX`Wl͈͓̏ꍇ̂ݏ
					if( PSInput.ShadowMap1Pos_ShadowMap3PosX.x < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.x > 1.0f ||
						PSInput.ShadowMap1Pos_ShadowMap3PosX.y < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.y > 1.0f ||
						PSInput.ShadowMap1Pos_ShadowMap3PosX.z <  0.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.z > 1.0f )
					{
						ShadowRate.x = 1.0f;
					}
					else
					{
						// [xeNX`̍WZo
						// PSInput.ShadowMap1Pos_ShadowMap3PosX.xy  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
						DepthTexCoord.x = ( PSInput.ShadowMap1Pos_ShadowMap3PosX.x + 1.0f ) / 2.0f;

						// y͍Xɏ㉺]
						DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap1Pos_ShadowMap3PosX.y + 1.0f ) / 2.0f;

						// [xobt@eNX`[x擾
						TextureDepth = tex2D( ShadowMap1Texture, DepthTexCoord );

						// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
						ShadowRate.x = smoothstep( PSInput.ShadowMap1Pos_ShadowMap3PosX.z - cfShadowMap1_DAdj_Grad_Enbl0_1.y, PSInput.ShadowMap1Pos_ShadowMap3PosX.z, TextureDepth.r + cfShadowMap1_DAdj_Grad_Enbl0_1.x ) ;
					}

					// _̃eNX`Wl͈͓̏ꍇ̂ݏ
					if( PSInput.ShadowMap2Pos_ShadowMap3PosY.x < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.x > 1.0f ||
						PSInput.ShadowMap2Pos_ShadowMap3PosY.y < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.y > 1.0f ||
						PSInput.ShadowMap2Pos_ShadowMap3PosY.z <  0.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.z > 1.0f )
					{
						ShadowRate.y = 1.0f;
					}
					else
					{
						// [xeNX`̍WZo
						// PSInput.ShadowMap2Pos_ShadowMap3PosY.xy  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
						DepthTexCoord.x = ( PSInput.ShadowMap2Pos_ShadowMap3PosY.x + 1.0f ) / 2.0f;

						// y͍Xɏ㉺]
						DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap2Pos_ShadowMap3PosY.y + 1.0f ) / 2.0f;

						// [xobt@eNX`[x擾
						TextureDepth = tex2D( ShadowMap2Texture, DepthTexCoord );

						// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
						ShadowRate.y = smoothstep( PSInput.ShadowMap2Pos_ShadowMap3PosY.z - cfShadowMap1_Enb2_ShadowMap2_DAdj_Grad_Enbl0.z, PSInput.ShadowMap2Pos_ShadowMap3PosY.z, TextureDepth.r + cfShadowMap1_Enb2_ShadowMap2_DAdj_Grad_Enbl0.y ) ;
					}

					// _̃eNX`Wl͈͓̏ꍇ̂ݏ
					if( PSInput.ShadowMap1Pos_ShadowMap3PosX.w < -1.0f || PSInput.ShadowMap1Pos_ShadowMap3PosX.w > 1.0f ||
						PSInput.ShadowMap2Pos_ShadowMap3PosY.w < -1.0f || PSInput.ShadowMap2Pos_ShadowMap3PosY.w > 1.0f ||
						PSInput.V_to_Eye_ShadowMap3PosZ.w      <  0.0f || PSInput.V_to_Eye_ShadowMap3PosZ.w      > 1.0f )
					{
						ShadowRate.z = 1.0f;
					}
					else
					{
						// [xeNX`̍WZo
						// PSInput.ShadowMap1Pos_ShadowMap3PosX.w  PSInput.ShadowMap2Pos_ShadowMap3PosY.w  -1.0f ` 1.0f ̒lȂ̂ŁA 0.0f ` 1.0f ̒lɂ
						DepthTexCoord.x = ( PSInput.ShadowMap1Pos_ShadowMap3PosX.w + 1.0f ) / 2.0f;

						// y͍Xɏ㉺]
						DepthTexCoord.y = 1.0f - ( PSInput.ShadowMap2Pos_ShadowMap3PosY.w + 1.0f ) / 2.0f;

						// [xobt@eNX`[x擾
						TextureDepth = tex2D( ShadowMap3Texture, DepthTexCoord );

						// eNX`ɋL^Ă[x( +␳l )yl傫牜ɂƂƂŌőɂ
						ShadowRate.z = smoothstep( PSInput.V_to_Eye_ShadowMap3PosZ.w - cfShadowMap2_Enbl1_2_ShadowMap3_DAdj_Grad.w, PSInput.V_to_Eye_ShadowMap3PosZ.w, TextureDepth.r + cfShadowMap2_Enbl1_2_ShadowMap3_DAdj_Grad.z ) ;
					}

/*
					variance_md_p_pmax.x = TextureDepth.g - ( TextureDepth.r * TextureDepth.r ) ;
					variance_md_p_pmax.y = TextureDepth.r - ( PSInput.ShadowMap1Pos_ShadowMap3PosX.z + 1.0f ) ;
					variance_md_p_pmax.z = variance_md_p_pmax.x / ( variance_md_p_pmax.x + variance_md_p_pmax.y * variance_md_p_pmax.y ) ;
					ShadowRate = max( saturate( variance_md_p_pmax.z ), ( PSInput.ShadowMap1Pos_ShadowMap3PosX.z + 1.0f ) <= TextureDepth.r + cfShadowMap_DAdj_Grad.x ) ;
*/
/*
					variance_md_p_pmax.x = TextureDepth.g - ( TextureDepth.r * TextureDepth.r ) ;
					variance_md_p_pmax.y = TextureDepth.r - PSInput.ShadowMap1Pos_ShadowMap3PosX.z ;
					variance_md_p_pmax.z = variance_md_p_pmax.x / ( variance_md_p_pmax.x + variance_md_p_pmax.y * variance_md_p_pmax.y ) ;
//					ShadowRate = max( saturate( variance_md_p_pmax.z ), PSInput.ShadowMap1Pos_ShadowMap3PosX.z <= TextureDepth.r + cfShadowMap_DAdj_Grad.x ) ;
					ShadowRate = saturate( variance_md_p_pmax.z ) ;
*/
/*
					variance_md_p_pmax.z = smoothstep( PSInput.ShadowMap1Pos_ShadowMap3PosX.z - 0.02f, PSInput.ShadowMap1Pos_ShadowMap3PosX.z, TextureDepth.r ) ;
					variance_md_p_pmax.x = max( TextureDepth.g - ( TextureDepth.r * TextureDepth.r ), 0.0f ) ;
					variance_md_p_pmax.y = PSInput.ShadowMap1Pos_ShadowMap3PosX.z - TextureDepth.r ;
					variance_md_p_pmax.y = variance_md_p_pmax.y * variance_md_p_pmax.y ;
					variance_md_p_pmax.y = max( variance_md_p_pmax.y, 0.001f ) ;
					variance_md_p_pmax.w = variance_md_p_pmax.x / ( variance_md_p_pmax.x + variance_md_p_pmax.y ) ;
					variance_md_p_pmax.w = clamp( variance_md_p_pmax.w, 0.0f, 1.0f ) ;
//					variance_md_p_pmax.w = clamp( ( variance_md_p_pmax.w - 0.2f ) / ( 1.0f - 0.2f ), 0.0f, 1.0f ) ;
//					ShadowRate = clamp( max( variance_md_p_pmax.z, variance_md_p_pmax.w ), 0.0f, 1.0f ) ;
					ShadowRate = clamp( variance_md_p_pmax.z, 0.0f, 1.0f ) ;
*/
/*
					if( saturate( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) < TextureDepth.r + cfShadowMap_DAdj_Grad.x )
			 		{
						ShadowRate += 1.0f / 5.0f ;
					}

					// [xobt@eNX`[x擾
					DepthTexCoord.x -= 1.0f / 4096.0f ;
					TextureDepth = tex2D( ShadowMapTexture, DepthTexCoord );
					if( saturate( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) < TextureDepth.r + cfShadowMap_DAdj_Grad.x )
			 		{
						ShadowRate += 1.0f / 5.0f ;
					}
					DepthTexCoord.x += 2.0f / 4096.0f ;
					TextureDepth = tex2D( ShadowMapTexture, DepthTexCoord );
					if( saturate( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) < TextureDepth.r + cfShadowMap_DAdj_Grad.x )
			 		{
						ShadowRate += 1.0f / 5.0f ;
					}
					DepthTexCoord.x -= 1.0f / 4096.0f ;
					DepthTexCoord.y -= 1.0f / 4096.0f ;
					TextureDepth = tex2D( ShadowMapTexture, DepthTexCoord );
					if( saturate( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) < TextureDepth.r + cfShadowMap_DAdj_Grad.x )
			 		{
						ShadowRate += 1.0f / 5.0f ;
					}
					DepthTexCoord.y += 2.0f / 4096.0f ;
					TextureDepth = tex2D( ShadowMapTexture, DepthTexCoord );
					if( saturate( PSInput.ShadowMap1Pos_ShadowMap3PosX.z ) < TextureDepth.r + cfShadowMap_DAdj_Grad.x )
			 		{
						ShadowRate += 1.0f / 5.0f ;
					}
*/
				#else // SHADOWMAP
					ShadowRate.x = 1.0f ;
					ShadowRate.y = 1.0f ;
					ShadowRate.z = 1.0f ;
				#endif // SHADOWMAP

				// fBt[YJ[ƃXyLJ[̒~ϒl
				TotalDiffuse = cfZeroHalfOneTwo.x ;
				TotalSpecular = cfZeroHalfOneTwo.x ;
				#if TOON
					#if TOON == 1
						TotalLightDiffuse = cfZeroHalfOneTwo.x ;
					#else // TOON == 1
						TotalAmbient = cfZeroHalfOneTwo.x ;
						TotalAngleGen = cfZeroHalfOneTwo.x ;
					#endif
				#endif // TOON




				%MV1Default_VertexLighting_PS_Light.txt%$0$
				%MV1Default_VertexLighting_PS_Light.txt%$1$
				%MV1Default_VertexLighting_PS_Light.txt%$2$









				// o̓J[vZ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( Jn )

				#if TOON != 2
					// TotalDiffuse = CgfBt[YJ[~ϒl + ( }eÃArGgJ[ƃO[oArGgJ[Ẑƃ}eAG~bVuJ[Z )
					TotalDiffuse += cfAmbient_Emissive ;
				#else // TOON != 2
					// ArGgJ[̒~ϒl += }eÃArGgJ[ƃO[oArGgJ[Ẑƃ}eAG~bVuJ[Z
					TotalAmbient += cfAmbient_Emissive.rgb ;
				#endif  // TOON != 2

				#ifdef USE_SPE
					#if TOON
						#if TOON == 1
							// gD[P̎̏o͌vZ
							ToonSpecularGradColor = tex2D( ToonSpecularGradTexture, max( TotalSpecular.b, max( TotalSpecular.r, TotalSpecular.g ) ) ) ;
						
							#ifdef USE_SPETEX
								TextureSpecularColor.rgb *= ToonSpecularGradColor.rgb ;
							#else  // USE_SPETEX
								TextureSpecularColor = ToonSpecularGradColor ;
							#endif // USE_SPETEX
						
							TextureSpecularColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalSpecular.rgb ).rgb * PSInput.Specular.rgb ;

							TextureDiffuseColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalLightDiffuse.rgb ).rgb * PSInput.Diffuse.rgb ;

							ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, max( TotalDiffuse.b, max( TotalDiffuse.r, TotalDiffuse.g ) ) ) ;

							#if TOON_DIFOP_MUL
								PSOutput.Color0 = TextureDiffuseColor * ToonDiffuseGradColor ;
							#endif // TOON_DIFOP_MUL
							#if TOON_DIFOP_TRANS
								PSOutput.Color0 = lerp( TextureDiffuseColor, ToonDiffuseGradColor, ToonDiffuseGradColor.a ) ;
							#endif // TOON_DIFOP_TRANS

							#if TOON_SPEOP_ADD
								PSOutput.Color0 = PSOutput.Color0 + TextureSpecularColor ;
							#endif // TOON_SPEOP_ADD
							#if TOON_SPEOP_TRANS
								PSOutput.Color0 = lerp( PSOutput.Color0, TextureSpecularColor, TextureSpecularColor.a ) ;
							#endif // TOON_SPEOP_TRANS

							#if TOON_DIFOP_MUL
								ParamAlpha *= ToonDiffuseGradColor.a ;
							#endif // TOON_DIFOP_MUL

							PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
						
						#else  // TOON == 1
							// gD[Q̎̏o͌vZ
							ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, TotalAngleGen ) ;

							// o = saturate( saturate( ArGgJ[̒~ϒl + }eÃfBt[YJ[ * Cg̃fBt[YJ[̒~ϒl ) * eNX`Of[VJ[ + XyLJ[~ϒl * }eÃXyLJ[ ) * eNX`J[
							PSOutput.Color0.rgb = saturate( saturate( TotalDiffuse.rgb * PSInput.Diffuse.rgb + TotalAmbient ) * ToonDiffuseGradColor.rgb + PSInput.Specular.rgb * TotalSpecular.rgb ) * TextureDiffuseColor.rgb ;
						
							#if TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD
								// XtBA}bv̐F擾
								TempF3 = Normal * float3( 0.5f, -0.5f, 0.0f ) + cfZeroHalfOneTwo.yyy ;
								ToonSphereMapColor = tex2D( ToonSphereMapTexture, TempF3.xy ) ;
							
								#if TOON_SPHEREOP_MUL
									// XtBA}bv̐Fo͂ɏZ
									PSOutput.Color0.rgb *= ToonSphereMapColor.rgb ;
								#endif // TOON_SPHEREOP_MUL
							
								#if TOON_SPHEREOP_ADD
									// XtBA}bv̐Fo͂ɉZ
									PSOutput.Color0.rgb += ToonSphereMapColor.rgb ;
								#endif // TOON_SPHEREOP_ADD
							
							#endif // TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD

							#if TOON_SPHEREOP_MUL 

								// o̓At@ = eNX`At@ * FactorAt@ * _At@ * XtBA}bvAt@
								PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha * ToonSphereMapColor.a ;

							#else // TOON_SPHEREOP_MUL

								// o̓At@ = eNX`At@ * FactorAt@ * _At@
								PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

							#endif // TOON_SPHEREOP_MUL

						#endif   // TOON == 1
					#else  // TOON

						#ifdef USE_SPETEX
							// TextureSpecularColor = Cg̃XyLJ[~ϒl * XyLJ[ * XyLeNX`J[
							TextureSpecularColor = tex2D( SpecularMapTexture, PSInput.TexCoords0_1.xy ) * TotalSpecular * PSInput.Specular ;
						#else  // USE_SPETEX
							// TextureSpecularColor = Cg̃XyLJ[~ϒl * XyLJ[
							TextureSpecularColor = TotalSpecular * PSInput.Specular ;
						#endif // USE_SPETEX

						// o̓J[ = TotalDiffuse * eNX`J[ + TextureSpecularColor

						PSOutput.Color0.rgb = TextureDiffuseColor.rgb * TotalDiffuse.rgb + TextureSpecularColor.rgb ;
						PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

					#endif // TOON

				#else  // USE_SPE

					#if TOON
						#if TOON == 1
							ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, max( TotalDiffuse.b, max( TotalDiffuse.r, TotalDiffuse.g ) ) ) ;
							TextureDiffuseColor.rgb *= tex3D( ToonRGBtoVMaxRGBVolumeTexture, TotalLightDiffuse.rgb ).rgb * PSInput.Diffuse.rgb ;

							#if TOON_DIFOP_MUL
								// o̓J[ = eNX`J[ * fBt[YJ[~ϒl * Of[VJ[
								PSOutput.Color0 = TextureDiffuseColor * ToonDiffuseGradColor ;
							#endif // TOON_DIFOP_MUL
							#if TOON_DIFOP_TRANS
								// o̓J[ = Of[VJ[ * Of[V + ( 1 - Of[V ) * ( eNX`J[ * fBt[YJ[~ϒl )
								PSOutput.Color0 = lerp( TextureDiffuseColor, ToonDiffuseGradColor, ToonDiffuseGradColor.a ) ;
							#endif // TOON_DIFOP_TRANS

							// Z̏ꍇ̓lOf[VƏZ
							#if TOON_DIFOP_MUL
								ParamAlpha *= ToonDiffuseGradColor.a ;
							#endif // TOON_DIFOP_MUL

							// o̓ = eNX` * fBt[Y * 惿
							PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

						#else	// TOON == 1
							// gD[Q̎̏o͌vZ
							ToonDiffuseGradColor = tex2D( ToonDiffuseGradTexture, TotalAngleGen ) ;

							// o = ( ArGgJ[̒~ϒl + }eÃfBt[YJ[ * Cg̃fBt[YJ[̒~ϒl ) * eNX`Of[VJ[ * eNX`J[
							PSOutput.Color0.rgb = saturate( TotalDiffuse.rgb * PSInput.Diffuse.rgb + TotalAmbient.rgb ) * ToonDiffuseGradColor.rgb * TextureDiffuseColor.rgb ;

							#if TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD
								// XtBA}bv̐F擾
								TempF3 = Normal * float3( 0.5f, -0.5f, 0.0f ) + cfZeroHalfOneTwo.yyy ;
								ToonSphereMapColor = tex2D( ToonSphereMapTexture, TempF3.xy ) ;
							
								#if TOON_SPHEREOP_MUL
									// XtBA}bv̐Fo͂ɏZ
									PSOutput.Color0.rgb *= ToonSphereMapColor.rgb ;
								#endif // TOON_SPHEREOP_MUL
							
								#if TOON_SPHEREOP_ADD
									// XtBA}bv̐Fo͂ɉZ
									PSOutput.Color0.rgb += ToonSphereMapColor.rgb ;
								#endif // TOON_SPHEREOP_ADD
							
							#endif // TOON_SPHEREOP_MUL || TOON_SPHEREOP_ADD

							#if TOON_SPHEREOP_MUL

								PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha * ToonSphereMapColor.a ;

							#else // TOON_SPHEREOP_MUL

								PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;

							#endif // TOON_SPHEREOP_MUL

						#endif		// TOON == 1
					#else  // TOON
						// o̓J[ = TotalDiffuse * eNX`J[
						PSOutput.Color0.rgb = TotalDiffuse.rgb * TextureDiffuseColor.rgb ;

						// o̓ = eNX` * fBt[Y * 惿
						PSOutput.Color0.a = TextureDiffuseColor.a * ParamAlpha ;
					#endif // TOON

				#endif // USE_SPE

				// o̓J[vZ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( I )


			// ov}bv or tHVF[fBȌꍇ =========================================( I )
			#else  // BUMPMAP || PHONG
				// ov}bv or tHVF[fBOł͂Ȃꍇ ===================================( Jn )

				#ifdef USE_SPE

					#ifdef USE_SPETEX

						PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb + TextureSpecularColor.rgb * PSInput.Specular.rgb ;

					#else  // USE_SPETEX

						PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb + PSInput.Specular.rgb ;

					#endif // USE_SPETEX

				#else  // USE_SPE

					PSOutput.Color0.rgb = TextureDiffuseColor.rgb * PSInput.Diffuse.rgb ;

				#endif // USE_SPE

				PSOutput.Color0.a   = TextureDiffuseColor.a   * ParamAlpha ;

			#endif // BUMPMAP || PHONG
			// ov}bv or tHVF[fBOł͂Ȃꍇ ===================================( I )

		#endif // LG_USE
		// Cggꍇ *******************************************************************( I )

	#if SM_3
		// tHO
		PSOutput.Color0.rgb = lerp( cfFogColor.rgb, PSOutput.Color0.rgb, saturate( PSInput.Normal_Fog.w ) );
	#endif // SM_3

	// At@ZJ[
	if( cfMulAlphaColor.x > 0.5f )
	{
		PSOutput.Color0.rgb *= PSOutput.Color0.a;
	}

// #endif // SHADOWMAP_DRAW

	return PSOutput ;
}

