Applied only to the skin, not anywhere else.

////////////////////////////////////////////////////////////////////////////////////////////////
//
// AdultShader.fx v0.14 改
// データP様 作成
// full.fx v1.2(舞力介入P)をベースに改変
// N式Evo改モデルに合わせた調整の物です
//
////////////////////////////////////////////////////////////////////////////////////////////////
// パラメータ宣言

#define ShadowDarkness 0.5 // セルフシャドウの最大暗さ
#define EyeLightPower 0.1 // 視線方向での色合いの変化
#define ToonPower 1.5 // 影の暗さ
#define OverBright 1.21 // 白飛び覚悟の明るさ補正
//#define FresnelCoef .08 // フレネル項の係数
//#define FresnelFact 05 // フレネル項

// ソフトシャドウ 補正係数
#define SOFTSHADOW_DISTANCE 0.1 // ソフトシャドウを打ち切る距離(小さいほど遠い)
#define SOFTSHADOW_THRESHOLD 0.0005 // ソフトシャドウ補正値 大きいほど影が薄い

// シャドウマップサイズ
#define SHADOWMAP_WIDTH 2048
#define SHADOWMAP_HEIGHT 2048

#define ShaderVer(x) x##_3_0

// 座法変換行列
float4x4 WorldViewProjMatrix : WORLDVIEWPROJECTION;
float4x4 WorldMatrix : WORLD;
float4x4 ViewMatrix : VIEW;
float4x4 ProjMatrix : PROJECTION;
float4x4 LightWorldViewProjMatrix : WORLDVIEWPROJECTION < string Object = "Light"; >;

float3 LightDirection : DIRECTION < string Object = "Light"; >;
float3 CameraPosition : POSITION < string Object = "Camera"; >;

// マテリアル色
float4 MaterialDiffuse : DIFFUSE < string Object = "Geometry"; >;
float3 MaterialAmbient : AMBIENT < string Object = "Light"; >;
float3 MaterialEmmisive : EMISSIVE < string Object = "Geometry"; >;
float3 MaterialSpecular : SPECULAR < string Object = "Geometry"; >;
float SpecularPower : SPECULARPOWER < string Object = "Geometry"; >;
float3 MaterialToon : TOONCOLOR;
float4 EdgeColor : EDGECOLOR;
// ライト色
float3 LightDiffuse : DIFFUSE < string Object = "Light"; >;
float3 LightAmbient : AMBIENT < string Object = "Light"; >;
float3 LightSpecular : SPECULAR < string Object = "Light"; >;
static float4 DiffuseColor = MaterialDiffuse * float4(LightDiffuse, 1.0f);
static float3 AmbientColor = saturate(MaterialAmbient * LightAmbient + MaterialEmmisive);
static float3 SpecularColor = MaterialSpecular * LightSpecular;

bool parthf; // パースペクティブフラグ
bool transp; // 半透明フラグ
bool spadd; // スフィアマップ加算合成フラグ
#define SKII1 1500
#define SKII2 8000
#define Toon 3

// オブジェクトのテクスチャ
texture ObjectTexture: MATERIALTEXTURE;
sampler ObjTexSampler = sampler_state {
texture = ;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};

// スフィアマップのテクスチャ
texture ObjectSphereMap: MATERIALSPHEREMAP;
sampler ObjSphareSampler = sampler_state {
texture = ;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};

// MMD本来のsamplerを上書きしないための記述です。削除不可。
sampler MMDSamp0 : register(s0);
sampler MMDSamp1 : register(s1);
sampler MMDSamp2 : register(s2);

///////////////////////////////////////////////////////////////////////////////////////////////
// オブジェクト描画(セルフシャドウOFF)

struct VS_OUTPUT {
float4 Pos : POSITION; // 射影変換座標
float2 Tex : TEXCOORD1; // テクスチャ
float3 Normal : TEXCOORD2; // 法線
float3 Eye : TEXCOORD3; // カメラとの相対位置
float2 SpTex : TEXCOORD4; // スフィアマップテクスチャ座標
float4 Color : COLOR0; // ディフューズ色
};

