3Dモデルの表示について
OLIVEdes  2014/12/08(Mon) 16:28
OBJ形式のモデルを陰をつけずに表示させるにはどうしたらよいでしょうか?

添付した画像は空を表現するために、球を作り内側にテクスチャを張ったものを
表示させたのですが、ライティングの影響を受けて陰が表示されてしまいます。

モデル側のエミッシブカラーの設定が無視されているように見受けられるですが、仕様でしょうか?
シェーディングの設定で解決できると思ったのですが方法が分からないので質問させて頂きました。

よろしくお願いします。



記事編集
Reputeless  2014/12/08(Mon) 16:59
OBJ のマテリアル設定は描画に反映されません。

この場合、Graphics3D::SetLightForward(Light::None()) で Forward レンダラーのライティングを無効にし、
Graphics3D::SetAmbientLightForward() でエミッシブ値を指定したうえで
skyMesh.drawForward(skyTexture); すると
期待する結果になると思います。

Set○○Forward と drawForward() を使う Forward レンダラーは、
メッシュごとに異なるライティングやフォグの設定を適用できます。
編集
OLIVEdes  2014/12/09(Tue) 16:45
詳細な解説ありがとうございます。
ライティングについてはForward レンダラーを使うことで解決したのですが、
別の問題が起こってしまう様なので再び質問させていただきます。

天球モデルは地形モデルの大きさを考慮しなくても常に遠くにあるように描画
されるように、

Graphics3D::SetDepthStateForward(DepthState::None)で深度バッファへの書き込みを無効にし、
skyMesh.drawForward(skyTexture)で最初に天球をForward レンダラーで描画してから、
terrainMesh.draw(terrainTexture)で後からDeferredレンダラーで地形を描画すると
描画順が入れ替わり、天球が後から描画されたような結果となってしまいます。

地形もForward レンダラーを使えば期待する結果が得られるのですが、複数のライティングを使いたいので
Deferredレンダラーしか使えない状況です。

解決策がございましたら、教えて頂ければ幸いです。
編集
Reputeless  2014/12/11(Thu) 18:24
Graphics3D::SetDepthStateForward(DepthState::TestOnly); で
深度テストは有効にしつつ、深度の書き込みをオフにすれば順序の問題は発生しません。

Siv3D には farclip が存在しないので、skyMesh を非常に遠くに描画する方法でも OK です。
地形と空の描画についてサンプルを掲載しました。
http://play-siv3d.hateblo.jp/entry/jp/example/terrain



編集
件名
Re: 3Dモデルの表示について
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -