トップページ > 記事閲覧
DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる
名前:Comaneco 日時: 2020/11/11 12:00

毎度DXLibにはお世話になっております。 さんざん悩みましたが、個人での解決が困難と判断したため、お恥ずかしながら質問させていただきます。 今回、ttps://dxlib.xsrv.jp/program/dxprogram_3DAction_DepthShadow.html こちらのサイト様を参考にDX9のシェーダーをDX11のシェーダーに書き直していたのですが、 深度画像生成時のカメラの位置や、影の描画時のシェーダーのZ + 補正値をいじっても地面の影が二つに割れてしまい、 ある一点から手前は影無し、奥は陰ありといった具合になってしまい、手前にあるオブジェクトの関係も無視されてしまいます。 Dx11ということでモデルのテクスチャにあわせるため、本描画の頂点とピクセルシェーダーをノーマルマップ付き剛体メッシュにした以外、なるべく忠実に書いたつもりなのですがどこか間違えて使ったりしている部分があるのでしょうか?ご教授いただければ幸いです。 ソースコードは影シェーダーとなり、とても長いのでお手数ですが下記からDLして頂けると助かります。 ttps://drive.google.com/file/d/1GrPpeVg1_7IqgBeWCU-0q-c6b__f5Pjl/view?usp=sharing
メンテ

Page: 1 |

Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.1 )
名前:管理人 日時:2020/11/12 20:47

プロジェクトを拝見しました 確かに正常に動作しそうではありますね… 問題を絞り込みたいと思いますので、お手数で申し訳ありませんが ShaderPolygon3DTestPS.hlsl と ShaderPolygon3DTestVS.hlsl を 『ノーマルマップ付き剛体メッシュ』用ではなく、『剛体メッシュ』用に書き換え、 加えてフォグの処理も無くしていただけないでしょうか? m(_ _)m
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.2 )
名前:Comaneco 日時:2020/11/13 17:55

お忙しい中ご確認頂きありがとうございます。 >>『ノーマルマップ付き剛体メッシュ』用ではなく、『剛体メッシュ』用に書き換え、 加えてフォグの処理も無くしていただけないでしょうか? m(_ _)m こちらに、剛体メッシュ用に書き換えた物を用意いたしました いらない変数などの都合上ローカル変数の名前が若干変更などされていますが、 処理の内容自体は1で上げたものと同じのはずです。 ttps://drive.google.com/file/d/1-U959whFrbP2Q0hubHy4hCAKIF21fnrY/view?usp=sharing 後すみません、シェーダーのDX_D3D11_VS_CONST_BUFFER_OTHERMATRIX に入っているこちらの変数はどういった場合にどの様に使うのでしょうか? float4 shadowMapLightViewProjectionMatrix[3][4]; 説明にシャドウマップ用のライトビュー行列とライト射影行列を乗算したものと 書かれていたので、もしやこちらでわざわざcbufferを定義せずにできるのでは? と思ったのですがそうすると、ViewのMATRIXのみを取得できなかったり、イマイチ 使用方法が分からなかったので…
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.3 )
名前:管理人 日時:2020/11/15 02:26

> こちらに、剛体メッシュ用に書き換えた物を用意いたしました ありがとうございます > 後すみません、シェーダーのDX_D3D11_VS_CONST_BUFFER_OTHERMATRIX > に入っているこちらの変数はどういった場合にどの様に使うのでしょうか? > float4 shadowMapLightViewProjectionMatrix[3][4]; こちらはDXライブラリ内部で MakeShadowMap や SetUseShadowMap 関係の処理で使用している変数です 『3Dアクション基本+深度値を利用した影表現基本』のサンプルとは異なる影の処理を行っています 新しくアップしていただいたファイルを拝見していて気づいたのですが、 使用されている定数バッファの番号が 3 となっていますが、こちらは 4 にする必要があります( DXライブラリが 0 〜 3 を使用しているので ) ただ、すみません、アップしていただいたプログラムを実行したときに、 どのような見た目になっていれば『正しい描画結果』なのかが分からなかったので、 使用する定数バッファの番号を 4 にして直ったのかは判断ができませんでした orz なので、すみませんが使用する定数バッファを 4 に変更してみてください あと、 <サンプルプログラム 3Dアクション基本+深度値を利用した影表現基本 ( Direct3D 9用、要シェーダーモデル2.0 )> https://dxlib.xsrv.jp/program/dxprogram_3DAction_DepthShadow.html ↑こちらのサンプルのコードを Direct3D 11用に変更したものをアップしましたので、 よろしければご覧ください m(_ _)m https://dxlib.xsrv.jp/temp/3DAction_DepthShadow_D3D11.zip
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.4 )
名前:Comaneco 日時:2020/11/15 11:19

