トップページ > 記事閲覧
頂点バッファのレンダリング自己発光を行う方法
名前:こつんす 日時: 2023/01/18 04:51

VERTEX3D構造体配列から生成した頂点バッファを、 DrawPolygonIndexed3D_UseVertexBuffer関数でレンダリングしているのですが、 エミッシブカラー(自己発光色)指定による自己発光を行う方法はありますでしょうか? VERTEX3D構造体(およびVERTEX3DSHADER構造体)を参照する限り、 エミッシブカラーを指定するメンバ変数が見当たらなかったのですが、 MV1DrawModel関数で描画されるモデルの自己発光が再現できているのは、 それ用のシェーダーが内部で用意されているということなのでしょうか? ※やりたいことのイメージ  自動生成したダンジョンを頂点バッファで描画しているのですが、  ダンジョン内に複数設置された松明で壁が照らされているような表現を、  壁の頂点に指定されたエミッシブカラーで再現できるのでは?と考えて、  頂点バッファのエミッシブカラーに注目しました。
メンテ

Page: 1 |

Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.1 )
名前:管理人 日時:2023/01/19 00:28

エミッシブカラーはマテリアルでのみ指定できるもので、頂点カラーでは ディフューズカラーとスペキュラカラーのみ指定できます DrawPolygonIndexed3D_UseVertexBuffer の実行時に適用されるマテリアルは SetMaterialParam 関数で設定することが出来ますので、よろしければ試してみてください <SetMaterialParam> dxlib.xsrv.jp/function/dxfunc_3d_draw.html#R14N11
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.2 )
名前:こつんす 日時:2023/01/19 05:28

管理人様、ご返信ありがとうございます。 >エミッシブカラーはマテリアルでのみ指定できるもので、頂点カラーでは >ディフューズカラーとスペキュラカラーのみ指定できます  承知いたしました。  仕組みをまだ理解しきれておらず、お手数をおかけいたしました。 >DrawPolygonIndexed3D_UseVertexBuffer の実行時に適用されるマテリアルは >SetMaterialParam 関数で設定することが出来ますので、よろしければ試してみてください  SetMaterialParam関数のエミッションを利用する方法ですが、  こちらは頂点バッファの全ての頂点に対して同じエミッションが適用されると思うのですが、  今回の実装では頂点ごとに明るさを指定したいと考えており、  そのまま採用するのは難しいと感じました。 下記のような実装を行う際に、 「がんばればこんな感じでできるよ」(もしくは、無理だよor思いつかないよ) などのご助言ありましたら頂けると助かります。 【やりたいこと】  モデル:自動生成された頂点バッファの地形  ライト:@ディレクショナル + ポイント + シャドウマップ      A100個程のポイントライト(★これが難題。。)  ※マインクラフトで松明を大量に置いた時のようなイメージです 【解決案】  上記Aのポイントライトの計算を事前に行い、  頂点バッファの各頂点にCOLOR_U8で持たせておく(B)。  シェーダーでBと@を加算することで、  簡易的なライティングのベイクが行えるのでは?と思いました。  これにより、@のライトが一切届いていない(0.0f)地形でも、  Aのポイントライトで明るく表示できるのではと考えた次第です。
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.3 )
名前:こつんす 日時:2023/01/19 16:50

追記です。 色々考えてみましたが、自前でシェーダーを用意すれば、 補助テクスチャ座標(su、sv)のパラメータで疑似的に再現できるのではと思いましたので、 この方法で試行錯誤してみたいと思います。 ※シェーダーの概要  suが輝度、svが色をを表した疑似ライト用のテクスチャを用意し、  前述@のライティング計算結果に対して、  su、svの疑似ライトのカラーを加算するといった方法です。
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.4 )
名前:管理人 日時:2023/01/20 22:16

なるほど一部分だけを光らせるのですね、確かにその場合はマテリアルでは実現出来ないですね… > 色々考えてみましたが、自前でシェーダーを用意すれば、 > 補助テクスチャ座標(su、sv)のパラメータで疑似的に再現できるのではと思いましたので、 > この方法で試行錯誤してみたいと思います。 はい、確かに su, sv はサブテクスチャを使用しない限り使われないデータなので 明るさ情報を格納するのには丁度良いと思います
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.5 )
名前:こつんす 日時:2023/01/23 17:02