// 頂点シェーダ
VS_OUTPUT Basic_VS(float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex : TEXCOORD0, uniform bool useTexture, uniform bool useSphereMap, uniform bool useToon)
{
VS_OUTPUT Out = (VS_OUTPUT)0;

// カメラ視点のワールドビュー射影変換
Out.Pos = mul(Pos,WorldViewProjMatrix);

// カメラとの相対位置
Out.Eye = CameraPosition - mul( Pos, WorldMatrix );
// 頂点法線
Out.Normal = normalize( mul( Normal, (float3x3)WorldMatrix ) );

// ディフューズ色+アンビエント色 計算
Out.Color.rgb = AmbientColor;
if ( !useToon ) {
Out.Color.rgb += max(0,dot( Out.Normal, -LightDirection )) * DiffuseColor.rgb;
}
Out.Color.a = DiffuseColor.a;
Out.Color = saturate( Out.Color );

// テクスチャ座標
Out.Tex = Tex;

if ( useSphereMap ) {
// スフィアマップテクスチャ座標
float2 NormalWV = mul( Out.Normal, (float3x3)ViewMatrix );
Out.SpTex.x = NormalWV.x * 0.5f + 0.5f;
Out.SpTex.y = NormalWV.y * -0.5f + 0.5f;
}

return Out;
}

// ピクセルシェーダ
float4 Basic_PS(VS_OUTPUT IN, uniform bool useTexture, uniform bool useSphereMap, uniform bool useToon) : COLOR0
{
float4 Color = IN.Color;
float4 ShadowColor = float4(AmbientColor, Color.a); // 影の色
if ( useTexture ) {
// テクスチャ適用
float4 TexColor = tex2D( ObjTexSampler, IN.Tex );
Color *= TexColor;
ShadowColor *= TexColor;
}
if ( useSphereMap ) {
// スフィアマップ適用
float4 TexColor = tex2D(ObjSphareSampler,IN.SpTex);
if(spadd) {
Color.rgb += TexColor.rgb;
ShadowColor.rgb += TexColor.rgb;
} else {
Color *= TexColor;
ShadowColor *= TexColor;
}
}
float comp = 1;
if(useToon){
comp = dot(IN.Normal,-LightDirection);
ShadowColor.rgb *= pow(MaterialToon,ToonPower);
}

comp = max(comp, 0);
Color = lerp(ShadowColor, Color, comp);

// スペキュラ適用
// スペキュラ色計算
float3 HalfVector = normalize( normalize(IN.Eye) + -LightDirection );
float3 Specular = pow( max(0,dot( HalfVector, normalize(IN.Normal) )), SpecularPower ) * SpecularColor;
Color.rgb += Specular;

float EN = dot(normalize(IN.Normal),normalize(IN.Eye));
float d = pow(EN,EyeLightPower);
Color.rgb *= lerp(Color, OverBright*float3(1,1,1), d);
Color=saturate(Color);

return Color;
}

// オブジェクト描画用テクニック
// 不要なものは削除可
#define BASIC_TEC(name, tex, sphere, toon) \
technique name < string MMDPass = "object"; bool UseTexture = tex; bool UseSphereMap = sphere; bool UseToon = toon; \
> { \
pass DrawObject { \
VertexShader = compile vs_2_0 Basic_VS(tex, sphere, toon); \
PixelShader = compile ps_2_0 Basic_PS(tex, sphere, toon); \
} \
}

BASIC_TEC(MainTec0, false, false, false)
BASIC_TEC(MainTec1, true, false, false)
BASIC_TEC(MainTec2, false, true, false)
BASIC_TEC(MainTec3, true, true, false)

BASIC_TEC(MainTec4, false, false, true)
BASIC_TEC(MainTec5, true, false, true)
BASIC_TEC(MainTec6, false, true, true)
BASIC_TEC(MainTec7, true, true, true)