>> どのような見た目になっていれば『正しい描画結果』なのかが分からなかったので、 >> 使用する定数バッファの番号を 4 にして直ったのかは判断ができませんでした orz 私が期待していた結果としては、影が陰陽として二つに割れておらず、かつ、 カメラの中心にいる球体の付近の地面に影が描画されているというものでした。 (マップが倍率をかけており、とても大きいので、ある程度から先は影とそうでない部分として割れていてもいいですが、 初期位置から見たカメラ内には割れているのが見えないといった具合です) しかし、現在のシェーダーではそこまで中心点から離れていない(そもそも球体は0地点)にも関わらず、 はるかマイナス方向から影とそうでない部分が割れてしまっているという状況です。 >> なので、すみませんが使用する定数バッファを 4 に変更してみてください やってみましたが、結果は変わりませんでした… >> こちらのサンプルのコードを Direct3D 11用に変更したものをアップしましたので、 >> よろしければご覧ください m(_ _)m サンプルの方ありがとうございます。 一応こちらでサンプルの方のシェーダーと入れ替えてみたのですが、 結果は自分で作ったシェーダーと同じという結果でした… もしかしたらC++側に問題があるのかもしれません… 長くなって申し訳ないのですが、DX11のシェーダーではVS_INPUTの値がモデルのスキニング情報や、法線マップ付きによって それぞれ固定されていたと思うのですが、 サンプルの方だとそれを無視しているように見えます。こちらは何か特別な処理が加えられているのでしょうか?
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.5 )
名前:Comaneco 日時:2020/11/15 11:24

>> サンプルの方だとそれを無視しているように見えます。こちらは何か特別な処理が加えられているのでしょうか? すみません補足です。こちらのシェーダーの部分のVS_INPUTです。それ以外ではそれぞれに合った情報になってました。 NormalMesh_DepthShadow_Step1VS.hlsl
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.6 )
名前:管理人 日時:2020/11/15 21:21

> 私が期待していた結果としては、影が陰陽として二つに割れておらず、かつ、 > カメラの中心にいる球体の付近の地面に影が描画されているというものでした。 すみません、私の環境でアップしていただいたプロジェクトを実行するとこちらのような 描画結果となるのですが https://dxlib.xsrv.jp/temp/ShadowScreenShot.JPG 『影が陰陽として二つに割れている』という状況はどのあたりで確認できますでしょうか? > 長くなって申し訳ないのですが、DX11のシェーダーではVS_INPUTの値がモデルのスキニング情報や、法線マップ付きによって > それぞれ固定されていたと思うのですが、 > サンプルの方だとそれを無視しているように見えます。こちらは何か特別な処理が加えられているのでしょうか? > すみません補足です。こちらのシェーダーの部分のVS_INPUTです。それ以外ではそれぞれに合った情報になってました。 > NormalMesh_DepthShadow_Step1VS.hlsl いえ、サンプルは特に特別な処理は加えられていません すみません、NormalMesh_DepthShadow_Step1VS.hlsl の VS_INPUT にある int4 BlendIndices0 : BLENDINDICES0 ; // スキニング処理用 Float型定数配列インデックス float4 BlendWeight0 : BLENDWEIGHT0 ; // スキニング処理用ウエイト値 こちらは本来あったら正常に動作しない所ですが、たまたま上記の変数が VS_INPUT の最後尾に位置していて、 且つコード中では使用されていなかったから正常に動作したようです… 一応上記の記述を削除したものをアップしなおしました https://dxlib.xsrv.jp/temp/3DAction_DepthShadow_D3D11.zip
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.7 )
名前:Comaneco 日時:2020/11/16 00:58