管理人様、ご返信ありがとうございます。 あれからシェーダーを使った頂点バッファについて試行錯誤しておりますが、 情報があまり多くないようで、私の無理解も相まって悪戦苦闘しております。 下記スレッドにて管理人様が公開されているシェーダーを使い、 頂点バッファ&シェーダーの確認用プログラムを作成しているのですが、 どうも頂点バッファの表示が正しく行われない状況です。  シェーダーモデル5.0   ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4202   ※先頭のh抜き 確認プログラムの内容は、  @DrawSphere3D   …3D図形描画関係関数で球体を描画  AMV1DrawModel   …モデルを描画  BDrawPolygonIndexed3D_UseVertexBuffer   …モデルを頂点バッファで描画  CMV1DrawModel   …モデルをシェーダーを有効にして描画  DDrawPolygonIndexed3DToShader_UseVertexBuffer   …モデルを頂点バッファ&シェーダーありで描画 の5パターンの描画を行っているのですが、 頂点バッファを使用したB、Dの表示が他と違っており、 マテリアルなのか頂点バッファなのかシェーダーなのかライトなのか… 原因がわけわからなくなってしまっている状況です。 そこで、誠に勝手なお願いで大変恐縮なのですが、 下記にアップロードした軽量のテストプログラムをご確認いただき、 何かヒントを頂くことはできませんでしょうか? VisualStudio2019以降で即時実行できる状態のプロジェクトになっており、 中のREADME.htmlに概要を記載しております。  test.zip   ttps://81.gigafile.nu/0130-cafed9099a6e6674e93464d3eca1021fa   ※先頭のh抜き よろしくお願いいたします。
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.6 )
名前:管理人 日時:2023/01/24 01:37

