お世話になっております。
Unityでunlitなシェーダを書いてます。
Unlitなシェーダを書いて影を落とす時複数パスに分けて、影を書くシェーダと影を落とすオブジェクト自体への色処理と書きました。
これ自体は上手く行ったのですが、vertexシェーダの記述が、結局同じ変形頂点を相手にする事になり、同じ頂点処理を2パスに記載して無駄にみえます。
聞きたいのは頂点処理の結果を後続の複数パスに渡す方法はありますでしょうか?
当方シェーダ作成自体初心者なので、的外れな質問をしてるかもしれません。良かったらその事もご指摘頂けると幸いです。
宜しくお願い致します
現在のシェーダーコードをご提示いただけますでしょうか?
もし、同じコードを複数箇所に書かなければならないのがご不満でしたら、共通部分を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で使うのは難しい(もしかして不可能?)ようですし、あるいはコンピュートシェーダーやらを駆使して頂点変換再利用を実現するというのもちょっと大げさな気がします。
思うに、頂点変換部分でよっぽど複雑な計算をしているのでなければ、多少の無駄な計算の発生は見逃して妥協してもさほど問題はないんじゃないでしょうか。
Bongo様
おせわになります。
上記件ですが、シェーダの頂点処理部分の持ち出しの許可が得られませんでした。
当方全体的にシェーダの知識ご乏しく、可能性と常識を求める。と言う事で投稿させて頂きました。
言葉での情報付加になりますが、
DX9位の機能で、シェーダを自作し、モディファイアした頂点に影を落とせと言うのが、課題に成っております。
surfaceシェーダを使いたかったのですが、モディファイアした頂点の影投影に関してfallbackしたdiffuseが元の頂点に関してのみ影投影するためやむを得ずunlitを自作する方向に成りました。
コンピュートシェーダに関してはプラットホームが要求されますので、今回の試みだと除外しています。
思想的に、マルチパスと言うのは並列実行前提で、余程の事が無い限り相互のやり取りは寧ろ無駄なのでは?と思ってました。
常識的に共通処理を記載するときの対処方があって見落としが無いかの確認を込めての投稿でした、bongo様のような専門の人が上記回答を下されば、そのような方法は無く、普通はそれぞれ処理させる。と報告する事が出来ます。
情報提供のほどどうもありがとうございました。一応上記のリンク全て回ってから結論を出します。
どうもありがとうございました。
回答1件
あなたの回答
tips
プレビュー