トップページ > 記事閲覧
3DモデルをDxLibModelViewerと同じ表現で描画したい
名前:みこ 日時: 2024/10/02 03:43

いつもお世話になっております ライトや影などDxLibModelViewerと同じように描画したいのですがオープンソースで無いという事もあり、 全く同じ表現が難しいので質問させていただきます。 ※以下にソースコードとスクリーンショットがあります ttps://drive.google.com/open?id=11Qou4hbz9Sk62I_bYjcFzY7UF8wO66SX&usp=drive_fs スクリーンショットのDxLibModelViewer(上)とソースコード実行(下)いずれも同じmv1ファイルを表示しているのですが、 DxLibModelViewerの方が繊細で綺麗に見えますが、ソースコードの方は少し違和感があります お手数をお掛けしますが何卒よろしくお願いいたしますm(__)m 【環境】 DXLib 3.24e (先日共有頂いた最新バージョンです) 64bit Windows11 i9-13900K RAM 64GB GPU RTX4070 Direct3DVersion DX_DIRECT3D_9 〜 DX_DIRECT3D_11 全て確認 【3Dモデルについて】 blenderで出力したfbx(ループテクスチャ+法線マップ+ラフネスマップ) ※ついでに別の質問する形になり申し訳ないですが、DxLibModelViewerでmv1に出力する際ラフネスマップが効きませんでしたが非対応でしょうか? 【DxLibModelViewerの設定】 表示->ライティング計算の使用 オン 表示->アンチエイリアシングの使用 オン 表示->ハードウェア頂点演算の使用 オン 表示->ピクセル単位のライティングを行う オン 【ソースコード内容】 //SetUseDirect3DVersion(DX_DIRECT3D_9); //SetUseDirect3DVersion(DX_DIRECT3D_9EX); //SetUseDirect3DVersion(DX_DIRECT3D_11); // ウィンドウ設定 const int screenX = 1280; const int screenY = 720; SetFullSceneAntiAliasingMode(8, 8); SetWindowSizeExtendRate(1.0); ChangeWindowMode(TRUE); SetGraphMode(screenX, screenY, 32); SetWindowSize(screenX, screenY); SetDoubleStartValidFlag(TRUE); // 多重起動可に設定 SetUseHardwareVertexProcessing(TRUE); // ハードウェア頂点演算の使用 // DXライブラリ初期化処理 DxLib_Init(); // 描画範囲 SetDrawArea(0, 0, screenX, screenY); // バイニリア有効 SetDrawMode(DX_DRAWMODE_BILINEAR); SetFullScreenScalingMode(DX_FSSCALINGMODE_BILINEAR); //SetUseVramFlag(TRUE); // Zバッファを有効化 SetUseZBuffer3D(TRUE); SetWriteZBuffer3D(TRUE); // mv1読み込み //MV1SetLoadModelReMakeNormal(TRUE); // 法線の再計算 int model = MV1LoadModel("data/stage.mv1"); // ピクセル単位のライティングを行う SetUsePixelLighting(TRUE); // 点照明 (DxLibModelViewerのクリップボードから引用) SetLightEnable(FALSE); // 標準ライトを無効にする SetGlobalAmbientLight(GetColorF(0.0f, 0.0f, 0.0f, 0.0f)); int Light2Handle = CreatePointLightHandle(VGet(-1250.000f, 2187.500f, 0.000f), 6022.729f, 0.636f, 0.000f, 0.000f); SetLightDifColorHandle(Light2Handle, GetColorF(1.000f, 1.000f, 1.000f, 1.000f)); // ディフェーズ(拡散光) SetLightSpcColorHandle(Light2Handle, GetColorF(0.500f, 0.500f, 0.500f, 0.000f)); // スペキュラ(反射光) SetLightAmbColorHandle(Light2Handle, GetColorF(0.000f, 0.000f, 0.000f, 0.000f)); // アンビエント(環境光) // カメラのセットアップ (DxLibModelViewerのクリップボードから引用) SetCameraPositionAndTarget_UpVecY(VGet(-0.000141f, 3839.392578f, -3233.579102f), VGet(0.000000f, 2500.000000f, 0.000000f)); SetCameraNearFar(100.000023f, 25000.003906f); // 3Dモデルの描画 MV1DrawModel(model); WaitKey() ; // キーの入力待ち DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了
メンテ

