トップページ > 記事閲覧
マテリアルパラメーターの取得
名前:TETSU 日時: 2015/05/09 15:29

DXライブラリを愛用させてもらっている者です 今回、使用方法がわからないことがあったので質問させていただきに来ました その質問なのですが、モデリングソフトで指定したマテリアルパラメーターをDXライブラリで取得し、オリジナルシェーダーに渡すにはどうすればいいのでしょう? ディフューズカラーなどの基本的な物は専用の取得用関数が用意されていますが、そうでないもの(例えば自己発光や屈折率など)は取得できないのでしょうか? 回答よろしくお願いします
メンテ

Page: 1 |

Re: マテリアルパラメーターの取得 ( No.1 )
名前:管理人 日時:2015/05/09 21:37

> ディフューズカラーなどの基本的な物は専用の取得用関数が用意されていますが、 > そうでないもの(例えば自己発光や屈折率など)は取得できないのでしょうか? 自己発光は MV1GetMaterialEmiColor で取得できます MV1GetMaterialEmiColor http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R5N8 ただ、もしモデリングソフトから xファイル形式で出力されていますと、xファイルには 自己発光に対応するパラメータが無いので、モデリングソフトで自己発光のパラメータを 設定していてもxファイルとして出力した時点でその情報は欠落してしまっていますので MV1GetMaterialEmiColor で取得することはできません 屈折率は MV1GetMaterialSpcPower で取得できるかもしれません MV1GetMaterialSpcPower http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R5N12 よろしければお試しください
メンテ
Re: マテリアルパラメーターの取得 ( No.2 )
名前:TETSU 日時:2015/05/09 22:45

素早い返信ありがとうございます まさか当日中に返信が来るとは思っていませんでした 取得したパラメーターをオリジナルシェーダーで使うにはどうすればいいでしょう 構造体のメンバーに何らかの変数を追加すれば利用できるものなのか、それともプログラム側からひとつづつ値を渡していくしかないのか、ご教授ください //こいつらと一緒の方法で利用できますか? struct MATERIAL { float4 Diffuse ; // ディフューズカラー float4 Specular ; // スペキュラカラー float4 Power ; // スペキュラの強さ } ;
メンテ
Re: マテリアルパラメーターの取得 ( No.3 )
名前:管理人 日時:2015/05/10 00:00

シェーダーについてはどの程度ご存知なのでしょうか? とりあえずこちらのサンプルの 鏡面効果基本 http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_Mirror_Shader.html 頂点シェーダーのこちらの部分 float4 cfProjectionMatrix[ 4 ] : register( c2 ) ; // ビュー  → 射影行列 float4 cfViewMatrix[ 3 ] : register( c6 ) ; // ワールド → ビュー行列 float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ; // ローカル → ワールド行列 のようにグローバル変数のような箇所に変数や配列を書き、その横に : register( c番号 ) と書いて そのグローバル変数( のようなもの、正しくは『定数』 )に外部から( C++ 側から )アクセスできるようにします そして、オリジナルシェーダーを使用した描画を行う前に SetVSConstF を使用して グローバル変数( のようなもの、『定数』 )の値を C++ のプログラムから設定します SetVSConstF http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N6 LoadVertexShader のサンプルの中で SetVSConstF を使用していますので、よろしければご覧ください LoadVertexShader http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N2 『register( c番号 )』の「番号」にはレジスタ番号( 0〜255 )を指定するのですが、DXライブラリ側で 使用している番号が結構あります、どの番号が何に使用されているか等も LoadVertexShader の解説に ありますので、よろしければご覧ください あと、上記は頂点シェーダーについてですので、ピクセルシェーダーについては SetVSConstF の 代わりに SetPSConstF、LoadPixelShader となります( 尚、ピクセルシェーダーで指定できる レジスタ番号は 0〜223 の224個です ) SetPSConstF http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N17 LoadPixelShader http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N3 そして、シェーダーのグローバル変数の記述のような部分に基本型の変数ではなく構造体を書いた場合 struct MATERIAL { float4 Diffuse ; float4 Specular ; float4 Power ; } ; MATERIAL cfMaterial : register( c2 ) ; 構造体のそれぞれのメンバー変数に対応するレジスタ番号は上の記述のように c2 と書いた場合は以下のようになります cfMaterial.Diffuse レジスタ 2 cfMaterial.Specular レジスタ 3 cfMaterial.Power レジスタ 4 C++ のプログラムで SetVSConstF を使用してレジスタの値を設定する場合は以下のようになります FLOAT4 Diffuse ; FLOAT4 Specular ; FLOAT4 Power ; Diffuse.x = 1.0f ; Diffuse.y = 1.0f ; Diffuse.z = 1.0f ; Diffuse.w = 1.0f ; Specualr.x = 1.0f ; Specualr.y = 1.0f ; Specualr.z = 0.0f ; Specualr.w = 0.0f ; Power.x = 0.2f ; Power.y = 0.2f ; Power.z = 0.2f ; Power.w = 0.2f ; SetVSConstF( 2, Diffuse ) ; SetVSConstF( 3, Specular ) ; SetVSConstF( 4, Power ) ; 尚、上記では分かりやすく FLOAT4 の構造体に値を代入してから SetVSConstF を使用していますが、 プログラムが長くなってしまうので、戻り値が FLOAT4 構造体である F4Get を使用すると 以下のように短く記述することもできます SetVSConstF( 2, F4Get( 1.0f, 1.0f, 1.0f, 1.0f ) ) ; SetVSConstF( 3, F4Get( 1.0f, 1.0f, 0.0f, 0.0f ) ) ; SetVSConstF( 4, F4Get( 0.2f, 0.2f, 0.2f, 0.2f ) ) ; よろしければお試しください
メンテ
Re: マテリアルパラメーターの取得 ( No.4 )
名前:TETSU 日時:2015/05/11 13:28

