Re: マテリアルのパラメータのみを描画する機能 ( No.1 ) |
- 名前:管理人 日時:2017/04/05 22:54
すみません、3Dの描画関係に疎いのでご質問させてください
> ・モデルのエミット値を描画する
ライトの値と乗算する前の色( マテリアルのディフューズカラーとディフューズマップ( ディフューズテクスチャ )を乗算したもの )のことでしょうか?
> ・モデルの反射色や
ライトの値と乗算する前のスペキュラ色( マテリアルのスペキュラカラーとスペキュラマップ( スペキュラテクスチャ )を乗算したもの )のことでしょうか?
スペキュラマップが設定されていない場合は基本的にマテリアルのスペキュラ色となりますが、それで問題ないでしょうか?
> 反射強度のみを描画する
スペキュラ色と最終的に乗算する値( ライトの位置やカメラの位置や照射される物体の反射設定や位置や法線方向などから導き出される値 )のことでしょうか?
この値は 0.0f 〜 1.0f に収まらないことが多いので、float型のバッファを使用することが前提と考えて良いのでしょうか?
|
Re: マテリアルのパラメータのみを描画する機能 ( No.2 ) |
- 名前:ペッパー 日時:2017/04/05 22:56
ご返信ありがとうございます。確かに、言葉足らずでした。申し訳ありませんm(_ _)m
実装方法は個人の趣味によってかなり変動するかと思いますが、私個人としてはポストエフェクト類でマスク画像として
利用したいので下記のような実装を検討して頂ければ幸いです。
なお、ご指摘頂いた通りエミット類はディフューズカラーに左右されますので無かった事にして下さい…。
>>・モデルの反射色や
>ライトの値と乗算する前のスペキュラ色( マテリアルのスペキュラカラーとスペキュラマップ( スペキュラテクスチャ )を乗算したもの )のことでしょうか?
>スペキュラマップが設定されていない場合は基本的にマテリアルのスペキュラ色となりますが、それで問題ないでしょうか?
DxLibModelViewerでの、「マテリアル→反射光→輝度」の値を、白黒の整数バッファで出力
(引数を渡し、その値以上なら1、未満なら0)
>> 反射強度のみを描画する
>スペキュラ色と最終的に乗算する値( ライトの位置やカメラの位置や照射される物体の反射設定や位置や法線方向などから導き出される値 )のことでしょうか?
>この値は 0.0f 〜 1.0f に収まらないことが多いので、float型のバッファを使用することが前提と考えて良いのでしょうか?
DxLibModelViewerでの、「マテリアル→反射光→強さ」の値を、白黒の整数バッファで出力
(引数を渡し、その値以上なら1、未満なら0)
※因みに、ビューワーで一般的なMMD用モデルを読み込んだ際、読み込み時は「マテリアル→反射光→強さ」の値が0.0~255.0の間なのに対し、ビューワーでは50.0までしか設定出来ないのは仕様でしょうか?
マテリアルの各パラメータを個別に整数バッファへ出力できれば、シェーダ類へ対応せずとも現状のDXライブラリの機能で十分に端末環境でもリッチなグラフィックを得る手段が増えるかと思います
アンドロイド版の修正やiOS版への着手などお忙しいときにこのような無理を言って申し訳ありませんが、ご一考頂ければ幸いですm(_ _)m
|
Re: マテリアルのパラメータのみを描画する機能 ( No.3 ) |
- 名前:管理人 日時:2017/04/05 22:57
ご返答ありがとうございます
> DxLibModelViewerでの、「マテリアル→反射光→輝度」の値を、白黒の整数バッファで出力
> (引数を渡し、その値以上なら1、未満なら0)
> DxLibModelViewerでの、「マテリアル→反射光→強さ」の値を、白黒の整数バッファで出力
> (引数を渡し、その値以上なら1、未満なら0)
閾値を渡して、それ以下か未満かで 1, 0 を書き込む機能ですか…
ライトの影響を受けない機能なのでシェーダーの容量が大きく増えてしまうことはないと思いますが、
暫くモデルの描画周りに手をつけていなかったのでどのくらいの作業量になるか分かりません
明日手をつけてみますが、もし何日も掛かる作業となってしまいそうだったら直ぐには実装できないかもしれません…
> ※因みに、ビューワーで一般的なMMD用モデルを読み込んだ際、読み込み時は「マテリアル→反射光→強さ」の値が0.0~255.0の間なのに対し、ビューワーでは50.0までしか設定出来ないのは仕様でしょうか?
はい、ビューアーの仕様です
あまり大きな範囲を指定できるようにするとツマミの調整がし辛いかな、と思って最大を 50.0 にしています
|
Re: マテリアルのパラメータのみを描画する機能 ( No.4 ) |
- 名前:ペッパー 日時:2017/04/05 22:58
早速のご作業、誠にありがとうございます。
当初は「ランティング計算を加味した結果」と「加味しない結果」の2パターンを描画できればうれしいなーと考えていたのですが、
端末環境での処理速度やシェーダの依存性などを考慮し、あえて上記のような仕様でご相談させて頂きました…。
至らぬご心配をお掛けし申し訳ありませんm(_ _)m
シェーダの必要・不必要は、管理人様のご負担の少ない方でご作業して頂ければ幸いです。
また、0/1のマスク画像だけではなく、各種マテリアルのパラメータを画像として出力できれば(floatなどはintに丸め込んで)、
かなりエフェクト類の幅が広がるかとは思いますが、こちらも管理人様のお時間の許す時で構いませんので、ご検討頂ければ幸いです。
|
Re: マテリアルのパラメータのみを描画する機能 ( No.5 ) |
- 名前:管理人 日時:2017/04/05 22:59
ご返信が遅くなり申し訳ありません
ご返答ありがとうございます
> 当初は「ランティング計算を加味した結果」と「加味しない結果」の2パターンを描画できればうれしいなーと考えていたのですが、
> 端末環境での処理速度やシェーダの依存性などを考慮し、あえて上記のような仕様でご相談させて頂きました…。
承知しました
新規機能を追加するのが一番時間が掛かるので、それに加えて『少しだけ処理の異なる機能』を追加するだけなら
少しの時間で済むと思うので、2パターン描画できるようにしようと思います
> シェーダの必要・不必要は、管理人様のご負担の少ない方でご作業して頂ければ幸いです。
はい、後々のことを考えてシェーダ使用でいこうと思います
> また、0/1のマスク画像だけではなく、各種マテリアルのパラメータを画像として出力できれば(floatなどはintに丸め込んで)、
> かなりエフェクト類の幅が広がるかとは思いますが、こちらも管理人様のお時間の許す時で構いませんので、ご検討頂ければ幸いです。
むむ、こちらも「ライティング計算を加味した結果」と「加味しない結果」の2パターンあるほうが良いのでしょうか?
重ねてのご質問ですみません
あと、この週末はバグ修正で終わりそうで、且つ来週末はあまり作業時間が確保できないこともあり、
本当に申し訳ないのですが実装は数週間先になるかもしれません、すみません m(_ _;m
|
Re: マテリアルのパラメータのみを描画する機能 ( No.6 ) |
- 名前:ペッパー 日時:2017/04/05 23:00
>> また、0/1のマスク画像だけではなく、各種マテリアルのパラメータを画像として出力できれば(floatなどはintに丸め込んで)、
>> かなりエフェクト類の幅が広がるかとは思いますが、こちらも管理人様のお時間の許す時で構いませんので、ご検討頂ければ幸いです。
>むむ、こちらも「ライティング計算を加味した結果」と「加味しない結果」の2パターンあるほうが良いのでしょうか?
>重ねてのご質問ですみません
はい。こちらも2パターンあるとエフェクトの幅が広がると思います。
ですがスぺキュラ関連以外のマテリアル情報はライティング計算に左右されないものも多いですし、
「加味しない」の1パターンでも現状では問題ないかとおもいます。
>あと、この週末はバグ修正で終わりそうで、且つ来週末はあまり作業時間が確保できないこともあり、
>本当に申し訳ないのですが実装は数週間先になるかもしれません、すみません m(_ _;m
いえ、実装を検討して頂けただけで感謝です。
季節の移り変わりですし、ご体調に気を付けてご都合のよろしいときにご作業して頂けると幸いです。
お手数をお掛けしてしまいますが、何卒よろしくお願い致します。
|
Re: マテリアルのパラメータのみを描画する機能 ( No.7 ) |
- 名前:管理人 日時:2017/04/05 23:01
> ですがスぺキュラ関連以外のマテリアル情報はライティング計算に左右されないものも多いですし、
> 「加味しない」の1パターンでも現状では問題ないかとおもいます。
そうですか…では「加味しない」の1パターンのみで…
一応お尋ねするのですが、逆にDXライブラリでのマテリアル情報の中でスペキュラ関連以外で
ライティング計算に左右される要素は何かありますでしょうか?
|
Re: マテリアルのパラメータのみを描画する機能 ( No.8 ) |
- 名前:ペッパー 日時:2017/04/05 23:02
>>ですがスぺキュラ関連以外のマテリアル情報はライティング計算に左右されないものも多いですし、
>>「加味しない」の1パターンでも現状では問題ないかとおもいます。
>そうですか…では「加味しない」の1パターンのみで…
加味しない1パータンの方が作業量的に負担が少ないかと思い上記の返答をさせて頂きましたが、
もしかして「ライティング計算を加味しない」実装の方が面倒でしたでしょうか…?(汗
>一応お尋ねするのですが、逆にDXライブラリでのマテリアル情報の中でスペキュラ関連以外で
>ライティング計算に左右される要素は何かありますでしょうか?
申し訳ありません。スペキュラ以外にも拡散光や環境光はレンダータイプに関わらずライティング結果に
左右されると思うのですが、認識違いでしたでしょうか…。
|
Re: マテリアルのパラメータのみを描画する機能 ( No.9 ) |
- 名前:管理人 日時:2017/04/05 23:03
ご返答ありがとうございます、何度もすみません
> 加味しない1パータンの方が作業量的に負担が少ないかと思い上記の返答をさせて頂きましたが、
> もしかして「ライティング計算を加味しない」実装の方が面倒でしたでしょうか…?(汗
仰るとおりでしたが、仰るとおりではなくなりました (・・;;
なぜかと言いますと「ライティング計算を加味しない」場合はシェーダーを新たに追加することなく
自己発光以外のパラメータを 0 にしたマテリアルで描画すれば既存のシェーダーで実現できるので、
もしそうする場合はかなり色々なところに例外処理を加えなければならないので大変だなぁと思ったのですが、
速度のことや今後のことを考えると専用のシェーダーを用意した方が良いので、その場合は既存の
仕組みに少し処理を追加するだけなのである程度容易に実装できそうです
> 申し訳ありません。スペキュラ以外にも拡散光や環境光はレンダータイプに関わらずライティング結果に
> 左右されると思うのですが、認識違いでしたでしょうか…。
となりますと、ライティング結果に左右されないのは自己発光のみ、という認識で良いでしょうか?
拡散光 ライティング結果の影響受ける
反射光 ライティング結果の影響受ける
環境光 ライティング結果の影響受ける
自己発光 ライティング結果の影響受けない?
すみません、『スぺキュラ関連以外のマテリアル情報はライティング計算に左右されないものも多い』と
仰られていたので、少し混乱しています、『ライティング計算に左右されないものも多い』ということは
自己発光以外にもライティング結果に左右されない要素があるということでしょうか?
|
Re: マテリアルのパラメータのみを描画する機能 ( No.10 ) |
- 名前:ペッパー 日時:2017/04/05 23:04
此方こそ、何度も申し訳ございません……。
誠に勝手ながら、先に具体的内容からご返答させて頂きます。
A.実装して頂きたいもの
・反射光の「輝度」と「強さ」
それぞれ、
1.ライティング結果の影響受けない
2.整数バッファに描画
3.引数を渡し、それ未満、それ以上で 0/1 のマスク画像を出力可能
4.引数が無い場合、パラメータの値そのままを描画
5.引数を渡し、それ未満なら0。それ以上ならパラメータの値そのままを描画
※5.は3.4.を組み合わせると可能ですが、同じモデルを何度も描画すると非効率かもしれないので。
B.実装して頂けると今後の発展に役立ちそうだなーと思うご提案
・拡散光 ライティング結果の影響を受ける・受けない両方
・反射光 ライティング結果の影響を受ける・受けない両方
・環境光 ライティング結果の影響を受ける・受けない両方
・自己発光 ライティング結果の影響を受ける・受けない両方
ただしBに関してよくよく考え直したところ、ポストエフェクトの素材にマテリアルパラメータを使用する場面は
少ないかもしれませんので、Bの実装はあくまでお暇が出来たら…、程度の認識でお願い致します。
(ポストエフェクトの場合、深度や法線、座標の方が使われることが多いですし)
>>スぺキュラ関連以外のマテリアル情報はライティング計算に左右されないものも多い~~
これに関しては、当方の知識不足&勘違いでした…。本当に申し訳ございませんm(_ _)m
|
Re: マテリアルのパラメータのみを描画する機能 ( No.11 ) |
- 名前:管理人 日時:2017/04/05 23:05
詳細なご返答ありがとうございます
MV1SetMaterialType で指定するマテリアルタイプの追加で対応しようと思っていますので
A については
// マテリアルのスペキュラの「輝度」をそのまま描画( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE
// マテリアルのスペキュラの「強さ」をそのまま描画( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_POWER
// マテリアルのスペキュラの「輝度」が指定の閾値以上か、未満かで2色に塗り分けるマテリアル( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_TWO_COLOR
// マテリアルのスペキュラの「強さ」が指定の閾値以上か、未満かで2色に塗り分けるマテリアル( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_POWER_TWO_COLOR
// マテリアルのスペキュラの「輝度」が指定の閾値以上の場合はそのまま描画、それ以下の場合は0にするマテリアル( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_CLIP
// マテリアルのスペキュラの「強さ」が指定の閾値以上の場合はそのまま描画、それ以下の場合は0にするマテリアル( ライティングの影響は受けない )
DX_MATERIAL_TYPE_MAT_SPEC_POWER_CLIP
の6種類の追加で足りますでしょうか?
あと、「2.整数バッファに描画」とはどのような意味でしょうか?
( 浮動小数点バッファには出力できないようにするということでしょうか? )
> これに関しては、当方の知識不足&勘違いでした…。本当に申し訳ございませんm(_ _)m
承知しました
私も知識不足で何度もお訊ねしてしまってすみません
|
Re: マテリアルのパラメータのみを描画する機能 ( No.12 ) |
- 名前:ペッパー 日時:2017/04/05 23:06
お忙しい中、ご対応ありがとうございますm(_ _)m
>MV1SetMaterialType で指定するマテリアルタイプの追加で対応しようと思っていますので
>A については
>~~~
>の6種類の追加で足りますでしょうか?
はい。問題ありません。
>あと、「2.整数バッファに描画」とはどのような意味でしょうか?
>( 浮動小数点バッファには出力できないようにするということでしょうか? )
パラメータの値が浮動少数のものはパラメータそのままという意味では出力先を浮動小数点バッファにした方が良いのでしょうが、
現行の端末機器の性能が向上した今日とはいえ浮動小数点バッファを贅沢に使用できるわけではないかと思います。
よって、浮動少数点パラメータであっても整数バッファに丸め込んで出力したほうが処理速度的に良いかなー?と思った次第であります。
|
Re: マテリアルのパラメータのみを描画する機能 ( No.13 ) |
- 名前:管理人 日時:2017/04/05 23:31
ご返答ありがとうございます
そして、すみませんまたご質問してしまいます m(_ _;m
> よって、浮動少数点パラメータであっても整数バッファに丸め込んで出力したほうが処理速度的に良いかなー?と思った次第であります。
整数バッファに丸め込むということは浮動小数点パラメータのある値からある値までを 0.0f〜1.0f ( 0〜255 )に
丸め込むということになると思うのですが、そうなると『そのまま描画』とは意味が若干異なってくると思うのですが、
ペッパーさんが仰られる『4.引数が無い場合、パラメータの値そのままを描画』とは、整数バッファへの丸め込みの処理も
含んでいるという認識で問題ないでしょうか?
仮にその場合、丸め込む下限値と上限値もパラメータとして指定する、と考えて良いのでしょうか?
それとも丸め込みの下限値と上限値は 0.0f 〜 1.0f で固定、というイメージでしょうか?
例:スペキュラの「強さ」をそのまま書き込むマテリアルに設定して、
且つ丸め込みの値を下限 0.0f、上限 40.0f に設定する処理のイメージ
// マテリアルタイプを『マテリアルのスペキュラの「強さ」をそのまま描画( ライティングの影響は受けない )』に設定
MV1SetMaterialTypeAll( ModelHandle, DX_MATERIAL_TYPE_MAT_SPEC_POWER ) ;
// 丸め込む下限値と上限値を設定
MV1SetMaterialTypeParamAll( ModelHandle, 0.0f, 40.0f ) ;
|
Re: マテリアルのパラメータのみを描画する機能 ( No.14 ) |
- 名前:ペッパー 日時:2017/04/06 10:18
移行作業、ありがとうございます。
なんども言葉足らずで申し訳ありません…。
>整数バッファに丸め込むということは浮動小数点パラメータのある値からある値までを 0.0f〜1.0f ( 0〜255 )に
>丸め込むということになると思うのですが、そうなると『そのまま描画』とは意味が若干異なってくると思うのですが、
>ペッパーさんが仰られる『4.引数が無い場合、パラメータの値そのままを描画』とは、整数バッファへの丸め込みの処理も
>含んでいるという認識で問題ないでしょうか?
はい。その通りです。
>仮にその場合、丸め込む下限値と上限値もパラメータとして指定する、と考えて良いのでしょうか?
>それとも丸め込みの下限値と上限値は 0.0f 〜 1.0f で固定、というイメージでしょうか?
スペキュラの強さは.0f~1.0fを大きく超えますし(ビューワー設定では.0f~50.0f。fbxやpmxから読み込むと.0f~255.0f)
例に挙げて頂いた通り、下限値と上限値もパラメータとして指定する方法で実装して頂けると幸いですm(_ _)m
|
Re: マテリアルのパラメータのみを描画する機能 ( No.15 ) |
- 名前:管理人 日時:2017/04/06 23:50
ご返答ありがとうございます!
丸め込みの値指定も込みということで承知しました
次の週末に実装してみようと思いますので、もう暫くお時間をください m(_ _)m
|
Re: マテリアルのパラメータのみを描画する機能 ( No.16 ) |
- 名前:管理人 日時:2017/04/10 00:53
お待たせしました、マテリアルの値を描画する機能を実装したバージョンをアップしましたので、
よろしければダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
まず、MV1SetMaterialType や MV1SetMaterialTypeAll で指定できるマテリアルタイプに以下のものを追加しました
// マテリアルのスペキュラ色の輝度の指定の範囲の値を 0.0f 〜 1.0f の値に正規化して書き込むマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_UNORM (3)
// DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_UNORM に『指定の値未満の場合は書き込む値を 0.0f にする』という処理を加えたマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_CLIP_UNORM (4)
// マテリアルのスペキュラ色の輝度が指定の閾値以上 の場合は 1.0f を、未満の場合は 0.0f を書き込むマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_CMP_GREATEREQUAL (5)
// マテリアルのスペキュラハイライトの鮮明度の指定の範囲の値を 0.0f 〜 1.0f の値に正規化して書き込むマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_POWER_UNORM (6)
// DX_MATERIAL_TYPE_MAT_SPEC_POWER_UNORM に『指定の値未満の場合は書き込む値を 0.0f にする』という処理を加えたマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_POWER_CLIP_UNORM (7)
// マテリアルのスペキュラハイライトの鮮明度が指定の閾値以上 の場合は 1.0f を、未満の場合は 0.0f を書き込むマテリアル
#define DX_MATERIAL_TYPE_MAT_SPEC_POWER_CMP_GREATEREQUAL (8)
そして、丸め込みの値や閾値を設定するための以下の関数を追加しました
// 全てのマテリアルのタイプ別パラメータを変更する( マテリアルタイプ DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_TWO_COLOR などで使用 )
int MV1SetMaterialTypeParamAll( int MHandle, ... ) ;
// 指定のマテリアルのタイプ別パラメータを変更する( マテリアルタイプ DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_TWO_COLOR などで使用 )
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex, ... ) ;
使い方は GraphFilter に似ていて、マテリアルタイプによって渡す引数が異なります
// DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_UNORM の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float MinParam = 正規化の下限値( この値以下が 0.0f になる ),
float MaxParam = 正規化の上限値( この値以上が 1.0f になる ) ) ;
// DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_CLIP_UNORM の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float MinParam = 正規化の下限値( この値以下が 0.0f になる ),
float MaxParam = 正規化の上限値( この値以上が 1.0f になる ),
float ClipParam = 閾値( この値未満が 0.0f になる ) ) ;
// DX_MATERIAL_TYPE_MAT_SPEC_LUMINANCE_CMP_GREATEREQUAL の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float CmpParam = 比較値( この値以上の場合は 1.0f が、未満の場合は 0.0f が書き込まれる ) ) ;
// DX_MATERIAL_TYPE_MAT_SPEC_POWER_UNORM の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float MinParam = 正規化の下限値( この値以下が 0.0f になる ),
float MaxParam = 正規化の上限値( この値以上が 1.0f になる ) ) ;
// DX_MATERIAL_TYPE_MAT_SPEC_POWER_CLIP_UNORM の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float MinParam = 正規化の下限値( この値以下が 0.0f になる ),
float MaxParam = 正規化の上限値( この値以上が 1.0f になる ),
float ClipParam = 閾値( この値未満が 0.0f になる ) ) ;
// DX_MATERIAL_TYPE_MAT_SPEC_POWER_CMP_GREATEREQUAL の場合
int MV1SetMaterialTypeParam( int MHandle, int MaterialIndex,
float CmpParam = 比較値( この値以上の場合は 1.0f が、未満の場合は 0.0f が書き込まれる ) ) ;
よろしければお試しください m(_ _)m
 |
Re: マテリアルのパラメータのみを描画する機能 ( No.17 ) |
- 名前:ペッパー 日時:2017/04/15 11:54
ご返信遅れて申し訳ありません...m(_ _)m
早速試させて頂きます。
|