Direct3D 11 のシェーダーの情報が少なくてすみません m(_ _;m Bが正常に描画されない原因については、本日の作業時間中では原因が分かりませんでした… 頂点カラーを代入している箇所に v[i].spc = GetColorU8( 0.0f, 0.0f, 0.0f, 0.0f ); を 追加してスペキュラカラーを無効化すれば白飛びはしなくなるということは分かったのですが… すみません、明日以降に調べますので数日ほどお時間をください m(_ _;m Dについても手元で正常に描画できるところまでは確かめられていませんが、原因の一つとしては NormalMesh_DirPointLightVS.fx に記載されている頂点データの定義が DrawPolygonIndexed3DToShader_UseVertexBuffer用のものとなっていない、という点があります DrawPolygonIndexed3DToShader_UseVertexBuffer 用の頂点データの定義は VERTEX3DSHADER構造体の 定義に合わせて以下のようにする必要があります // 頂点シェーダーの入力 struct VS_INPUT { float3 Position : POSITION0 ; // 座標( ローカル空間 ) float4 SubPosition : POSITION1 ; // 予備座標 float3 Normal : NORMAL0 ; // 法線( ローカル空間 ) float3 Tangent : TANGENT0 ; // 接線( ローカル空間 ) float3 Binormal : BINORMAL0 ; // 従法線( ローカル空間 ) float4 Diffuse : COLOR0 ; // ディフューズカラー float4 Specular : COLOR1 ; // スペキュラカラー float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 float2 TexCoords1 : TEXCOORD1 ; // サブテクスチャ座標 } ; よろしければ上記の定義に変更して試してみてください m(_ _)m ( 因みに上記の通り MV1DrawModel で使用する頂点の定義とは異なりますので、 DrawPolygonIndexed3DToShader_UseVertexBuffer で使用する頂点シェーダーは MV1DrawModel で使用する頂点シェーダーとは別のファイルとして用意して使用する必要があります ( NormalMesh_DirPointLightVS.fx, NormalMesh_DirPointLightVS.vso とは別の fxファイル、vsoファイルを作成して使用します ) )
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.7 )
名前:こつんす 日時:2023/01/24 07:37

管理人様、ご返信ありがとうございます。 お手数をおかけしてしまい恐縮です。 >Bが正常に描画されない原因については、本日の作業時間中では原因が分かりませんでした… >頂点カラーを代入している箇所に v[i].spc = GetColorU8( 0.0f, 0.0f, 0.0f, 0.0f ); を >追加してスペキュラカラーを無効化すれば白飛びはしなくなるということは分かったのですが… 私の手元でも確認いたしました。 スペキュラーカラーについて追加で調査いたしましたので、後半に記載いたします。 >Dについても手元で正常に描画できるところまでは確かめられていませんが、原因の一つとしては >NormalMesh_DirPointLightVS.fx に記載されている頂点データの定義が >DrawPolygonIndexed3DToShader_UseVertexBuffer用のものとなっていない、という点があります ご指摘いただいた内容で修正しましたところ、 「Bシェーダー無し頂点バッファ」と同じように描画されることを確認いたしました。 ■スペキュラーカラーの追加調査 1.元のモデル(saru.mv1)にはスペキュラー値が51(0.2f)として設定されておりましたので、   「@球体」のスペキュラー値を0→51に変更しましたところ、   「@球体」についても「Bシェーダー無し頂点バッファ」と同じような白飛びが発生いたしました。 2.「Dシェーダーあり頂点バッファ」についてですが、   SetMaterialUseVertSpcColorをTRUEにしてもFALSEにしても、   頂点ではなくSetMaterialParamのスペキュラー値が参照されているようです。 3.シェーダーの使用有無に関わらず、   「ACMV1DrawModel」ではスペキュラーが正しく反映されており、   「@球体」および「BD頂点バッファ」はいずれもスペキュラーで白飛びするようです。 4.「BD頂点バッファ」についてですが、   ライトのスペキュラー値の輝度を落として確認してみる限り、   フラットシェーディングのような光沢となっており、   「ACMV1DrawModel」はグーローシェーディングのような光沢になっている気がします。   いずれもシェーダーの有無に関わらず、MV1DrawModelと頂点バッファとの差異のようです。 ※確定した結論が出せておらず申し訳ございません。。 念のため、頂点バッファ用のシェーダーを追加(+諸々変更)したプロジェクトを 下記のURLにアップいたしました。  ttps://29.gigafile.nu/0131-d41aece6dc6fac7683f835f2a1925ec5e  ※先頭のh抜き シェーダーというより、MV1DrawModelと頂点バッファとの差異にヒントがあるような気がしてきました。 長々とお手数頂いており恐縮ですが、よろしくお願いいたします。
メンテ
Re: 頂点バッファのレンダリング自己発光を行う方法 ( No.8 )
名前:管理人 日時:2023/01/25 03:02

追加のご情報ありがとうございます 白飛びの原因は『マテリアルの Power の値が 0.0f になっている』でした MATERIALPARAM構造体の Power というパラメータの値が大きいほどスペキュラ発光が 鋭くなるのですが、値が 0.0f の場合は鋭さ0となり、モデルがスペキュラで光ってしまいます なので、saru.mv1 と同じ 25.0f を代入したところ m.Power = 25.0f; 白飛びの現象が直りました よろしければお試しください m(_ _)m > 2.「Dシェーダーあり頂点バッファ」についてですが、 >   SetMaterialUseVertSpcColorをTRUEにしてもFALSEにしても、 >   頂点ではなくSetMaterialParamのスペキュラー値が参照されているようです。 こちらのフラグを見て頂点カラーを使用するかマテリアルのスペキュラー値を使用するかを処理しているのは シェーダーなのですが、自前のシェーダー( NormalMesh_DirPointLight_vb_VS.fx )ではこちらの設定を 見ていないので、関数の設定に関係なくマテリアルのスペキュラー値が適用されることになります > 4.「BD頂点バッファ」についてですが、 >   ライトのスペキュラー値の輝度を落として確認してみる限り、 >   フラットシェーディングのような光沢となっており、 >   「ACMV1DrawModel」はグーローシェーディングのような光沢になっている気がします。 >   いずれもシェーダーの有無に関わらず、MV1DrawModelと頂点バッファとの差異のようです。 モデルビューアー( DxLibModelViewer.exe ) で saru.mv1 を読み込んでみてもフラットシェーディングのような 見た目となっていますので、単純に頂点の法線がフラットシェーディングのように見える法線となっているのではないかと思われます
メンテ

Page: 1 |

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

   クッキー保存