シェーダーモデル3.0 から シェーダーモデル5.0 に変更したところ 3Dモデルの描画が出来なくなりました。 バージョンが変わったために記述も変わったと思うのですが、参考になるプログラムなどを見つけることができませんでした。 シェーダーモデル5.0 で3Dモデルを描画するサンプルなどありませんでしょうか?
シェーダーモデル5.0で3Dモデルを描画するサンプルは今のところありません <サンプルプログラム オリジナルシェーダーを使用した3Dモデルの描画基本 ( Direct3D 9用、要シェーダーモデル2.0一部3.0 )> https://dxlib.xsrv.jp/program/dxprogram_3DModelShaderBase.html ↑こちらのページの Direct3D 11 版( シェーダーモデルは 4.0 になると思います ) をご用意すれば TAKUさんのご要望に添えますでしょうか?
こちらに <サンプルプログラム オリジナルシェーダーを使用した3Dモデルの描画基本 ( Direct3D 9用、要シェーダーモデル2.0一部3.0 )> でダウンロードできるファイルの Direct3D 11 版をご用意しました <剛体メッシュのライティング無し描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_NoLight_DX11.zip <1頂点へ影響を与えるフレームの数が1〜4個のスキニングメッシュのライティング無し描画> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_NoLight_DX11.zip <剛体メッシュのライティング無しフォグあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_NoLight_Fog_DX11.zip <固定機能パイプライン互換のディレクショナルライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_DirLight_DX11.zip <1頂点へ影響を与えるフレームの数が1〜4個のスキニングメッシュのディレクショナルライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirLight_DX11.zip <固定機能パイプライン互換のポイントライトやスポットライトや複数の組み合わせなどの描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_PointLight_DX11.zip <剛体メッシュのスポットライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_SpotLight_DX11.zip <剛体メッシュのディレクショナルライトとポイントライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_DirPointLight_DX11.zip <剛体メッシュのスポットライトとポイントライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_SpotPointLight_DX11.zip <剛体メッシュのディレクショナルライトありフォンシェーディング描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_DirLight_Phong_DX11.zip <剛体メッシュのポイントライトありフォンシェーディング描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_PointLight_Phong_DX11.zip <剛体メッシュのポイントライトありフォンシェーディング描画(ポイントライト6つ版)> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_PointLight6_Phong_DX11.zip <剛体メッシュのスポットライトありフォンシェーディング描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_SpotLight_Phong_DX11.zip <MMD互換のトゥーンレンダリング スキニングメッシュでディレクショナルライト一つ> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirLight_Toon_DX11.zip <MMD互換のトゥーンレンダリング スキニングメッシュでディレクショナルライトとスポットライトとポイントライト一つづつ> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirSpotPointLight_Toon_DX11.zip <MMD互換のトゥーンレンダリング スキニングメッシュでディレクショナルライト一つのフォンシェーディング> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirLight_Toon_Phong_DX11.zip <MMD互換のトゥーンレンダリング スキニングメッシュでディレクショナルライトとスポットライトとポイントライト一つづつのフォンシェーディング> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirSpotPointLight_Toon_Phong_DX11.zip <MMD互換のトゥーンレンダリング スキニングメッシュでディレクショナルライト一つとスフィアマップのフォンシェーディング> https://dxlib.xsrv.jp/file/OrigShaderBase/SkinMesh4_DirLight_SphereMap_Toon_Phong_DX11.zip <法線マップ付き剛体メッシュのディレクショナルライトあり描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_DirLight_NrmMap_DX11.zip <法線マップ付き剛体メッシュのディレクショナルライトとスポットライトとポイントライト一つづつ描画> https://dxlib.xsrv.jp/file/OrigShaderBase/NormalMesh_DirSpotPointLight_NrmMap_DX11.zip また、DirectX11 では定数には定数バッファを使用するようになります こちらのスレッドの No.1 に定数バッファについての説明がありますので、よろしければご覧ください <DirectX11の自作シェーダーの定数> https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4032 あと、すみません、Direct3D 11用にリファレンスやサンプルプログラムのページを整備する時間が確保できなかったので 不明な点がありましたらご質問ください m(_ _;m
ありがとうございます。 無事に3Dモデルの描画に成功しました。 これからシャドウマップやトゥーンなどに挑戦してみようと思います。 迅速な対応ありがとうございます。
一つ質問させてください。 1頂点へ影響を与えるフレームの数が5つ以上になった場合、 頂点シェーダーのウエイト計算を増やすだけで対応できたと思うのですか、 期待した描画を得ることができませんでした。 間違いがあれば指摘してもらえないでしょうか? 以下 頂点シェーダー 1頂点へ影響を与えるフレームの数が5つ以上の場合 //頂点シェーダーの入力 struct VS_INPUT{ // 座標( ローカル空間 ) float4 Position : POSITION; // 法線( ローカル空間 ) float3 Normal : NORMAL0; // ディフューズカラー float4 Diffuse : COLOR0; // スペキュラカラー float4 Specular : COLOR1; // テクスチャ座標 float4 TexCoords0 : TEXCOORD0; // サブテクスチャ座標 float4 TexCoords1 : TEXCOORD1; // スキニング処理用 Float型定数配列インデックス int4 BlendIndices0 : BLENDINDICES0; // スキニング処理用 Float型定数配列インデックス int4 BlendIndices1 : BLENDINDICES1; // スキニング処理用ウエイト値 float4 BlendWeight0 : BLENDWEIGHT0; // スキニング処理用ウエイト値 float4 BlendWeight1 : BLENDWEIGHT1; }; //頂点シェーダーの出力 struct VS_OUTPUT{ // ディフューズカラー float4 Diffuse : COLOR0; // スペキュラカラー float4 Specular : COLOR1; // テクスチャ座標 float2 TexCoords0 : TEXCOORD0; // 座標( プロジェクション空間 ) float4 Position : SV_POSITION; }; // 基本パラメータ struct DX_D3D11_VS_CONST_BUFFER_BASE{ // アンチビューポート行列 float4 AntiViewportMatrix[4]; // ビュー → プロジェクション行列 float4 ProjectionMatrix[4]; // ワールド → ビュー行列 float4 ViewMatrix[3]; // ローカル → ワールド行列 float4 LocalWorldMatrix[3]; // トゥーンの輪郭線の大きさ float4 ToonOutLineSize; // ディフューズカラー( 0.0f:マテリアル 1.0f:頂点 ) float DiffuseSource; // スペキュラカラー( 0.0f:マテリアル 1.0f:頂点 ) float SpecularSource; // スペキュラカラー値に乗算する値( スペキュラ無効処理で使用 ) float MulSpecularColor; float Padding; }; // その他の行列 struct DX_D3D11_VS_CONST_BUFFER_OTHERMATRIX{ // シャドウマップ用のライトビュー行列とライト射影行列を乗算したもの float4 ShadowMapLightViewProjectionMatrix[3][4]; // テクスチャ座標操作用行列 float4 TextureMatrix[3][2]; }; // スキニングメッシュ用の ローカル → ワールド行列 struct DX_D3D11_VS_CONST_BUFFER_LOCALWORLDMATRIX{ // ローカル → ワールド行列 float4 Matrix[54 * 3]; }; // 基本パラメータ 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; }; // スキニングメッシュ用の ローカル → ワールド行列 cbuffer cbD3D11_CONST_BUFFER_VS_LOCALWORLDMATRIX : register(b3) { DX_D3D11_VS_CONST_BUFFER_LOCALWORLDMATRIX g_LocalWorldMatrix; }; //main VS_OUTPUT main(VS_INPUT VsInput){ VS_OUTPUT VsOutput; float4 lLocalWorldMatrix[3]; float4 lWorldPosition; float4 lViewPosition; // 複数のフレームのブレンド行列の作成 lLocalWorldMatrix[0] = g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.x + 0] * VsInput.BlendWeight0.x; lLocalWorldMatrix[1] = g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.x + 1] * VsInput.BlendWeight0.x; lLocalWorldMatrix[2] = g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.x + 2] * VsInput.BlendWeight0.x; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.y + 0] * VsInput.BlendWeight0.y; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.y + 1] * VsInput.BlendWeight0.y; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.y + 2] * VsInput.BlendWeight0.y; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.z + 0] * VsInput.BlendWeight0.z; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.z + 1] * VsInput.BlendWeight0.z; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.z + 2] * VsInput.BlendWeight0.z; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.w + 0] * VsInput.BlendWeight0.w; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.w + 1] * VsInput.BlendWeight0.w; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices0.w + 2] * VsInput.BlendWeight0.w; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.x + 0] * VsInput.BlendWeight1.x; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.x + 1] * VsInput.BlendWeight1.x; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.x + 2] * VsInput.BlendWeight1.x; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.y + 0] * VsInput.BlendWeight1.y; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.y + 1] * VsInput.BlendWeight1.y; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.y + 2] * VsInput.BlendWeight1.y; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.z + 0] * VsInput.BlendWeight1.z; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.z + 1] * VsInput.BlendWeight1.z; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.z + 2] * VsInput.BlendWeight1.z; lLocalWorldMatrix[0] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.w + 0] * VsInput.BlendWeight1.w; lLocalWorldMatrix[1] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.w + 1] * VsInput.BlendWeight1.w; lLocalWorldMatrix[2] += g_LocalWorldMatrix.Matrix[VsInput.BlendIndices1.w + 2] * VsInput.BlendWeight1.w; //頂点座標変換(開始)------------ // ローカル座標をワールド座標に変換 lWorldPosition.x = dot(VsInput.Position, lLocalWorldMatrix[0]); lWorldPosition.y = dot(VsInput.Position, lLocalWorldMatrix[1]); lWorldPosition.z = dot(VsInput.Position, lLocalWorldMatrix[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]); //頂点座標変換(終了)------------ // テクスチャ座標変換行列による変換を行った結果のテクスチャ座標をセット VsOutput.TexCoords0.x = dot(VsInput.TexCoords0, g_OtherMatrix.TextureMatrix[0][0]); VsOutput.TexCoords0.y = dot(VsInput.TexCoords0, g_OtherMatrix.TextureMatrix[0][1]); //出力パラメータセット(終了)------------ //出力パラメーターを返す return VsOutput; } お願いします。
頂点シェーダーの入力のこちらの記述を // スキニング処理用 Float型定数配列インデックス int4 BlendIndices0 : BLENDINDICES0; // スキニング処理用 Float型定数配列インデックス int4 BlendIndices1 : BLENDINDICES1; // スキニング処理用ウエイト値 float4 BlendWeight0 : BLENDWEIGHT0; // スキニング処理用ウエイト値 float4 BlendWeight1 : BLENDWEIGHT1; 順番を変更してこのようにしていただければ // スキニング処理用 Float型定数配列インデックス int4 BlendIndices0 : BLENDINDICES0; // スキニング処理用ウエイト値 float4 BlendWeight0 : BLENDWEIGHT0; // スキニング処理用 Float型定数配列インデックス int4 BlendIndices1 : BLENDINDICES1; // スキニング処理用ウエイト値 float4 BlendWeight1 : BLENDWEIGHT1; 正常に動作するかもしれません ( Direct3D 11 の HLSL は Direct3D 9 の HLSL と異なり構造体の記述の順がそのままデータ構造となるので、 順番が C++ のプログラムから渡すデータと異なってしまうと正常に頂点シェーダーに頂点データが渡らない為 ) よろしければお試しください m(_ _)m
ありがとうございます! 正常な描画を得ることが出来ました。
管理人さん また質問させていただきます。 自作シェーダーを使用してモデルを描画する際に、スケーリングを2倍にすると 通常よりも明るく描画されてしまいます。 スケールを100倍にすると白すぎて元のテクスチャが全く分からなくなるほどです。 原因がわかりません。 よろしくお願いします。
自己解決しました。 ディフューズカラーの計算時に掛け合わせる角度減衰の値が1.fを超えていたために、 明るく描画されていたようです。 お騒がせして申し訳ないです。(_^_)