ピクセルシェーダの編集
ピクセルシェーダでは、スクリーン上に展開されたオブジェクトの各ピクセルの色を計算します。今度はこのピクセルシェーダを改変してみます。
float4 Basic_PS( float2 Tex : TEXCOORD1, float3 Normal : TEXCOORD2, float3 Eye : TEXCOORD3 ) : COLOR0
{
float4 Color = 0;
// ディフューズ色+アンビエント色 計算
Color.rgb = saturate( max(0,dot( Normal, -LightDirection )) * DiffuseColor.rgb + AmbientColor );
Color.a = DiffuseColor.a;
// スペキュラ色計算
float3 HalfVector = normalize( normalize(Eye) + -LightDirection );
float3 Specular = pow( max(0,dot( HalfVector, normalize(Normal) )), SpecularPower ) * SpecularColor;
if ( use_texture ) {
// テクスチャ適用。テクスチャが指定されている場合のみ。
Color *= tex2D( ObjTexSampler, Tex );
}
if ( use_toon ) {
// トゥーン適用。トゥーンが指定されている場合のみ。
float LightNormal = dot( Normal, -LightDirection );
Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal * 16 + 0.5));
}
// スペキュラ適用
Color.rgb += Specular;
return Color;
}
色情報の改変
ピクセルシェーダの末尾を以下のように編集してみます。
// スペキュラ適用
Color.rgb += Specular;
Color = float4(1,0,0,1); //この行を追加
return Color;
}
結果は以下のとおり、モデル全体が赤色で塗りつぶされます。これは、出力する色情報を赤色(R=100%,G=0%,B=0%,A=100%)に固定したためです。
また、以下のように色のAlpha値だけ変更することもできます。
// スペキュラ適用
Color.rgb += Specular;
Color.a = 0.5; //この行を追加
return Color;
}
すると、以下のように モデル全体が半透明に成ります。
色情報の改変2
以下のように編集すると、出力色のRGBが反転します。
// スペキュラ適用
Color.rgb += Specular;
Color.rgb = float3(1,1,1) - Color.rgb; //この行を追加
return Color;
}
また、以下のように編集すると、色のRGBが平均化され、グレースケールになります。
// スペキュラ適用
Color.rgb += Specular;
float Gray = (Color.r + Color.g + Color.b ) / 3; //この行を追加
Color.rgb = float3(Gray, Gray, Gray); //同上
return Color;
}
ライティング改変
次に、以下のように編集してみます。
// スペキュラ適用
// Color.rgb += Specular; // この行をコメントアウト
return Color;
}
すると、以下のように反射光(スペキュラ)が失われ、光沢感がなくなります。
また、以下のようにSpecularを10倍に編集すると、当然、光沢感が強調されます。
// スペキュラ適用
Color.rgb += Specular * 10; // この行を編集
return Color;
}
ライティング改変2
次に以下のように編集してみましょう。
if ( use_toon ) {
// トゥーン適用。トゥーンが指定されている場合のみ。
float LightNormal = dot( Normal, -LightDirection );
//Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal * 16 + 0.5)); // この行をコメントアウト
Color.rgb *= lerp(MaterialToon, float3(1,1,1), saturate(LightNormal)); // この行を追加
}
すると、トゥーン処理が失われ、トゥーンシェーダではなくフォンシェーダ風になります。
最後に
今回は、エフェクトファイルの内部構成と、シェーダコードの簡単な改変について解説しました。次回はシェーダコードを解説する予定です。
参考資料
- MSDNライブラリ 『エフェクト フォーマット (Direct3D 9)』
- MSDNライブラリ 『HLSL のリファレンス』
