Unityシェーダーお絵描き入門 - 中心に向かって色を黒くする

今日はDistanceを使ったお絵描き!

docs.google.com

 

前回のfrag_testの中身をこういう感じに書き換えると

            float4 frag_test (v2f_img i) : SV_Target
            {
                float d = distance(float2(0.50.5), i.uv);
                return d;
            }

 

こうなる。

f:id:ninagreen:20180912190223p:plain

 

distanceは中心座標(0.5, 0.5)と引数で渡されたuv座標の距離を取得してると思われる。

 

dには何が入ってくるの?

dの値を直接見たいんだけど、そもそもシェーダーでコンソールでログ出力ってどうするの?

 

Unity フォーラムで質問してる人発見

https://forum.unity.com/threads/how-to-print-shaders-var-please.26052/

 

I guess that sfkdkjjj want to print value of variable inside vertex/pixel shader.

Usually in shaders You use colours or similar tricks to debbug your variables. It is not possible to see value directly.

You can use Pix to see exact values. But it will not be what you expect. This is not even close to usual debbuging.

え、待って、値を直接見ることは not possible !?まじかー

色とかを表示して、擬似的にデバッグするって、まじかー

 

色から推測すると、dは中心は黒(0)で、遠くなるほど値が大きくなって白(1)に近づいているってことだと思う。たぶん。各頂点は、a x a + b x b = c x c に当てはめると c = √(0.5x0.5 + 0.5x0.5) = 0.7ぐらい。たぶん。

 

 

SV_Targetって何?

メソッド名の隣にあるSV_Targetはセマンティクスなるものらしい

qiita.com

セマンティクスとは、シェーダープログラムの入力や出力の値が、何を意味するかを表すためのもの。型が、値の表現の幅(最大値は何か、実数か小数か、スカラーかベクトルか、…)を表すのに対して、セマンティクスは、値の用途(位置か、法線か、色か…)を表すイメージ

つまり同じfloat4を返すにしても位置なのか色なのか等を定義できるってことのよう。ちなみに、SV_TARGET は ピクセルの色 だそうです。

 

Passブロックって何?

前回、Passがいまいちわからなかったのですが、わかりやすい説明を見つけました。

Passは、オブジェクトのレンダリング処理を記述する部分です。

複数パスを定義することも可能で、その場合には複数回のレンダリング処理が走ることとなります。 

blog.applibot.co.jp