シェーダーを使う場合はフォグパラメータの設定もシェーダーで行う必要があります
サンプルプログラムコーナーの
「8.オリジナルシェーダーを使用した3Dモデルの描画基本」にシェーダーでフォグを適用する
サンプルプログラムを追加しましたのでよろしければご覧ください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DModelShaderBase.html#R1N3
光学迷彩風モデル描画のサンプルにある頂点シェーダーコードはスキニングメッシュ
( 複数のフレームの影響を受ける頂点があるモデル )用の頂点シェーダーコードですので、
剛体メッシュ( 複数のフレームの影響を受ける頂点が無いモデル )の場合は頂点シェーダーの
コードが以下のようになります
-------------------------------------------------------------------------
// 頂点シェーダーの入力
struct VS_INPUT
{
float4 Position : POSITION ; // 座標( ローカル空間 )
float3 Normal : NORMAL0 ; // 法線( ローカル空間 )
float4 Diffuse : COLOR0 ; // ディフューズカラー
float4 Specular : COLOR1 ; // スペキュラカラー
float4 TexCoords0 : TEXCOORD0 ; // テクスチャ座標
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float4 Position : POSITION ; // 座標( 射影空間 )
float4 PPosition : TEXCOORD0 ; // 座標( 射影空間 )
float3 VNormal : TEXCOORD1 ; // 法線( ビュー空間 )
} ;
// C++ 側で設定する定数の定義
float4 cfProjectionMatrix[ 4 ] : register( c2 ) ; // ビュー → 射影行列
float4 cfViewMatrix[ 3 ] : register( c6 ) ; // ワールド → ビュー行列
float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ; // ローカル → ワールド行列
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lWorldPosition ;
float4 lViewPosition ;
float3 lWorldNrm ;
float3 lViewNrm ;
// 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
// ローカル座標をワールド座標に変換
lWorldPosition.x = dot( VSInput.Position, cfLocalWorldMatrix[ 0 ] ) ;
lWorldPosition.y = dot( VSInput.Position, cfLocalWorldMatrix[ 1 ] ) ;
lWorldPosition.z = dot( VSInput.Position, cfLocalWorldMatrix[ 2 ] ) ;
lWorldPosition.w = 1.0f ;
// ワールド座標をビュー座標に変換
lViewPosition.x = dot( lWorldPosition, cfViewMatrix[ 0 ] ) ;
lViewPosition.y = dot( lWorldPosition, cfViewMatrix[ 1 ] ) ;
lViewPosition.z = dot( lWorldPosition, cfViewMatrix[ 2 ] ) ;
lViewPosition.w = 1.0f ;
// ビュー座標を射影座標に変換
VSOutput.Position.x = dot( lViewPosition, cfProjectionMatrix[ 0 ] ) ;
VSOutput.Position.y = dot( lViewPosition, cfProjectionMatrix[ 1 ] ) ;
VSOutput.Position.z = dot( lViewPosition, cfProjectionMatrix[ 2 ] ) ;
VSOutput.Position.w = dot( lViewPosition, cfProjectionMatrix[ 3 ] ) ;
// 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 法線をビュー空間の角度に変換 =========================================( 開始 )
// ローカルベクトルをワールドベクトルに変換
lWorldNrm.x = dot( VSInput.Normal, cfLocalWorldMatrix[ 0 ].xyz ) ;
lWorldNrm.y = dot( VSInput.Normal, cfLocalWorldMatrix[ 1 ].xyz ) ;
lWorldNrm.z = dot( VSInput.Normal, cfLocalWorldMatrix[ 2 ].xyz ) ;
// ワールドベクトルをビューベクトルに変換
lViewNrm.x = dot( lWorldNrm, cfViewMatrix[ 0 ].xyz ) ;
lViewNrm.y = dot( lWorldNrm, cfViewMatrix[ 1 ].xyz ) ;
lViewNrm.z = dot( lWorldNrm, cfViewMatrix[ 2 ].xyz ) ;
// 法線をビュー空間の角度に変換 =========================================( 終了 )
// 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 )
// 射影座標をテクスチャ座標0としても出力する
VSOutput.PPosition = VSOutput.Position ;
// ビュー法線をテクスチャ座標1として出力する
VSOutput.VNormal = lViewNrm ;
// 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 )
// 出力パラメータを返す
return VSOutput ;
}
-------------------------------------------------------------------------
「ローカル → ワールド行列」の合成行列を作ると言う工程が無くなって、
定数をそのまま使う形になります