Direct3D 11ですがSetUsePixelLightingはfalseです。
そもそも3DモデルというよりDrawPolygon3DToShaderを使用しています。
以下は使用しているディレクショナルライト+フォグの法線マップシェーダーです
// 頂点シェーダーの入力
struct VS_INPUT
{
float3 Position : POSITION0 ; // 座標( ローカル空間 )
float4 SubPosition : POSITION1 ; // 補助座標
float3 Normal : NORMAL ; // 法線
float3 Tangent : TANGENT ; // 接線
float3 Binormal : BINORMAL ; // 従法線
float4 Diffuse : COLOR0 ; // ディフューズカラー
float4 Specular : COLOR1 ; // スペキュラカラー
float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標0
float2 TexCoords1 : TEXCOORD1 ; // テクスチャ座標1
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標
float3 VPosition : TEXCOORD1 ; // 座標( ビュー空間 )
float3 VTan : TEXCOORD2 ; // 接線( ビュー空間 )
float3 VBin : TEXCOORD3 ; // 従法線( ビュー空間 )
float3 VNormal : TEXCOORD4 ; // 法線( ビュー空間 )
float Fog : TEXCOORD5 ; //フォグ
float4 Diffuse : COLOR0;// ディフューズカラー
float4 Specular : COLOR1;// スペキュラカラー
float4 Position : SV_POSITION ; // 座標( プロジェクション空間 )
} ;
// マテリアルパラメータ
struct DX_D3D11_CONST_MATERIAL
{
float4 Diffuse ; // ディフューズカラー
float4 Specular ; // スペキュラカラー
float4 Ambient_Emissive ; // マテリアルエミッシブカラー + マテリアルアンビエントカラー * グローバルアンビエントカラー
float Power ; // スペキュラの強さ
float TypeParam0 ; // マテリアルタイプパラメータ0
float TypeParam1 ; // マテリアルタイプパラメータ1
float TypeParam2 ; // マテリアルタイプパラメータ2
} ;
// フォグパラメータ
struct DX_D3D11_VS_CONST_FOG
{
float LinearAdd ; // フォグ用パラメータ end / ( end - start )
float LinearDiv ; // フォグ用パラメータ -1 / ( end - start )
float Density ; // フォグ用パラメータ density
float E ; // フォグ用パラメータ 自然対数の低
float4 Color ; // カラー
} ;
// ライトパラメータ
struct DX_D3D11_CONST_LIGHT
{
int Type ; // ライトタイプ( DX_LIGHTTYPE_POINT など )
int3 Padding1 ; // パディング1
float3 Position ; // 座標( ビュー空間 )
float RangePow2 ; // 有効距離の2乗
float3 Direction ; // 方向( ビュー空間 )
float FallOff ; // スポットライト用FallOff
float3 Diffuse ; // ディフューズカラー
float SpotParam0 ; // スポットライト用パラメータ0( cos( Phi / 2.0f ) )
float3 Specular ; // スペキュラカラー
float SpotParam1 ; // スポットライト用パラメータ1( 1.0f / ( cos( Theta / 2.0f ) - cos( Phi / 2.0f ) ) )
float4 Ambient ; // アンビエントカラーとマテリアルのアンビエントカラーを乗算したもの
float Attenuation0 ; // 距離による減衰処理用パラメータ0
float Attenuation1 ; // 距離による減衰処理用パラメータ1
float Attenuation2 ; // 距離による減衰処理用パラメータ2
float Padding2 ; // パディング2
} ;
// ピクセルシェーダー・頂点シェーダー共通パラメータ
struct DX_D3D11_CONST_BUFFER_COMMON
{
DX_D3D11_CONST_LIGHT Light[ 6 ] ; // ライトパラメータ
DX_D3D11_CONST_MATERIAL Material ; // マテリアルパラメータ
DX_D3D11_VS_CONST_FOG Fog ; // フォグパラメータ
} ;
// 基本パラメータ
struct DX_D3D11_VS_CONST_BUFFER_BASE
{
float4 AntiViewportMatrix[ 4 ] ; // アンチビューポート行列
float4 ProjectionMatrix[ 4 ] ; // ビュー → プロジェクション行列
float4 ViewMatrix[ 3 ] ; // ワールド → ビュー行列
float4 LocalWorldMatrix[ 3 ] ; // ローカル → ワールド行列
float4 ToonOutLineSize ; // トゥーンの輪郭線の大きさ
float DiffuseSource ; // ディフューズカラー( 0.0f:マテリアル 1.0f:頂点 )
float SpecularSource ; // スペキュラカラー( 0.0f:マテリアル 1.0f:頂点 )
float MulSpecularColor ; // スペキュラカラー値に乗算する値( スペキュラ無効処理で使用 )
float Padding ;
} ;
// その他の行列
struct DX_D3D11_VS_CONST_BUFFER_OTHERMATRIX
{
float4 ShadowMapLightViewProjectionMatrix[ 3 ][ 4 ] ; // シャドウマップ用のライトビュー行列とライト射影行列を乗算したもの
float4 TextureMatrix[ 3 ][ 2 ] ; // テクスチャ座標操作用行列
} ;
// 頂点シェーダー・ピクセルシェーダー共通パラメータ
cbuffer cbD3D11_CONST_BUFFER_COMMON : register( b0 )
{
DX_D3D11_CONST_BUFFER_COMMON g_Common ;
} ;
// 基本パラメータ
cbuffer cbD3D11_CONST_BUFFER_VS_BASE : register( b1 )
{
DX_D3D11_VS_CONST_BUFFER_BASE g_Base ;
} ;
// その他の行列
cbuffer cbD3D11_CONST_BUFFER_VS_OTHERMATRIX : register( b2 )
{
DX_D3D11_VS_CONST_BUFFER_OTHERMATRIX g_OtherMatrix ;
} ;
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lLocalPosition ;
float4 lWorldPosition ;
float4 lViewPosition ;
float3 lWorldNrm ;
float3 lWorldTan ;
float3 lWorldBin ;
float3 lViewNrm ;
float3 lViewTan ;
float3 lViewBin ;
// 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
// ローカル座標のセット
lLocalPosition.xyz = VSInput.Position ;
lLocalPosition.w = 1.0f ;
// ローカル座標をワールド座標に変換
lWorldPosition.x = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 0 ] ) ;
lWorldPosition.y = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 1 ] ) ;
lWorldPosition.z = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 2 ] ) ;
lWorldPosition.w = 1.0f ;
// ワールド座標をビュー座標に変換
lViewPosition.x = dot( lWorldPosition, g_Base.ViewMatrix[ 0 ] ) ;
lViewPosition.y = dot( lWorldPosition, g_Base.ViewMatrix[ 1 ] ) ;
lViewPosition.z = dot( lWorldPosition, g_Base.ViewMatrix[ 2 ] ) ;
lViewPosition.w = 1.0f ;
// ビュー座標を射影座標に変換
VSOutput.Position.x = dot( lViewPosition, g_Base.ProjectionMatrix[ 0 ] ) ;
VSOutput.Position.y = dot( lViewPosition, g_Base.ProjectionMatrix[ 1 ] ) ;
VSOutput.Position.z = dot( lViewPosition, g_Base.ProjectionMatrix[ 2 ] ) ;
VSOutput.Position.w = dot( lViewPosition, g_Base.ProjectionMatrix[ 3 ] ) ;
// 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 法線をビュー空間の角度に変換 =====================================================( 開始 )
// 従法線、接線、法線をビューベクトルに変換
lWorldTan.x = dot( VSInput.Tangent, g_Base.LocalWorldMatrix[ 0 ].xyz ) ;
lWorldTan.y = dot( VSInput.Tangent, g_Base.LocalWorldMatrix[ 1 ].xyz ) ;
lWorldTan.z = dot( VSInput.Tangent, g_Base.LocalWorldMatrix[ 2 ].xyz ) ;
lWorldBin.x = dot( VSInput.Binormal, g_Base.LocalWorldMatrix[ 0 ].xyz ) ;
lWorldBin.y = dot( VSInput.Binormal, g_Base.LocalWorldMatrix[ 1 ].xyz ) ;
lWorldBin.z = dot( VSInput.Binormal, g_Base.LocalWorldMatrix[ 2 ].xyz ) ;
lWorldNrm.x = dot( VSInput.Normal, g_Base.LocalWorldMatrix[ 0 ].xyz ) ;
lWorldNrm.y = dot( VSInput.Normal, g_Base.LocalWorldMatrix[ 1 ].xyz ) ;
lWorldNrm.z = dot( VSInput.Normal, g_Base.LocalWorldMatrix[ 2 ].xyz ) ;
lViewTan.x = dot( lWorldTan, g_Base.ViewMatrix[ 0 ].xyz ) ;
lViewTan.y = dot( lWorldTan, g_Base.ViewMatrix[ 1 ].xyz ) ;
lViewTan.z = dot( lWorldTan, g_Base.ViewMatrix[ 2 ].xyz ) ;
lViewBin.x = dot( lWorldBin, g_Base.ViewMatrix[ 0 ].xyz ) ;
lViewBin.y = dot( lWorldBin, g_Base.ViewMatrix[ 1 ].xyz ) ;
lViewBin.z = dot( lWorldBin, g_Base.ViewMatrix[ 2 ].xyz ) ;
lViewNrm.x = dot( lWorldNrm, g_Base.ViewMatrix[ 0 ].xyz ) ;
lViewNrm.y = dot( lWorldNrm, g_Base.ViewMatrix[ 1 ].xyz ) ;
lViewNrm.z = dot( lWorldNrm, g_Base.ViewMatrix[ 2 ].xyz ) ;
// 法線をビュー空間の角度に変換 =====================================================( 終了 )
// 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
VSOutput.TexCoords0 = VSInput.TexCoords0;
// 線形フォグ計算
VSOutput.Fog = lViewPosition.z * g_Common.Fog.LinearDiv + g_Common.Fog.LinearAdd ;
// 頂点座標を保存
VSOutput.VPosition = lViewPosition.xyz ;
// 接線を保存
VSOutput.VTan = lViewTan ;
// 従法線を保存
VSOutput.VBin = lViewBin ;
// 法線を保存
VSOutput.VNormal = lViewNrm ;
//色情報をそのまま保存
VSOutput.Diffuse=VSInput.Diffuse;
VSOutput.Specular=VSInput.Specular;
// 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 出力パラメータを返す
return VSOutput ;
}
// ピクセルシェーダーの入力
struct PS_INPUT
{
float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標
float3 VPosition : TEXCOORD1 ; // 座標( ビュー空間 )
float3 VTan : TEXCOORD2 ; // 接線( ビュー空間 )
float3 VBin : TEXCOORD3 ; // 従法線( ビュー空間 )
float3 VNormal : TEXCOORD4 ; // 法線( ビュー空間 )
float Fog : TEXCOORD5 ; // フォグパラメータ
float4 Diffuse : COLOR0;// ディフューズカラー
float4 Specular : COLOR1;// スペキュラカラー
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Color0 : SV_TARGET0 ; // 色
} ;
// マテリアルパラメータ
struct DX_D3D11_CONST_MATERIAL
{
float4 Diffuse ; // ディフューズカラー
float4 Specular ; // スペキュラカラー
float4 Ambient_Emissive ; // マテリアルエミッシブカラー + マテリアルアンビエントカラー * グローバルアンビエントカラー
float Power ; // スペキュラの強さ
float TypeParam0 ; // マテリアルタイプパラメータ0
float TypeParam1 ; // マテリアルタイプパラメータ1
float TypeParam2 ; // マテリアルタイプパラメータ2
} ;
// フォグパラメータ
struct DX_D3D11_VS_CONST_FOG
{
float LinearAdd ; // フォグ用パラメータ end / ( end - start )
float LinearDiv ; // フォグ用パラメータ -1 / ( end - start )
float Density ; // フォグ用パラメータ density
float E ; // フォグ用パラメータ 自然対数の低
float4 Color ; // カラー
} ;
// ライトパラメータ
struct DX_D3D11_CONST_LIGHT
{
int Type ; // ライトタイプ( DX_LIGHTTYPE_POINT など )
int3 Padding1 ; // パディング1
float3 Position ; // 座標( ビュー空間 )
float RangePow2 ; // 有効距離の2乗
float3 Direction ; // 方向( ビュー空間 )
float FallOff ; // スポットライト用FallOff
float3 Diffuse ; // ディフューズカラー
float SpotParam0 ; // スポットライト用パラメータ0( cos( Phi / 2.0f ) )
float3 Specular ; // スペキュラカラー
float SpotParam1 ; // スポットライト用パラメータ1( 1.0f / ( cos( Theta / 2.0f ) - cos( Phi / 2.0f ) ) )
float4 Ambient ; // アンビエントカラーとマテリアルのアンビエントカラーを乗算したもの
float Attenuation0 ; // 距離による減衰処理用パラメータ0
float Attenuation1 ; // 距離による減衰処理用パラメータ1
float Attenuation2 ; // 距離による減衰処理用パラメータ2
float Padding2 ; // パディング2
} ;
// ピクセルシェーダー・頂点シェーダー共通パラメータ
struct DX_D3D11_CONST_BUFFER_COMMON
{
DX_D3D11_CONST_LIGHT Light[ 6 ] ; // ライトパラメータ
DX_D3D11_CONST_MATERIAL Material ; // マテリアルパラメータ
DX_D3D11_VS_CONST_FOG Fog ; // フォグパラメータ
} ;
// 定数バッファピクセルシェーダー基本パラメータ
struct DX_D3D11_PS_CONST_BUFFER_BASE
{
float4 FactorColor ; // アルファ値等
float MulAlphaColor ; // カラーにアルファ値を乗算するかどうか( 0.0f:乗算しない 1.0f:乗算する )
float AlphaTestRef ; // アルファテストで使用する比較値
float2 Padding1 ;
int AlphaTestCmpMode ; // アルファテスト比較モード( DX_CMP_NEVER など )
int3 Padding2 ;
float4 IgnoreTextureColor ; // テクスチャカラー無視処理用カラー
} ;
// 頂点シェーダー・ピクセルシェーダー共通パラメータ
cbuffer cbD3D11_CONST_BUFFER_COMMON : register( b0 )
{
DX_D3D11_CONST_BUFFER_COMMON g_Common ;
DX_D3D11_VS_CONST_FOG Fog ; // フォグパラメータ
} ;
// 基本パラメータ
cbuffer cbD3D11_CONST_BUFFER_PS_BASE : register( b1 )
{
DX_D3D11_PS_CONST_BUFFER_BASE g_Base ;
} ;
SamplerState g_DiffuseMapSampler : register( s0 ) ; // ディフューズマップテクスチャ
Texture2D g_DiffuseMapTexture : register( t0 ) ; // ディフューズマップテクスチャ
SamplerState g_NormalMapSampler : register( s1 )
{
AddressU = WRAP;
AddressV = WRAP;
}; // 法線マップテクスチャ
Texture2D g_NormalMapTexture : register( t1 ) ; // 法線マップテクスチャ
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 TextureDiffuseColor ;
float3 V_to_Eye ;
float3 Normal ;
float3 VNrm ;
float3 VTan ;
float3 VBin ;
float3 TotalDiffuse ;
float3 TotalSpecular ;
float3 SpecularColor ;
float3 TempF3 ;
float Temp ;
float3 lLightTemp ;
float3 lLightDir ;
float DiffuseAngleGen ;
// 接線・従法線・法線を正規化
VNrm = normalize( PSInput.VNormal );
VTan = normalize( PSInput.VTan );
VBin = normalize( PSInput.VBin );
// 頂点座標から視点へのベクトルを接底空間に投影した後正規化して保存
TempF3.x = dot( VTan, -PSInput.VPosition.xyz ) ;
TempF3.y = dot( VBin, -PSInput.VPosition.xyz ) ;
TempF3.z = dot( VNrm, -PSInput.VPosition.xyz ) ;
V_to_Eye = normalize( TempF3 ) ;
//float2 d=0;
//float2 size=1024;
// 法線の 0~1 の値を -1.0~1.0 に変換する
//Normal = ( g_NormalMapTexture.Sample( g_NormalMapSampler, PSInput.TexCoords0.xy-d/size ).rgb - float3( 0.5f, 0.5f, 0.5f ) ) * 2.0f ;
Normal = ( g_NormalMapTexture.Sample( g_NormalMapSampler, PSInput.TexCoords0.xy).rgb - float3( 0.5f, 0.5f, 0.5f ) ) * 2.0f ;
// ディフューズカラーとスペキュラカラーの蓄積値を初期化
TotalDiffuse = float3( 0.0f, 0.0f, 0.0f ) ;
TotalSpecular = float3( 0.0f, 0.0f, 0.0f ) ;
// ディレクショナルライトの処理 +++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
// ライト方向ベクトルの計算
TempF3 = g_Common.Light[ 0 ].Direction ;
// ライトのベクトルを接地空間に変換
lLightDir.x = dot( VTan, TempF3 ) ;
lLightDir.y = dot( VBin, TempF3 ) ;
lLightDir.z = dot( VNrm, TempF3 ) ;
// ディフューズ色計算
// DiffuseAngleGen = ディフューズ角度減衰率計算
DiffuseAngleGen = saturate( dot( Normal, -lLightDir ) ) ;
// ディフューズカラー蓄積値 += ライトのディフューズカラー * マテリアルのディフューズカラー * ディフューズカラー角度減衰率 + ライトのアンビエントカラーとマテリアルのアンビエントカラーを乗算したもの
TotalDiffuse += g_Common.Light[ 0 ].Diffuse * g_Common.Material.Diffuse.xyz * DiffuseAngleGen + g_Common.Light[ 0 ].Ambient.xyz ;
// スペキュラカラー計算
// ハーフベクトルの計算
TempF3 = normalize( V_to_Eye - lLightDir ) ;
// Temp = pow( max( 0.0f, N * H ), g_Common.Material.Power )
Temp = pow( max( 0.0f, dot( Normal, TempF3 ) ), g_Common.Material.Power ) ;
// スペキュラカラー蓄積値 += Temp * ライトのスペキュラカラー
TotalSpecular += Temp * g_Common.Light[ 0 ].Specular ;
// ディレクショナルライトの処理 +++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 出力カラー計算 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
// TotalDiffuse = ライトディフューズカラー蓄積値 + ( マテリアルのアンビエントカラーとグローバルアンビエントカラーを乗算したものとマテリアルエミッシブカラーを加算したもの )
TotalDiffuse += g_Common.Material.Ambient_Emissive.xyz ;
// SpecularColor = ライトのスペキュラカラー蓄積値 * マテリアルのスペキュラカラー
SpecularColor = TotalSpecular * g_Common.Material.Specular.xyz ;
// 出力カラー = TotalDiffuse * テクスチャカラー + SpecularColor
TextureDiffuseColor = g_DiffuseMapTexture.Sample( g_DiffuseMapSampler, PSInput.TexCoords0 ) ;
PSOutput.Color0.rgb = TextureDiffuseColor.rgb * TotalDiffuse.rgb * PSInput.Diffuse.rgb+ PSInput.Specular.rgb + SpecularColor ;
// フォグ効果
PSOutput.Color0.rgb = lerp( g_Common.Fog.Color.rgb, PSOutput.Color0.rgb, saturate( PSInput.Fog ) );
// アルファ値 = テクスチャアルファ * 不透明度
PSOutput.Color0.a =TextureDiffuseColor.a *PSInput.Diffuse.a+PSInput.Specular.a;
// 出力カラー計算 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 出力パラメータを返す
return PSOutput ;
}