Page: 1 |

Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.1 )
名前:管理人 日時:2024/10/02 22:43

DxLibModelViewer は裏画面に直接描画せず、MakeScreen で作成できる 仮画面に一度描画しているのが関係しているかもしれません 以下のコードを追加して、アンチエイリアス機能付きの仮画面に描画してから 裏画面に描画する、というのを試してみてください m(_ _)m 〜〜〜〜〜グローバル変数に以下を追加〜〜〜〜〜 // 仮画面のグラフィックハンドルの変数 int TempScreen; 〜〜〜〜〜初期化処理に以下を追加〜〜〜〜〜 // アンチエイリアス機能付きの仮画面を作成する設定を行う SetDrawValidMultiSample( 8, 8 ); // 仮画面を作成する TempScreen = MakeScreen( screenX, screenY, FALSE ); 〜〜〜〜〜メインループの描画処理を以下のように変更〜〜〜〜〜 // 描画先を仮画面にする SetDrawScreen( TempScreen ); =====MV1DrawModel などの描画処理===== // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // 裏画面に仮画面を描画する DrawGraph( 0, 0, TempScreen, FALSE ); // 裏画面の内容を表画面に反映 ScreenFlip(); 因みに DxLibModelViewer では SetFullSceneAntiAliasingMode は使用していません ( 代わりに SetDrawValidMultiSample を使用してアンチエイリアスをしています ) > ※ついでに別の質問する形になり申し訳ないですが、DxLibModelViewerでmv1に出力する際ラフネスマップが効きませんでしたが非対応でしょうか? スペキュラマップというラフネスマップに近いものには対応していますが、 ラフネスマップには非対応です
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.2 )
名前:みこ 日時:2024/10/03 09:23

ご連絡ありがとうございます! ご指摘通りMakeScreenを使用したところかなり近くなりましたが、 DxLibModelViewerの方がコントラストが効いている(?)と言いますか、特に壁が鮮明に見えます ※リンク先に スクリーンショット_2.png を追加しました 壁の凸凹の黒い線についてですが、法線マップによってライトの影になっていますので、 ライティングや影の設定の違いが他にあるのではないかと個人的に思っています >スペキュラマップというラフネスマップに近いものには対応していますが、 >ラフネスマップには非対応です 対応は難しいでしょうか? 今すぐ必要というわけではありませんが今後更に綺麗な描写ができるといいなと思っています。 別スレッドの【ios板のDxLiBMakeとDxMakeUseLibの作り方について】について こちらのスレッド私も興味があり閲覧したのですが、もし良ければAndroid版の方法もご指摘頂けると助かりますm(__)m >( 最近は過去に準備したライブラリファイルビルド用のバッチファイルを実行するだけなのでセットアップの仕方を失念しています… ) もし良ければバッチファイルを共有可能でしたらそちらでも可能ですm(__)m
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.3 )
名前:名無三 日時:2024/10/03 14:30

ラフネスマップはPBR向けのモノなのでファンシェーディングでは使い道がないように思います… 法線が逆転してる気がするのでそれの再計算を入れてみるとどうでしょう?
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.4 )
名前:管理人 日時:2024/10/04 01:31