シェーダーはある程度わかっているつもりでしたが、構造体を定数レジスタで取得するときメンバーに順番に番号が振られるということは知りませんでした つまり、以下のようなプログラムを使えばシェーダーからパラメーターを取得出来るのですよね? ピクセルシェーダー側プログラム struct MATERIAL { float4 Diffuse ; // レジスタ番号2 float4 Specular ; // レジスタ番号3 float4 Power ; // レジスタ番号4 float4 Emissive ; // レジスタ番号5 } ; MATERIAL Mat : register( c2 ) ; //以下省略 C++側プログラム(抜粋) // パラメーターを取得して COLOR_F Emissive = MV1GetMaterialEmiColor( ModelHandle, Material ); // 取得したパラメーターをシェーダーに渡す SetPSConstF( 5, F4Get( Emissive.r, Emissive.g, Emissive.b, Emissive.a ) ) ; ですが、これを全モデル、全マテリアルにおいて行うとプログラムが煩雑になってしまいますし、描画もマテリアルごとに分けなくてはいけません ディフューズカラー、スペキュラカラー、スペキュラの強さはC++プログラム側で指定しなくてもシェーダーから取得できますよね? これと同じようなことはエミッシブカラーなど他のパラメーターではできないのでしょうか?
メンテ
Re: マテリアルパラメーターの取得 ( No.5 )
名前:管理人 日時:2015/05/11 23:59

> つまり、以下のようなプログラムを使えばシェーダーからパラメーターを取得出来るのですよね? はい > ですが、これを全モデル、全マテリアルにおいて行うとプログラムが煩雑になってしまいますし、描画もマテリアルごとに分けなくてはいけません DXライブラリ内部では同様の処理を全モデル、全マテリアルにおいて行っています 描画もマテリアルごとに分けています > ディフューズカラー、スペキュラカラー、スペキュラの強さはC++プログラム側で指定しなくてもシェーダーから取得できますよね? > これと同じようなことはエミッシブカラーなど他のパラメーターではできないのでしょうか? 使用レジスタ削減のためにエミッシブカラーはアンビエントカラーなどと合成されてレジスタ1に設定されています DXライブラリの機能として追加の情報を自動でレジスタにセットする機能はありませんので、 現状では全モデル、全マテリアルに対して描画前に SetPSConstF を実行していただくしかありません・・・ ( 因みに、前述の通りDXライブラリ内部でも結局同じことをしていますので、マテリアル毎に描画を分けることによって 処理負荷が異様に増大するということはありません )
メンテ
Re: マテリアルパラメーターの取得 ( No.6 )
名前:TETSU(解決) 日時:2015/05/14 22:42

分かりました。オリジナルの描画関数を作って実装することにします
メンテ

Page: 1 |

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

   クッキー保存