////////////////////////////////////////////////////////////////////////////////
// MMD標準のセルフシャドウの明るさ計算
// シャドウバッファのサンプラ。"register(s0)"なのはMMDがs0を使っているから
sampler DefSampler : register(s0);
#define ShadowMapSampler DefSampler

float MMDShadowBrightness(float2 ShadowMapPos, float DepthRef){
float shadow = max(DepthRef - tex2D(ShadowMapSampler,ShadowMapPos).r, 0);
float comp = 1 - saturate(shadow*
(parthf ? SKII2*ShadowMapPos.y // セルフシャドウモード2
: SKII1 // セルフシャドウモード1
)-0.3);
return comp;
}

static const float2 sampstep = float2(1.0/SHADOWMAP_WIDTH, 1.0/SHADOWMAP_HEIGHT);

////////////////////////////////////////////////////////////////////////////////
// 小さめのソフトシャドウ
// VSM方式 9点サンプリング
// Original Code: そぼろ氏 SpotLightShadow_Object
float2 GetZBuffSampleD2(float2 pos){
float d=tex2D(ShadowMapSampler, pos).r;
return float2(d, d*d);
}

// 9点サンプリング
float2 GetZBufSample(float2 texc){
float2 Out;
float step = sampstep;

Out = GetZBuffSampleD2(texc) * 2;

Out += GetZBuffSampleD2(texc + float2(0, step));
Out += GetZBuffSampleD2(texc + float2(0, -step));
Out += GetZBuffSampleD2(texc + float2(step, 0));
Out += GetZBuffSampleD2(texc + float2(-step, 0));
Out += GetZBuffSampleD2(texc + float2(step, step)) * 0.7071; // 0.7071=sqrt(0.5) 中心からの距離
Out += GetZBuffSampleD2(texc + float2(-step, step))* 0.7071;
Out += GetZBuffSampleD2(texc + float2(step, -step))* 0.7071;
Out += GetZBuffSampleD2(texc + float2(-step, -step))* 0.7071;

Out /= 2 + 4 + 4*(0.7071);
return Out;
}

float ShadowBrightness(float2 ShadowMapPos, float DepthRef){
float comp;
if(parthf && (ShadowMapPos.y=0) ? (shadow*ShadowDarkness+1.0-ShadowDarkness) : 0;
Color = lerp(ShadowColor, Color, comp);

// スペキュラ適用
// スペキュラ色計算
float3 HalfVector = normalize( normalize(IN.Eye) + -LightDirection );
float3 Specular = pow( max(0,dot( HalfVector, normalize(IN.Normal) )), SpecularPower ) * SpecularColor;
Color.rgb += Specular*shadow;

float EN = dot(normalize(IN.Normal),normalize(IN.Eye));
float d = pow(EN,EyeLightPower);
Color.rgb *= lerp(Color, OverBright*float3(1,1,1), d);
Color=saturate(Color);

if( transp ) Color.a *= 0.5f;
return Color;
}

// オブジェクト描画用テクニック(アクセサリ用)
#define SELFSHADOW_TEC(name, tex, sphere, toon) \
technique name < string MMDPass = "object_ss"; bool UseTexture = tex; bool UseSphereMap = sphere; bool UseToon = toon; \
> { \
pass DrawObject { \
VertexShader = compile ShaderVer(vs) BufferShadow_VS(tex, sphere, toon); \
PixelShader = compile ShaderVer(ps) BufferShadow_PS(tex, sphere, toon); \
} \
}

SELFSHADOW_TEC(MainTecBS0, false, false, false)
SELFSHADOW_TEC(MainTecBS1, true, false, false)
SELFSHADOW_TEC(MainTecBS2, false, true, false)
SELFSHADOW_TEC(MainTecBS3, true, true, false)

SELFSHADOW_TEC(MainTecBS4, false, false, true )
SELFSHADOW_TEC(MainTecBS5, true, false, true )
SELFSHADOW_TEC(MainTecBS6, false, true, true )
SELFSHADOW_TEC(MainTecBS7, true, true, true )

///////////////////////////////////////////////////////////////////////////////////////////////

812