> ご指摘通りMakeScreenを使用したところかなり近くなりましたが、 > DxLibModelViewerの方がコントラストが効いている(?)と言いますか、特に壁が鮮明に見えます > ※リンク先に スクリーンショット_2.png を追加しました 一つご質問させてください DxLibModelViewer のメニューの『読み込みオプション』の『法線再計算』はONになっていますでしょうか? > >スペキュラマップというラフネスマップに近いものには対応していますが、 > >ラフネスマップには非対応です > 対応は難しいでしょうか? > 今すぐ必要というわけではありませんが今後更に綺麗な描写ができるといいなと思っています。 ラフネスマップというものについて知らなかったのですが、調べてみたところ名無三さんも仰られています通り PBR(物理ベースレンダリング)用のマップのようです DXライブラリのレンダリング方式はPBRではない( 物理ベースではない )旧来のレンダリング方式なので対応はできません、すみません ( 尚、PBRは実装難度が高く、また仮にPBRを実装できたとしてもビルドして作成される実行ファイルの容量がかなり大きくなることが 予想されるため、DXライブラリにPBRを実装する予定はありません ) > こちらのスレッド私も興味があり閲覧したのですが、もし良ければAndroid版の方法もご指摘頂けると助かりますm(__)m > >( 最近は過去に準備したライブラリファイルビルド用のバッチファイルを実行するだけなのでセットアップの仕方を失念しています… ) > もし良ければバッチファイルを共有可能でしたらそちらでも可能ですm(__)m 了解です
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.5 )
名前:みこ 日時:2024/10/04 03:46

名無三様 PBR等、知識不足でした。 ありがとうございます >法線が逆転してる気がするのでそれの再計算を入れてみるとどうでしょう? 確かに言われてみると法線の問題っぽい写り方してますね... MV1SetLoadModelReMakeNormal(TRUE); で法線の再計算は試したのですが結果変わりませんでした MV1SetDrawMode(DX_MV1_DRAWMODE_NORMAL_DEPTH); で法線の描画をしてみましたが特に問題なさそうでした ※DX_MV1_DRAWMODE_NORMAL_DEPTH.png を追加しました 管理人様 ありがとうございます >DxLibModelViewer のメニューの『読み込みオプション』の『法線再計算』はONになっていますでしょうか? はい、ONになっています。 また、OFFにして生FBXを読み込むと真っ黒になりました ※念のため MV1SetLoadModelReMakeNormal(TRUE); も試しましたが同じ結果でした また、FBXファイルはBlenderを使用して作成したものですが、 壁のテクスチャマップの角度を90度に設定して出力していますが、設定した角度がDXLibでは反映されませんでした。 テクスチャマップの画像自体を回転すれば解決するのと、Blender側の問題の可能性も考慮して特に気にしていませんでしたが、 法線マップも回転値に含まれますのでもしかしたら表題の問題と関係しているのではと思いましたので念のため共有します。 ※blender.pngを追加しました ラフネスマップについても承知いたしました。詳しいご説明ありがとうございます!
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.6 )
名前:みこ 日時:2024/10/04 03:55

追記 念のため3Dモデルも共有します。 「3Dモデル」ディレクトリにmv1、fbx、blend(Blender用)形式を追加しました お手数をお掛けします何卒よろしくお願いいたしますm(__)m
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.7 )
名前:管理人 日時:2024/10/04 21:45

