NinaLabo

個人ゲーム開発者の技術メモ

【memo3】フラグメントシェーダーで distance を使ってみる(Unity)

【今日のまとめ】Shader2Scene

・SV_TARGET は フラグメントシェーダーのセマンティクスの1つで、戻り値に色を返すことを意味している

・シェーダーでは距離を取得するのに distance という組み込み関数が使える

 

 

------------------------------------

Unity でゲームは作っていますが、Shader も 画像処理も初心者です。

アウトプットばかりだと腐っていくので、毎日1時間程度は自分の知らないことを少しずつインプットしていこうかと思ってます。

タイトルに【memo】とあるものはほぼ自分用の備忘録なので他の記事よりも殴り書きなのはご容赦ください。

------------------------------------

 

今日は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

 

ここで疑問が・・・

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

dには何が入ってくるの?関数の戻り値はfloat4なのにfloatで返していいの?前回忘れてたけど、SV_Targetって何?

 

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ぐらい。たぶん。

 

関数の戻り値はfloat4なのにfloatで返していいの?

調べて見たけどよくわからず。もう時間なので明日に持ち越し。

 

SV_Targetって何?

セマンティクスなるものらしい

qiita.com

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

ちなみに、SV_TARGET は ピクセルの色 だそう。わかりやすい記事でした。

 

Passブロックって何?

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

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

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

blog.applibot.co.jp