memo(shader) - TejimaTuyoshi/returnread GitHub Wiki
CPU => すべてのコンピューター処理を行うことが可能。
基本的に並行して動作することが不可能(コアの数によって可能数が変動)。
GPU => 小さなコンポーネントを同時にこなせる。
グラフィック回りに使用されるのが基本。
デザイン周りの処理が近代に近づくにつれ「同時に処理しなければならない」数が増え、
最終的に「多くの数を同時に処理できる機能」としてGPUが作成された。
ただし、最近はこの二つが両方焼き付けられてスマホのような小型機械にも搭載されている。
固定パイプラインシェーダー(組み込みシェーダー):CPUないしGPUに「あらかじめ焼きこむ」ことで、自動的に影を作成し不必要な影を削除する方法。PS1で使用されていた。
プログラマブルシェーダー:ノーマルマップを地形に張ることで、よりリアルな影の移動を作成することが可能。光源によっての影が繊細に変わるように。
また、光の彩度や輝度などを編集できるように。ここら辺から計算が必要になってくる。
レイトレーシング:反射する際の領域や角度などをよりリアルにすることで、鏡や水などの反射に不自然さはなくなってくる。
ただし、粒子としての部分がぬぐい切れないので光の彩度が強すぎるかもしれない。
シェーダーでは、「影 = 光」がカメラで実感するようになる。
陰には二種類ある。(作成時に光源によってそのオブジェクトに作成される影と、光が遮断されその下や横などに光が入らず影となって表示されているもの。)
カメラのタイプをOrthographicにしないと影が見える視点となってしまうため、作成しずらい。
オブジェクトをstaticにしないと、影が生成されない。
マップの情報はScene内に別のファイルとして作成されている。
なお、リアルタイムに戻したいならそのファイルを丸ごと消す必要があるため注意。
影が作られる際にSettingのUSP-HighFidelityで設定を変える必要がある。
ここではLighting内での影の仕様を変化させることが可能になる。
他にも、光の数を制限させることができ、それ以上の数になると光が処理されなくなる。
影をどれほど映すかを数値で変化させることができる。これにより、距離によって影の映る大きさが変わったりするなど。
シャドーカスケード機能:近ければ近いほどより鮮明に影を映すように作成。
色の変化については詳細設定から弄るほかない。
ガンマ空間:ガンマ補正済みの色データ:sRGBカラーをそのまま使用して計算(軽量なゲームに適しているが、リアルな表現には不向き。)
リニア空間:ガンマ補正済みのsRGBカラーをデガンマ補正して線形空間に変換した後、線形空間で色やライティングの計算(物理的に正しい光の挙動を再現可能だが、めっさ重い。)
シェーダーコード内でHLSLファイルを見つける必要がある。
Unityのバージョンによって異なるが、基本的に新しい方を選択すればよい。
・・・これ中身ほぼCPPに近いな?(当たり前、それが元だもの。)
作成時にファイルを確認。...めっちゃ古い書き方で書かれているため既存のHLSLは読める・・・のか?
バーテックスシェーダー:頂点を弄って調整する。(頂点シェーダー)
ピクセルシェーダー:面に存在するピクセル単位の点を調整する。(フラグメントシェーダー)
プロパティ:作成する際にパラメータ上に出すもの。
何段階にも分けてコンパイルするため、調整が大変。
インスペクター上で多少編集できるようにはできているものの、Unityのみ対応なのでほぼコード上。
サブシェーダー:パスがいくつも作成されており、それぞれのバッファーが機能している。
実は、やろうと思えばこの中身を把握することが可能。まぁHLSLを勉強しようね。
古い形ではあるが、稼働ははっきりしているためちゃんと動く。(バグ?知らない子だねぇ)
それぞれのメソッドがあり、その部分から動いている。
さっきの二種類のシェーダーは同時に使用することが可能なため、
それぞれな内部に書くことが可能。
バーテックス=>頂点系で計算して、UVに対して切り貼りしている。(イラストを切り取って貼り付けている。)
ピクセル=>テクスチャ―に対してフォグ(図形上になるように計算)とした形で一ドットずつ付けている。
シェーダーグラフ(ブループリント型)=設計図型のグラフ。バグが多めなのではっきり言って文句つけたい。意味ないけども。('・ω・`)
とりあえず設定に出ている部分は弄らなくてok
ただし、シェーダの種類を変更させるとピクセル(フラグメント)の方が変化する(入れる必要のあるパラメータが増減する)
存在しないチャンネル(素材や関数など)は無理やり別の部分で補って場合によっては取捨選択を迫られることもある。
サンプルされているものに間接的につないでからでないとシェーダーに突っ込むことは出来ない。(うんまぁ、どうなってるか把握できないと意味ないし・・・)
なお、先に言っておくが場合によってはグラフでもできない(バグ)によってコードを書くことが余儀なくされるので注意。
UVでのチャンネルは0と1は基本使うが、2と3はマヤで作成されたものでないと基本されない。
ほとんどUV1ではシャドーマップのみ使用するので基本は使わないかな・・・
計算時、オーバーフローした数値は0になるようになっている。
(ただし、古いとオーバーフローしないらしい。怖っ。)
positionを使うと、形を変形させることが可能。
波を作成する際、sineで作成した波を逆にする。その後、oneminusを使用し単位化したのち縦横を調整して波とする。