アップしていただいた stage.mv1 を DxLibModelViewer.exe とプログラムで表示してスクリーンショットを 撮ってみましたが、私には違いが分かりませんでした (・・; <2つのスクリーンショットを縦に並べた画像(上:DxLibModelViewer 下:プログラム)> https://dxlib.xsrv.jp/temp/ScreenCapture_3DModel.png <テスト用プログラム> #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { const int screenX = 1858; const int screenY = 985; SetFullSceneAntiAliasingMode(8, 8); SetWindowSizeExtendRate(1.0); ChangeWindowMode(TRUE); SetGraphMode(screenX, screenY, 32); // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; int ModelHandle = MV1LoadModel( "D:\\Yam\\UserProgram\\みこさん\\20241004\\3Dモデル\\stage.mv1" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // ピクセル単位のライティング SetUsePixelLighting( TRUE ); // DxLibModelViewer のクリップボード機能のライト設定 SetLightEnable( FALSE ); SetGlobalAmbientLight( GetColorF( 0.200f, 0.200f, 0.200f, 0.0f ) ); int Light0Handle = CreateDirLightHandle( VGet( 0.475f, -0.129f, 0.871f ) ); SetLightDifColorHandle( Light0Handle, GetColorF( 1.000f, 1.000f, 1.000f, 1.000f ) ); SetLightSpcColorHandle( Light0Handle, GetColorF( 0.500f, 0.500f, 0.500f, 0.000f ) ); SetLightAmbColorHandle( Light0Handle, GetColorF( 0.000f, 0.000f, 0.000f, 0.000f ) ); // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // DxLibModelViewer のクリップボード機能のカメラ設定 SetCameraPositionAndTarget_UpVecY( VGet( -1424.464233f, 2886.015137f, -2611.876709f ), VGet( 0.000000f, 2500.000000f, 0.000000f ) ); SetCameraNearFar( 100.000023f, 25000.003906f ); // モデルを描画 MV1DrawModel( ModelHandle ); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } > 壁のテクスチャマップの角度を90度に設定して出力していますが、設定した角度がDXLibでは反映されませんでした。 > テクスチャマップの画像自体を回転すれば解決するのと、Blender側の問題の可能性も考慮して特に気にしていませんでしたが、 > 法線マップも回転値に含まれますのでもしかしたら表題の問題と関係しているのではと思いましたので念のため共有します。 すみません、テクスチャの角度設定には対応していません m(_ _;m
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.8 )
名前:みこ 日時:2024/10/05 01:56

ご確認ありがとうございます! 提示頂いたコードを実行しても私の環境ではやはり違和感があったのですが原因が分かりました! DXLibのバージョンを3.24dに落としてみたところ繊細な表示になりました ※先日DxLibModelViewerの修正も頂きましたので、DxLibModelViewerのバージョンも3.24eになっているものと思っていました... DxLibバージョン別比較.png を追加しました こちらの比較画像では同じコード、同じmv1ファイルを使用してDXライブラリのバージョンのみ変えた結果です 上:3.24d (最新リリースバージョン) 下:3.24e (2024/09/19 16:46) >すみません、テクスチャの角度設定には対応していません m(_ _;m 承知いたしました
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.9 )
名前:管理人 日時:2024/10/05 19:39

> DXLibのバージョンを3.24dに落としてみたところ繊細な表示になりました すみません、アップしていただいた比較画像で上下の画像に違いがあることは分かるのですが、 別の角度や位置から見た時に『繊細な表示』なのかそうではないのかを私は判断することができなかったのですが 本件の調査をしている最中に SetUsePixelLighting( TRUE ); を実行している状態且つ法線マップがマテリアルに含まれる場合 スペキュラ効果( 光の反射効果 )が正しく適用されていないことが判明し、今回その修正を行いました この修正によって stage.mv1 の表示も『繊細な表示』になったのかはちょっと 私には判断できないのですが、直った可能性がありますので、よろしければこちらのバージョンを お試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) // ビューアー https://dxlib.xsrv.jp/temp/DxLibModelViewerTest.zip
メンテ
Re: 3DモデルをDxLibModelViewerと同じ表現で描画したい ( No.10 )
名前:みこ(解決) 日時:2024/10/06 00:23

確認したところ無事直っていました スペキュラ効果の問題でしたか、、なるほどです! 角度やライトの当たり方によって違いが分かり難かったので本件の調査困難だったと思いますが無事解決できて何よりです ios版、Android版のバージョンも必要ですが急ぎではないので先日のDxLibMakeコンパイル(バッチファイル等)の件でやってみようと思います この度はお忙しい中調査と修正ありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存