>> 『影が陰陽として二つに割れている』という状況はどのあたりで確認できますでしょうか? 一応左右キー入力でカメラが回転でき、丁度180度ほど回転して頂ければ空間の奥の方に 影でない部分が見え、割れているところが確認できると思います。 すみません…確認できる初期位置で出せば良かったですね…
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.8 )
名前:管理人 日時:2020/11/16 23:39

> 一応左右キー入力でカメラが回転でき、丁度180度ほど回転して頂ければ空間の奥の方に > 影でない部分が見え、割れているところが確認できると思います。 ご返答ありがとうございます、確認できました とりあえず手元で球の影が正常に描画されるようにしてみました 変更点は以下の通りです main.cpp int deptTex = MakeScreen(256, 256, FALSE); //取り合えず軽めの256 * 256のサイズで作成 ↓ int deptTex = MakeScreen(4096, 4096, FALSE); //取り合えず軽めの256 * 256のサイズで作成  ↑256 * 256 では解像度が足りませんので 4096 * 4096 にしました main.cpp float othroParam = 1000.f; float offsetParam = 1000.f; float farParam = 1000.f; ↓ float othroParam = 15200.f; float offsetParam = 10000.f; float farParam = 16680.f;  ↑描画する範囲が足りていなかったのが割れている原因でした main.cpp int a = SetShaderConstantBuffer(cbufferVS, DX_SHADERTYPE_VERTEX, 3); ↓ int a = SetShaderConstantBuffer(cbufferVS, DX_SHADERTYPE_VERTEX, 4); SetShaderConstantBuffer(cbufferPS, DX_SHADERTYPE_PIXEL, 3); ↓ SetShaderConstantBuffer(cbufferPS, DX_SHADERTYPE_PIXEL, 4);  ↑こちらは前回お話した『DXライブラリが 0 〜 3 を使用している』ので、3 → 4 に変更します Shadow_SetUp_NotNormalMap\ShaderPolygon3DTestVS.hlsl struct VS_OUTPUT { float4 pos : SV_POSITION; // 座標(プロジェクション空間) float4 spos : TEXCOORD0; }; ↓ struct VS_OUTPUT { float4 spos : TEXCOORD0; float4 pos : SV_POSITION; // 座標(プロジェクション空間) };  ↑SV_POSITION の変数は、構造体の最後にする必要があります NormalMesh_NormalMap\ShaderPolygon3DTestVS.hlsl cbuffer LIGHT_VIEW : register(b3) ↓ cbuffer LIGHT_VIEW : register(b4) ShaderPolygon3DTestPS.hlsl cbuffer DEPTH_CONST : register(b3) ↓ cbuffer DEPTH_CONST : register(b4)  ↑こちらは前回お話した『DXライブラリが 0 〜 3 を使用している』ので、3 → 4 に変更します 記載漏れが無ければ上記の変更を行うことで影が正常に描画されると思います よろしければお試しください m(_ _)m
メンテ
Re: DX11で作った影のシェーダーがある一点を境に陰陽が二つに割れる ( No.9 )
名前:Comaneco(解決) 日時:2020/11/17 12:53

管理人さんの指示通り直してみたところ、正常に描画されるようになりました。 その後少し自分でいじってみたのですが、どうやら主な原因は、 registerの3番に設定していた事と、SV_POSITIONの後にsposを置いていた事だった様です。 (直した後、描画する範囲を大体2000程度まで近づけても、正常に動作したため) ともあれ、これで制作が進みそうです。 丁寧に対応、そして解決していただきありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存