質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

544閲覧

Vertex シェーダの頂点結果の複数パスでの利用について

Szkk

総合スコア12

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/12/28 15:12

お世話になっております。
Unityでunlitなシェーダを書いてます。
Unlitなシェーダを書いて影を落とす時複数パスに分けて、影を書くシェーダと影を落とすオブジェクト自体への色処理と書きました。
これ自体は上手く行ったのですが、vertexシェーダの記述が、結局同じ変形頂点を相手にする事になり、同じ頂点処理を2パスに記載して無駄にみえます。

聞きたいのは頂点処理の結果を後続の複数パスに渡す方法はありますでしょうか?

当方シェーダ作成自体初心者なので、的外れな質問をしてるかもしれません。良かったらその事もご指摘頂けると幸いです。
宜しくお願い致します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2018/12/28 20:23

現在のシェーダーコードをご提示いただけますでしょうか? もし、同じコードを複数箇所に書かなければならないのがご不満でしたら、共通部分をCGINCLUDEブロック(参考: http://edom18.hateblo.jp/entry/2016/11/08/175433 )やcgincファイル(参考: https://qiita.com/r-ngtm/items/985f7c6fca915811455a )に分離して使い回すことができるかもしれません。 ただし、上記のような共通化を行っても、結局実際のシェーダーの動作時には両方のパスでそれぞれ頂点変換処理を行うことになるでしょう。 頂点変換の結果を再利用するといいますと、Transform Feedback (参考: https://wgld.org/d/webgl2/w014.html )とかStream-Output (参考: https://msdn.microsoft.com/ja-jp/library/ee415710(v=vs.85).aspx )が思い当たりますが、どうやらこれらの機能をUnityで使うのは難しい(もしかして不可能?)ようですし、あるいはコンピュートシェーダーやらを駆使して頂点変換再利用を実現するというのもちょっと大げさな気がします。 思うに、頂点変換部分でよっぽど複雑な計算をしているのでなければ、多少の無駄な計算の発生は見逃して妥協してもさほど問題はないんじゃないでしょうか。
Szkk

2018/12/29 04:25

Bongo様 おせわになります。 上記件ですが、シェーダの頂点処理部分の持ち出しの許可が得られませんでした。 当方全体的にシェーダの知識ご乏しく、可能性と常識を求める。と言う事で投稿させて頂きました。 言葉での情報付加になりますが、 DX9位の機能で、シェーダを自作し、モディファイアした頂点に影を落とせと言うのが、課題に成っております。 surfaceシェーダを使いたかったのですが、モディファイアした頂点の影投影に関してfallbackしたdiffuseが元の頂点に関してのみ影投影するためやむを得ずunlitを自作する方向に成りました。 コンピュートシェーダに関してはプラットホームが要求されますので、今回の試みだと除外しています。 思想的に、マルチパスと言うのは並列実行前提で、余程の事が無い限り相互のやり取りは寧ろ無駄なのでは?と思ってました。 常識的に共通処理を記載するときの対処方があって見落としが無いかの確認を込めての投稿でした、bongo様のような専門の人が上記回答を下されば、そのような方法は無く、普通はそれぞれ処理させる。と報告する事が出来ます。 情報提供のほどどうもありがとうございました。一応上記のリンク全て回ってから結論を出します。 どうもありがとうございました。
guest

回答1

0

ベストアンサー

もしかして影用のパスとおっしゃるのは、Unity のレンダリングパイプライン - Unity マニュアルなどで言及されている「ShadowCasterパス」のことでしょうか?

そうでしたら、実際のシェーダーの動作時にはShadowCasterパスと色処理パスの両方でそれぞれ頂点変換処理が行われる方が自然だと思います。
つまり、ShadowCasterパスでは光源の位置から見える景色、色処理パスではカメラの位置から見える景色をレンダリングすることになるはずで、両者の最終的な頂点変換結果は異なっており、結果の再利用はできないと考えられます(影 - Unity マニュアルの「シャドウのしくみ」に解説図がありました)。

計算結果の再利用ではなくてコードの再利用でしたら、そちらはぜひ行った方がスマートなシェーダーコードになると思います。頂点をずらす部分に変更を加えたくなっても、修正箇所が1つで済んでミスを起こしにくくなりそうですね。
コードの再利用に関しては、追記依頼欄で申し上げたCGINCLUDEブロックやcgincファイルの方を重点的にお調べいただくのが有効かと思います。

投稿2018/12/29 05:17

編集2018/12/29 05:29
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問