MikuMikuDance着色器分析



  • 大家都觉得MMD(也就是MikuMikuDance)的画面清新艳丽,也挺棒的,都想如果做一个类似的软件甚至是更好的动漫渲染软件该多好啊。我们也找了很多的方法,慢慢地,一点一点地揭开它渲染的面纱。

    寻找着色器

    首先我们想,使用了这么先进的渲染理念应该有一个很棒的着色器吧,于是我们将MikuMikuDance解压,发现有两个文件指向的是着色器相关的内容,它们分别是117文件和118文件。文件名只是作为Windows资源的一个号码,实际上源文件可能是另有命名。117和118文件都是使用微软着色器的语言HLSL,所以要看懂这些着色器的内容,需要微软HLSL相关的知识。现在我们将对117和118文件做一个深入的探讨。

    117文件内容

    float4x4 matLightViewProj;	// 光方向ビュー射影変換済み行列
    float4x4 matWorldViewProj;	// ワールドビュー射影変換済み行列
    float4x4 matWorld;			// ワールド座標のみ行列
    float4x4 matRotate;			// 回転のみ行列
    float4x4 matWRotate;		//
    float4	 EgColor;			// エッジ色
    float4	 ToonColor;			// トゥーン色
    float4   LightDir;			// 光方向
    float4   SpcColor;			// スペキュラ色
    float4   Place;				// カメラの位置
    float4   DifColor;			// ディフューズ色
    float4   TexCAdd;			// テクスチャパレット加算値
    float4   TexCMul;			// テクスチャパレット乗算値
    float4   SphCAdd;			// スフィアテクスチャパレット値加算値
    float4   SphCMul;			// スフィアテクスチャパレット値乗算値
    float4   MatDifColor;
    float4   MatAmbColor;
    float4   MatEmsColor;
    float4   MatSpcColor;
    bool	 parthf;			// パースペクティブフラグ
    bool	 spadd;				// スフィアマップ加算合成フラグ
    bool	 transp;			// 半透明フラグ
    int		 SKII1;				// 閾値(D3DFMT_R32F時1500、以外500)
    
    #define	SKII2	2000
    
    ///////////// 単色塗り潰しテクニック ////////////////
    
    // 頂点シェーダ
    float4 ColorRender_VS(float4 Pos : POSITION) : POSITION
    {
    	return mul( Pos, matWorldViewProj );
    }
    
    // ピクセルシェーダ
    float4 ColorRender_PS() : COLOR
    {
    	// EgColor色で塗り潰し
    	return float4(EgColor.r,EgColor.g,EgColor.b,EgColor.a);
    }
    
    technique ColorRenderTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    
    		VertexShader = compile vs_2_0 ColorRender_VS();
    		PixelShader  = compile ps_2_0 ColorRender_PS();
    	}
    }
    
    
    ///////////// Zバッファプロットテクニック ////////////////
    
    struct VS_ZValuePlot_OUTPUT
    {
    	float4 Pos : POSITION;				// 射影変換座標
    	float4 ShadowMapTex : TEXCOORD0;	// Zバッファテクスチャ
    };
    
    // 頂点シェーダ
    VS_ZValuePlot_OUTPUT ZValuePlot_VS( float4 Pos : POSITION )
    {
    	VS_ZValuePlot_OUTPUT Out = (VS_ZValuePlot_OUTPUT)0;
    
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標を頂点に合わせる
    	Out.ShadowMapTex = Out.Pos;
    
    	return Out;
    }
    
    
    // ピクセルシェーダ
    float4 ZValuePlot_PS( float4 ShadowMapTex : TEXCOORD0 ) : COLOR
    {
    	return float4(ShadowMapTex.z/ShadowMapTex.w,0,0,1);
    }
    
    technique ZValuePlotTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		AlphaBlendEnable = FALSE;
    	
    		VertexShader = compile vs_2_0 ZValuePlot_VS();
    		PixelShader  = compile ps_2_0 ZValuePlot_PS();
    	}
    }
    
    ///////////// 分散光なしテクスチャなしバッファシャドウテクニック ////////////////
    
    sampler DefSampler = sampler_state	// サンプラーステート
    {
    	AddressU  = Clamp;
    	AddressV  = Clamp;
    	AddressW  = Clamp;
    	MINFILTER = LINEAR;
    	MAGFILTER = LINEAR;
    	MIPFILTER = NONE;
    };
    
    struct BufferShadow_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float3 N		: TEXCOORD1;	// 法線
    	float3 Eye		: TEXCOORD2;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BufferShadow_OUTPUT BufferShadow_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	BufferShadow_OUTPUT Out = (BufferShadow_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    	
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BufferShadow_PS(float4 ZCalcTex : TEXCOORD0,float3 N : TEXCOORD1,float3 Eye : TEXCOORD2) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       
    	if(TransTexCoord.x<0.0f)      return EgColor + Specula;
    	else if(TransTexCoord.x>1.0f) return EgColor + Specula;
    	else if(TransTexCoord.y<0.0f) return EgColor + Specula;
    	else if(TransTexCoord.y>1.0f) return EgColor + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z-tex2D(DefSampler,TransTexCoord).r , 0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z-tex2D(DefSampler,TransTexCoord).r , 0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor + Specula;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}else{
    			float4 ans = EgColor*comp + EgColor*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;			
    		}
    	}
    }
    
    technique BufferShadowTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BufferShadow_VS();
    		PixelShader  = compile ps_2_0 BufferShadow_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャありバッファシャドウテクニック ////////////////
    
    sampler s1 : register(s1);      //オブジェクトのテクスチャー
    
    struct BShadowTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ
    	float3 N		: TEXCOORD2;	// 法線
    	float3 Eye		: TEXCOORD3;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       float alp = TexCMul.w + TexCAdd.w;
    
    	if(TransTexCoord.x<0.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * TexCMul + TexCAdd)*alp + (1-alp)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else if(TransTexCoord.x>1.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * TexCMul + TexCAdd)*alp + (1-alp)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else if(TransTexCoord.y<0.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * TexCMul + TexCAdd)*alp + (1-alp)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else if(TransTexCoord.y>1.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * TexCMul + TexCAdd)*alp + (1-alp)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor*((tex2D(s1,Tex) * TexCMul + TexCAdd)*alp +(1-alp)) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}else{
    			float4 ans = (EgColor*(tex2D(s1,Tex) * TexCMul + TexCAdd)*alp+(1-alp))*(comp + ToonColor*(1-comp)) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BShadowTexture_VS();
    		PixelShader  = compile ps_2_0 BShadowTexture_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャなしスフィアありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowSphia_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// スフィアマップテクスチャ座標
    	Out.Tex = mul(Normal, matRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowSphia_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    	float alp = SphCMul.w + SphCAdd.w;
    	
    	// スフィアマップ座標計算
    	Tex.x = Tex.x * 0.5f + 0.5f;
    	Tex.y = Tex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	if(spadd) ans = EgColor + (tex2D(s1,Tex) * SphCMul + SphCAdd)*alp;
    	else	  ans = EgColor * ((tex2D(s1,Tex) * SphCMul + SphCAdd)*alp+(1-alp));
    	ans.w = EgColor.w * tex2D(s1,Tex).w;
    	if(TransTexCoord.x<0.0f)      return ans + Specula;
    	else if(TransTexCoord.x>1.0f) return ans + Specula;
    	else if(TransTexCoord.y<0.0f) return ans + Specula;
    	else if(TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}else{
    			ans = ans*comp + ans*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowSphiaTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BShadowSphia_VS();
    		PixelShader  = compile ps_2_0 BShadowSphia_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャありスフィアマップありバッファシャドウテクニック ////////////////
    
    sampler s2 : register(s2);      //オブジェクトのテクスチャー
    
    struct BShadowSphiaTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ座標
    	float2 SpTex	: TEXCOORD2;	// スフィアマップテクスチャ座標
    	float3 N		: TEXCOORD3;	// 法線
    	float3 Eye		: TEXCOORD4;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BShadowSphiaTexture_OUTPUT BShadowSphiaTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	BShadowSphiaTexture_OUTPUT Out = (BShadowSphiaTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = mul(Normal, matRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowSphiaTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       
      	// スフィアマップ座標計算
    	SpTex.x = SpTex.x * 0.5f + 0.5f;
    	SpTex.y = SpTex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	if(spadd) ans = EgColor * (tex2D(s1,Tex) * TexCMul + TexCAdd) + (tex2D(s2,SpTex) * SphCMul + SphCAdd);
    	else	  ans = EgColor * (tex2D(s1,Tex) * TexCMul + TexCAdd) * (tex2D(s2,SpTex) * SphCMul + SphCAdd);
    	ans.w = EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    	
    	if(TransTexCoord.x<0.0f)      return ans + Specula;
    	else if(TransTexCoord.x>1.0f) return ans + Specula;
    	else if(TransTexCoord.y<0.0f) return ans + Specula;
    	else if(TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}else{
    			ans = ans*comp + ans*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}
    	}
    }
    
    technique BShadowSphiaTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BShadowSphiaTexture_VS();
    		PixelShader  = compile ps_2_0 BShadowSphiaTexture_PS();
    	}
    }
    
    ///////////// 分散光なしテクスチャなしテクスチャコード2ありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowTexCd2_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD1)
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTexCd2_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	if(TransTexCoord.x<0.0f)      return EgColor * (tex2D(s1,Tex) * SphCMul + SphCAdd) + Specula;
    	else if(TransTexCoord.x>1.0f) return EgColor * (tex2D(s1,Tex) * SphCMul + SphCAdd) + Specula;
    	else if(TransTexCoord.y<0.0f) return EgColor * (tex2D(s1,Tex) * SphCMul + SphCAdd) + Specula;
    	else if(TransTexCoord.y>1.0f) return EgColor * (tex2D(s1,Tex) * SphCMul + SphCAdd) + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor*(tex2D(s1,Tex) * SphCMul + SphCAdd) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}else{
    			float4 ans = EgColor*(tex2D(s1,Tex) * SphCMul + SphCAdd)*comp + EgColor*tex2D(s1,Tex)*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTexCd2Tec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BShadowTexCd2_VS();
    		PixelShader  = compile ps_2_0 BShadowTexCd2_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャありテクスチャコード2ありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowSphiaTexture_OUTPUT BShadowTextureTexCd2Tec_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0, float2 Tex2 : TEXCOORD1 )
    {
    	BShadowSphiaTexture_OUTPUT Out = (BShadowSphiaTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = Tex2;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTextureTexCd2Tec_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       
    	float4 ans;
    	if(spadd) ans = EgColor * (tex2D(s1,Tex) * TexCMul + TexCAdd) + (tex2D(s2,SpTex) * SphCMul + SphCAdd);
    	else	  ans = EgColor * (tex2D(s1,Tex) * TexCMul + TexCAdd) * (tex2D(s2,SpTex) * SphCMul + SphCAdd);
    	ans.w = (tex2D(s1,Tex) * TexCMul + TexCAdd).w;
    	
    	if(TransTexCoord.x<0.0f)      return ans + Specula;
    	else if(TransTexCoord.x>1.0f) return ans + Specula;
    	else if(TransTexCoord.y<0.0f) return ans + Specula;
    	else if(TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*3),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}else{
    			ans = ans*comp + ans*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTextureTexCd2Tec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 BShadowTextureTexCd2Tec_VS();
    		PixelShader  = compile ps_2_0 BShadowTextureTexCd2Tec_PS();
    	}
    }
    
    ///////////// 分散光ありテクスチャなしバッファシャドウテクニック ////////////////
    
    struct DiffuseBufferShadow_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float3 N		: TEXCOORD1;	// 法線
    	float3 Eye		: TEXCOORD2;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBufferShadow_OUTPUT DiffuseBufferShadow_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	DiffuseBufferShadow_OUTPUT Out = (DiffuseBufferShadow_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = EgColor + max(0,DifColor * dot(normalize(Out.N),L ));
    	Out.Color.a = EgColor.a;
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBufferShadow_PS(float4 ZCalcTex : TEXCOORD0,float3 N : TEXCOORD1,float3 Eye : TEXCOORD2,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	if(TransTexCoord.x<0.0f)      return Color + Specula;
    	else if(TransTexCoord.x>1.0f) return Color + Specula;
    	else if(TransTexCoord.y<0.0f) return Color + Specula;
    	else if(TransTexCoord.y>1.0f) return Color + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return Color + Specula;
    		}else{
    			return (Color + Specula)*comp + EgColor*(1-comp);
    		}
    	}
    }
    
    technique DiffuseBufferShadowTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 DiffuseBufferShadow_VS();
    		PixelShader  = compile ps_2_0 DiffuseBufferShadow_PS();
    	}
    }
    
    
    ///////////// 分散光ありテクスチャありバッファシャドウテクニック ////////////////
    
    struct DiffuseBSTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ
    	float3 N		: TEXCOORD2;	// 法線
    	float3 Eye		: TEXCOORD3;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBSTexture_OUTPUT DiffuseBSTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	DiffuseBSTexture_OUTPUT Out = (DiffuseBSTexture_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = EgColor + max(0,DifColor * dot(normalize(Out.N),L ));
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	if(TransTexCoord.x<0.0f)      return Color * tex2D(s1,Tex) + Specula;
    	else if(TransTexCoord.x>1.0f) return Color * tex2D(s1,Tex) + Specula;
    	else if(TransTexCoord.y<0.0f) return Color * tex2D(s1,Tex) + Specula;
    	else if(TransTexCoord.y>1.0f) return Color * tex2D(s1,Tex) + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return Color * tex2D(s1,Tex) + Specula;
    		}else{
    			return (Color * tex2D(s1,Tex) + Specula)*comp + EgColor*tex2D(s1,Tex)*(1-comp);
    		}
    	}
    }
    
    technique DiffuseBSTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 DiffuseBSTexture_VS();
    		PixelShader  = compile ps_2_0 DiffuseBSTexture_PS();
    	}
    }
    
    
    ///////////// 分散光ありテクスチャなしスフィアマップありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    DiffuseBSTexture_OUTPUT DiffuseBSSphia_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	DiffuseBSTexture_OUTPUT Out = (DiffuseBSTexture_OUTPUT)0;
    
    	// スフィアマップテクスチャ座標
    	Out.Tex = mul(Normal,matWRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = EgColor + max(0,DifColor * dot(normalize(Out.N),L ));
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSSphia_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	// スフィアマップ座標計算
    	float2 SpTex;
    	SpTex.x = Tex.x * 0.5f + 0.5f;
    	SpTex.y = Tex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	float4 texUV=tex2D(s1,SpTex);
    	if(spadd) ans = Color + texUV;
    	else	  ans = Color * texUV;
    
    	if(TransTexCoord.x<0.0f)      return ans + Specula;
    	else if(TransTexCoord.x>1.0f) return ans + Specula;
    	else if(TransTexCoord.y<0.0f) return ans + Specula;
    	else if(TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return ans + Specula;
    		}else{
    			if(spadd) return (ans + Specula)*comp + (EgColor+texUV)*(1-comp);
    			else	  return (ans + Specula)*comp + (EgColor*texUV)*(1-comp);
    		}
    	}
    }
    
    technique DiffuseBSSphiaTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 DiffuseBSSphia_VS();
    		PixelShader  = compile ps_2_0 DiffuseBSSphia_PS();
    	}
    }
    
    ///////////// 分散光ありテクスチャありスフィアマップありバッファシャドウテクニック ////////////////
    
    struct DiffuseBSSphiaTex_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ座標
    	float2 SpTex    : TEXCOORD2;	// スフィアマップ座標
    	float3 N		: TEXCOORD3;	// 法線
    	float3 Eye		: TEXCOORD4;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBSSphiaTex_OUTPUT DiffuseBSSphiaTex_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	DiffuseBSSphiaTex_OUTPUT Out = (DiffuseBSSphiaTex_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = mul(Normal,matWRotate);
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = EgColor + max(0,DifColor * dot(normalize(Out.N),L ));
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSSphiaTex_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	// スフィアマップ座標計算
    	SpTex.x = SpTex.x * 0.5f + 0.5f;
    	SpTex.y = SpTex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	float4 tex1UV=tex2D(s1,Tex);
    	float4 tex2UV=tex2D(s2,SpTex);
    	if(spadd) ans = Color * tex1UV + tex2UV;
    	else	  ans = Color * tex1UV * tex2UV;
    
    	if(TransTexCoord.x<0.0f)      return ans + Specula;
    	else if(TransTexCoord.x>1.0f) return ans + Specula;
    	else if(TransTexCoord.y<0.0f) return ans + Specula;
    	else if(TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return ans + Specula;
    		}else{
    			if(spadd) return (ans + Specula)*comp + (EgColor*tex1UV+tex2UV)*(1-comp);
    			else	  return (ans + Specula)*comp + (EgColor*tex1UV*tex2UV)*(1-comp);
    		}
    	}
    }
    
    technique DiffuseBSSphiaTexTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_2_0 DiffuseBSSphiaTex_VS();
    		PixelShader  = compile ps_2_0 DiffuseBSSphiaTex_PS();
    	}
    }
    


  • 118文件内容

    ///////////// メインプログラム側から引き渡される変数 /////////////////
    float4x4 matLightViewProj;	// 光方向ビュー射影変換済み行列
    float4x4 matWorldViewProj;	// ワールドビュー射影変換済み行列
    float4x4 matWorld;			// ワールド座標のみ行列
    float4x4 matRotate;			// 回転のみ行列
    float4x4 matWRotate;		//
    float4	 EgColor;			// エッジ色
    float4	 ToonColor;			// トゥーン色
    float4   LightDir;			// 光方向
    float4   SpcColor;			// スペキュラ色
    float4   Place;				// カメラの位置
    float4   DifColor;			// ディフューズ色
    float4   TexCAdd;			// テクスチャパレット加算値
    float4   TexCMul;			// テクスチャパレット乗算値
    float4   SphCAdd;			// スフィアテクスチャパレット値加算値
    float4   SphCMul;			// スフィアテクスチャパレット値乗算値
    float4   MatDifColor;
    float4   MatAmbColor;
    float4   MatEmsColor;
    float4   MatSpcColor;
    bool	 parthf;			// パースペクティブフラグ
    bool	 spadd;				// スフィアマップ加算合成フラグ
    bool	 transp;			// 半透明フラグ
    
    
    ///////////// 定数 ////////////////
    #define SKII1	1500
    #define	SKII2	8000
    #define	Toon	3
    
    ///////////// 単色塗り潰しテクニック ////////////////
    
    // 頂点シェーダ
    float4 ColorRender_VS(float4 Pos : POSITION) : POSITION
    {
    	return mul( Pos, matWorldViewProj );
    }
    
    // ピクセルシェーダ
    float4 ColorRender_PS() : COLOR
    {
    	// EgColor色で塗り潰し
    	return float4(EgColor.r,EgColor.g,EgColor.b,EgColor.a);
    }
    
    technique ColorRenderTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    
    		VertexShader = compile vs_3_0 ColorRender_VS();
    		PixelShader  = compile ps_3_0 ColorRender_PS();
    	}
    }
    
    
    ///////////// Zバッファプロットテクニック ////////////////
    
    struct VS_ZValuePlot_OUTPUT
    {
    	float4 Pos : POSITION;				// 射影変換座標
    	float4 ShadowMapTex : TEXCOORD0;	// Zバッファテクスチャ
    };
    
    // 頂点シェーダ
    VS_ZValuePlot_OUTPUT ZValuePlot_VS( float4 Pos : POSITION )
    {
    	VS_ZValuePlot_OUTPUT Out = (VS_ZValuePlot_OUTPUT)0;
    
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標を頂点に合わせる
    	Out.ShadowMapTex = Out.Pos;
    
    	return Out;
    }
    
    
    // ピクセルシェーダ
    float4 ZValuePlot_PS( float4 ShadowMapTex : TEXCOORD0 ) : COLOR
    {
    	return float4(ShadowMapTex.z/ShadowMapTex.w,0,0,1);
    }
    
    technique ZValuePlotTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		AlphaBlendEnable = FALSE;
    	
    		VertexShader = compile vs_3_0 ZValuePlot_VS();
    		PixelShader  = compile ps_3_0 ZValuePlot_PS();
    	}
    }
    
    ///////////// 分散光なしテクスチャなしバッファシャドウテクニック ////////////////
    
    sampler DefSampler = sampler_state	// サンプラーステート
    {
    	AddressU  = Clamp;
    	AddressV  = Clamp;
    	AddressW  = Clamp;
    	MINFILTER = LINEAR;
    	MAGFILTER = LINEAR;
    	MIPFILTER = NONE;
    };
    
    struct BufferShadow_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float3 N		: TEXCOORD1;	// 法線
    	float3 Eye		: TEXCOORD2;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BufferShadow_OUTPUT BufferShadow_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	BufferShadow_OUTPUT Out = (BufferShadow_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    	
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BufferShadow_PS(float4 ZCalcTex : TEXCOORD0,float3 N : TEXCOORD1,float3 Eye : TEXCOORD2) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return EgColor + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z-tex2D(DefSampler,TransTexCoord).r , 0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z-tex2D(DefSampler,TransTexCoord).r , 0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor + Specula;
    			if(transp) ans.a = 0.5f;
    			return ans;
    		}else{
    			float4 ans = EgColor*comp + EgColor*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.a = EgColor.a;
    			return ans;			
    		}
    	}
    }
    
    technique BufferShadowTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BufferShadow_VS();
    		PixelShader  = compile ps_3_0 BufferShadow_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャありバッファシャドウテクニック ////////////////
    
    sampler s1 : register(s1);      //オブジェクトのテクスチャー
    
    struct BShadowTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ
    	float3 N		: TEXCOORD2;	// 法線
    	float3 Eye		: TEXCOORD3;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       float alpha = TexCMul.w + TexCAdd.w;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * TexCMul + TexCAdd) * alpha + (1-alpha)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor*((tex2D(s1,Tex) * TexCMul + TexCAdd) * alpha + (1-alpha)) + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}else{
    			float4 tmpColor=EgColor*((tex2D(s1,Tex) * TexCMul + TexCAdd) * alpha + (1-alpha));
    			float4 ans = tmpColor*(comp+ToonColor*(1-comp)) + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BShadowTexture_VS();
    		PixelShader  = compile ps_3_0 BShadowTexture_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャなしスフィアありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowSphia_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// スフィアマップテクスチャ座標
    	Out.Tex = mul(Normal, matRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowSphia_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    	
    	// スフィアマップ座標計算
    	Tex.x = Tex.x * 0.5f + 0.5f;
    	Tex.y = Tex.y * -0.5f + 0.5f;
    	float alpha = SphCMul.w + SphCAdd.w;
    
    	float4 ans;
    	if(spadd) ans = EgColor + (tex2D(s1,Tex) * SphCMul + SphCAdd) * alpha;
    	else	  ans = EgColor * ((tex2D(s1,Tex) * SphCMul + SphCAdd)*alpha + (1-alpha));
    	ans.w = EgColor.w * tex2D(s1,Tex).w;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}else{
    			ans = ans*comp + ans*ToonColor*(1-comp) + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowSphiaTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BShadowSphia_VS();
    		PixelShader  = compile ps_3_0 BShadowSphia_PS();
    	}
    }
    
    
    ///////////// 分散光なしテクスチャありスフィアマップありバッファシャドウテクニック ////////////////
    
    sampler s2 : register(s2);      //オブジェクトのテクスチャー
    
    struct BShadowSphiaTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ座標
    	float2 SpTex	: TEXCOORD2;	// スフィアマップテクスチャ座標
    	float3 N		: TEXCOORD3;	// 法線
    	float3 Eye		: TEXCOORD4;	// カメラとの相対位置
    };
    
    // 頂点シェーダ
    BShadowSphiaTexture_OUTPUT BShadowSphiaTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	BShadowSphiaTexture_OUTPUT Out = (BShadowSphiaTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = mul(Normal, matRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowSphiaTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    	float texalp = TexCMul.w + TexCAdd.w;
       
      	// スフィアマップ座標計算
    	SpTex.x = SpTex.x * 0.5f + 0.5f;
    	SpTex.y = SpTex.y * -0.5f + 0.5f;
    	float sphalp = SphCMul.w + SphCAdd.w;
    
    	float4 ans;
    	float4 texColor = (tex2D(s1,Tex) * TexCMul + TexCAdd)* texalp + (1-texalp);
    	if(spadd) ans = EgColor * texColor + (tex2D(s2,SpTex) * SphCMul + SphCAdd) * sphalp;
    	else	  ans = EgColor * texColor * ((tex2D(s2,SpTex) * SphCMul + SphCAdd) * sphalp + (1-sphalp));
    	ans.w = EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    	
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f)  return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    			return ans;
    		}else{
    			ans = ans*(comp+ToonColor*(1-comp)) + Specula*comp;
    			if(transp) ans.w = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowSphiaTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BShadowSphiaTexture_VS();
    		PixelShader  = compile ps_3_0 BShadowSphiaTexture_PS();
    	}
    }
    
    ///////////// 分散光なしテクスチャなしテクスチャコード2ありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowTexture_OUTPUT BShadowTexCd2_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD1)
    {
    	BShadowTexture_OUTPUT Out = (BShadowTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTexCd2_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
       float alpha = SphCMul.w + SphCAdd.w;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f){
    		float4 ans = EgColor * ((tex2D(s1,Tex) * SphCMul + SphCAdd)*alpha + (1-alpha)) + Specula;
    		ans.w = EgColor.w * tex2D(s1,Tex).w;
    		return ans;
    	}else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			float4 ans = EgColor*((tex2D(s1,Tex) * SphCMul + SphCAdd)*alpha + (1-alpha)) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}else{
    			float4 tmpColor=EgColor*((tex2D(s1,Tex) * SphCMul + SphCAdd)*alpha + (1-alpha));
    			float4 ans = tmpColor*(comp+ToonColor*(1-comp)) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   ans.w = EgColor.w * tex2D(s1,Tex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTexCd2Tec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BShadowTexCd2_VS();
    		PixelShader  = compile ps_3_0 BShadowTexCd2_PS();
    	}
    }
    
    ///////////// 分散光なしテクスチャありテクスチャコード2ありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    BShadowSphiaTexture_OUTPUT BShadowTextureTexCd2Tec_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0, float2 Tex2 : TEXCOORD1 )
    {
    	BShadowSphiaTexture_OUTPUT Out = (BShadowSphiaTexture_OUTPUT)0;
    	
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = Tex2;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = Normal.xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - Pos.xyz;
    	
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 BShadowTextureTexCd2Tec_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    	float texalp = TexCMul.w + TexCAdd.w;
    	float sphalp = SphCMul.w + SphCAdd.w;
       
    	float4 ans;
    	float4 texColor = (tex2D(s1,Tex) * TexCMul + TexCAdd)*texalp + ( 1-texalp);
    	if(spadd) ans = EgColor * texColor + (tex2D(s2,SpTex) * SphCMul + SphCAdd) * sphalp;
    	else	  ans = EgColor * texColor * ((tex2D(s2,SpTex) * SphCMul + SphCAdd)*sphalp + (1-sphalp));
    	ans.w = EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    	
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		comp = min(saturate(dot(normalize(N),-LightDir)*Toon),comp);	// 分散光
    		if(comp==1.0f){
    			ans = ans + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    			return ans;
    		}else{
    			ans = ans*(comp+ToonColor*(1-comp)) + Specula*comp;
    			if(transp) ans.a = 0.5f;
    			else	   EgColor.w * tex2D(s1,Tex).w * tex2D(s2,SpTex).w;
    			return ans;
    		}
    	}
    }
    
    technique BShadowTextureTexCd2Tec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    		VertexShader = compile vs_3_0 BShadowTextureTexCd2Tec_VS();
    		PixelShader  = compile ps_3_0 BShadowTextureTexCd2Tec_PS();
    	}
    }
    
    
    ///////////// 分散光ありテクスチャなしバッファシャドウテクニック ////////////////
    
    struct DiffuseBufferShadow_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float3 N		: TEXCOORD1;	// 法線
    	float3 Eye		: TEXCOORD2;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBufferShadow_OUTPUT DiffuseBufferShadow_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	DiffuseBufferShadow_OUTPUT Out = (DiffuseBufferShadow_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = saturate(EgColor + max(0,DifColor * dot(normalize(Out.N),L )));
    	Out.Color.a = EgColor.a;
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBufferShadow_PS(float4 ZCalcTex : TEXCOORD0,float3 N : TEXCOORD1,float3 Eye : TEXCOORD2,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    	
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return Color + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return Color + Specula;
    		}else{
    			float4 ans = (Color + Specula)*comp + EgColor*(1-comp);
    			ans.a = Color.a;
    			return ans;
    		}
    	}
    }
    
    technique DiffuseBufferShadowTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    	
    		VertexShader = compile vs_3_0 DiffuseBufferShadow_VS();
    		PixelShader  = compile ps_3_0 DiffuseBufferShadow_PS();
    	}
    }
    
    
    ///////////// 分散光ありテクスチャありバッファシャドウテクニック ////////////////
    
    struct DiffuseBSTexture_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ
    	float3 N		: TEXCOORD2;	// 法線
    	float3 Eye		: TEXCOORD3;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBSTexture_OUTPUT DiffuseBSTexture_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	DiffuseBSTexture_OUTPUT Out = (DiffuseBSTexture_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = saturate(EgColor + max(0,DifColor * dot(normalize(Out.N),L )));
    	Out.Color.a = EgColor.a;
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSTexture_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return Color * tex2D(s1,Tex) + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return Color * tex2D(s1,Tex) + Specula;
    		}else{
    			return (Color * tex2D(s1,Tex) + Specula)*comp + EgColor*tex2D(s1,Tex)*(1-comp);
    		}
    	}
    }
    
    technique DiffuseBSTextureTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    	
    		VertexShader = compile vs_3_0 DiffuseBSTexture_VS();
    		PixelShader  = compile ps_3_0 DiffuseBSTexture_PS();
    	}
    }
    
    
    ///////////// 分散光ありテクスチャなしスフィアマップありバッファシャドウテクニック ////////////////
    
    // 頂点シェーダ
    DiffuseBSTexture_OUTPUT DiffuseBSSphia_VS(float4 Pos : POSITION, float4 Normal : NORMAL)
    {
    	DiffuseBSTexture_OUTPUT Out = (DiffuseBSTexture_OUTPUT)0;
    
    	// スフィアマップテクスチャ座標
    	Out.Tex = mul(Normal,matWRotate);
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = saturate(EgColor + max(0,DifColor * dot(normalize(Out.N),L )));
    	Out.Color.a = EgColor.a;
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSSphia_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float3 N : TEXCOORD2,float3 Eye : TEXCOORD3,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
    	// テクスチャ座標に変換
    	ZCalcTex /= ZCalcTex.w;
    	float2 TransTexCoord;
    	TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
    	TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	// スフィアマップ座標計算
    	float2 SpTex;
    	SpTex.x = Tex.x * 0.5f + 0.5f;
    	SpTex.y = Tex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	float4 texUV=tex2D(s1,SpTex);
    	if(spadd) ans = Color + texUV;
    	else	  ans = Color * texUV;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return ans + Specula;
    		}else{
    			if(spadd){
    				ans = (ans + Specula)*comp + (EgColor+texUV)*(1-comp);
    				ans.a = EgColor.a;
    				return ans;
    			}else{
    				ans = (ans + Specula)*comp + (EgColor*texUV)*(1-comp);
    				ans.a = EgColor.a;
    				return ans;
    			}
    		}
    	}
    }
    
    technique DiffuseBSSphiaTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    	
    		VertexShader = compile vs_3_0 DiffuseBSSphia_VS();
    		PixelShader  = compile ps_3_0 DiffuseBSSphia_PS();
    	}
    }
    
    ///////////// 分散光ありテクスチャありスフィアマップありバッファシャドウテクニック ////////////////
    
    struct DiffuseBSSphiaTex_OUTPUT
    {
    	float4 Pos      : POSITION;		// 射影変換座標
    	float4 ZCalcTex : TEXCOORD0;	// Z値
    	float2 Tex      : TEXCOORD1;	// テクスチャ座標
    	float2 SpTex    : TEXCOORD2;	// スフィアマップ座標
    	float3 N		: TEXCOORD3;	// 法線
    	float3 Eye		: TEXCOORD4;	// カメラとの相対位置
    	float4 Color	: COLOR0;		// Diffuse色
    };
    
    // 頂点シェーダ
    DiffuseBSSphiaTex_OUTPUT DiffuseBSSphiaTex_VS(float4 Pos : POSITION, float4 Normal : NORMAL, float2 Tex : TEXCOORD0 )
    {
    	DiffuseBSSphiaTex_OUTPUT Out = (DiffuseBSSphiaTex_OUTPUT)0;
    
    	// 普通にカメラの目線によるワールドビュー射影変換をする
    	Out.Pos = mul( Pos, matWorldViewProj );
       
    	// ライトの目線によるワールドビュー射影変換をする
    	Out.ZCalcTex = mul( Pos, matLightViewProj );
    
    	// テクスチャ座標
    	Out.Tex = Tex;
    
    	// スフィアマップテクスチャ座標
    	Out.SpTex = mul(Normal,matWRotate);
    
    	// 法線
    	Out.N = mul(Normal,matWorld).xyz;
    
    	// カメラ相対位置
    	Out.Eye = Place - mul(Pos,matWorld).xyz;
    	
    	// Diffuse色
    	float3 L = -LightDir.xyz;
    	Out.Color = saturate(EgColor + max(0,DifColor * dot(normalize(Out.N),L )));
    	Out.Color.a = EgColor.a;
    
    	return Out;
    }
    
    // ピクセルシェーダ
    float4 DiffuseBSSphiaTex_PS(float4 ZCalcTex : TEXCOORD0,float2 Tex : TEXCOORD1,float2 SpTex : TEXCOORD2,float3 N : TEXCOORD3,float3 Eye : TEXCOORD4,float4 Color : COLOR0) : COLOR
    {
    	// スペキュラ色計算
    	float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    	Specula *= SpcColor;
    	Specula.w = 0.0f;
    	Specula = saturate(Specula);
    
       // テクスチャ座標に変換
       ZCalcTex /= ZCalcTex.w;
       float2 TransTexCoord;
       TransTexCoord.x = (1.0f + ZCalcTex.x)*0.5f;
       TransTexCoord.y = (1.0f - ZCalcTex.y)*0.5f;
    
    	// スフィアマップ座標計算
    	SpTex.x = SpTex.x * 0.5f + 0.5f;
    	SpTex.y = SpTex.y * -0.5f + 0.5f;
    
    	float4 ans;
    	float4 tex1UV=tex2D(s1,Tex);
    	float4 tex2UV=tex2D(s2,SpTex);
    	if(spadd) ans = Color * tex1UV + tex2UV;
    	else	  ans = Color * tex1UV * tex2UV;
    	float answ = Color.a * tex1UV.a;
    
    	if(TransTexCoord.x<0.0f || TransTexCoord.x>1.0f || TransTexCoord.y<0.0f || TransTexCoord.y>1.0f) return ans + Specula;
    	else{
    		float comp;
    		if(parthf) comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII2*TransTexCoord.y-0.3f);
    		else	   comp=1-saturate(max(ZCalcTex.z - tex2D(DefSampler,TransTexCoord).r,0.0f)*SKII1-0.3f);
    		if(comp==1.0f){
    			return ans + Specula;
    		}else{
    			if(spadd){
    				ans = (ans + Specula)*comp + (EgColor*tex1UV+tex2UV)*(1-comp);
    				ans.a = answ;
    				return ans;
    			}else{
    				ans = (ans + Specula)*comp + (EgColor*tex1UV*tex2UV)*(1-comp);
    				ans.a = answ;
    				return ans;
    			}
    		}
    	}
    }
    
    technique DiffuseBSSphiaTexTec
    {
    	pass P0
    	{
    		ColorOp[0]   = Disable;
    		AlphaOp[0]   = Disable;
    	
    		VertexShader = compile vs_3_0 DiffuseBSSphiaTex_VS();
    		PixelShader  = compile ps_3_0 DiffuseBSSphiaTex_PS();
    	}
    }
    


  • 如果你们在解压着色器文件后打开发现有乱码的现象,那么可能是选择编码方式有误导致的,需要换另外一个编码方式(推荐Shift_JIS、CP943等含有JIS相关的字眼)载入。这样就可以显示一些日文的内容了。



  • 117文件和118文件的差别

    通过调用bcompare或者是Qt自带的diff工具我们可以发现,117文件和118文件最主要的区别是着色器technique所带的顶点着色器和片断着色器的版本差别。
    此外可能有一些针对不同版本着色器的着色器代码修正以及注释的变化。
    0_1518589179675_2018-02-14-141931_1366x748_scrot.png



  • 首先我们来分析一下117文件的内容。读懂了117文件的内容后,118文件的内容也就好理解了。
    无论是117和118文件,都描述了多个technique,它表示了一种渲染技术,它包含了顶点着色器和片断着色器。在117文件中,定义了以下几种渲染技术:

    1. ColorRenderTec(单色渲染)
    2. ZValuePlotTec(深度值绘制渲染)
    3. BufferShadowTec(包含了阴影缓冲区渲染)
    4. BShadowTextureTec(包含了阴影缓冲区带纹理的渲染)
    5. BShadowSphiaTec(包含了阴影缓冲区带球状纹理渲染)
    6. BShadowSphiaTextureTec(包含了阴影缓冲区带球状纹理和纹理渲染)
    7. BShadowTexCd2Tec(包含了阴影缓冲区带纹理code2渲染)
    8. BShadowTextureTexCd2Tec(包含了阴影缓冲区带纹理code2带纹理渲染)
    9. DiffuseBufferShadowTec(包含了阴影缓冲区漫反射渲染)
    10. DiffuseBSTextureTec(包含了阴影缓冲区带纹理漫反射渲染)
    11. DiffuseBSSphiaTec(包含了阴影缓冲区带球状纹理漫反射渲染)
    12. DiffuseBSSphiaTexTec(包含了阴影缓冲区带球状纹理带纹理漫反射渲染)

Log in to reply
 

走马观花

最近的回复

  • C

    Qt for MCU需要商业授权的

    read more
  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more

关注我们

微博
QQ群