1225

Twitter:@dn0t_ GitHub:@ogrew

【Unity】Unity Shader Programming Vol.01読んだ。

はじめに

仕事でShaderLabのことを調べていると各所で紹介されているシリーズ本、のその1冊目を読み終わった。 booth.pm というのもちょうど今、コロナの影響などでvol.3がセール中だったので積読を1冊増やす代わりにちゃんと読もう、となったわけです。 一通り読み終わって、これまでパンの耳ほどの知識量でいきあたりばったり書いていたUnityのシェーダー(=ShaderLab)に関する基礎的な知識をある程度、まとまったものに整理することができたと思う、たぶん。 この記事はあくまで読んだ自分のメモを残しておくイメージですので、気になる人はちゃんと買うか、他の紹介サイトとか見てください。

すぐ忘れそうなところメモ

  • ShaderLabにはVector型はない(未だにC#の流れで書き間違える)
  • appdata = application data (アプリケーションからシェーダに渡されたデータ)
  • float 4 vertex : POSITION のPOSITIONをセマンティクスと呼ぶ
  • セマンティクスはレンダリングパイプラインが「どれをポジションデータとして、あるいはカラーデータとして扱えばいいのか」わからなくなってしまうのを防ぐため
  • SV_POSITIONは別にPOSITIONにしても動く
  • というのもv2fの構造体は自由に変えられる
  • そこにPOSITIONが入ったとしてもレンダリングパイプラインが必須なものか(任意のものなのか)判別できるようにするためSV_(=System Value)が頭についている
  • 同様にSV_Targetがfragment shaderの出力先に設定されている
  • _MainText_STはTRANSFORM_TEXの中で参照される。そしてこいつはfloat4型(TRANSFORM_TEXは別途中身をちゃんと見たほうが良さそう)
  • TRANSFORM_TEXによってテクスチャのOffset, Tilingが操作できる(TRANSFORM_TEXは別途中身をry...
  • Cullingはポリゴンの裏表を見て描画するかしないかを決める処理
  • 同じZ値をもつポリゴン同士が重なった画素はちらつく(Z Fighting っていうらしい、かっこいい)
  • それを防ぐのがOffset構文(使ったことない、難しそう)
  • Queue タグ=値が小さいほどレンダリングが先にされる(デフォルトの値は"Geometry"=2000、インスペクタ上では"From Shader"が既定)
  • RenderType タグ=詳しくは記述なし、半透明のオブジェクトのときはTransparentを設定しておけばおk
  • 一部分が透明なテクスチャなどを使うときにはfragment shaderの処理の後(Blendingの前)にAlphaTestを行う
  • AlphaTestはZTest同様ShaderLabの機能として残ってはいる(=AlphaTest構文)
  • Queue タグにも"AlphaTest"=2450 がある => "Geometry"=2000よりも大きいので後にレンダリングされる
  • AlphaTestをfragment shader内でかんたんにやる方法に discard 構文がある、これはそのピクセルの描画結果を破棄するものである
  • discard 構文と似たようなやつに clip 構文がある
  • ただし、discard, clip構文をそのまま使うと等価な部分と等価でない部分の境界でジャギる=AlphaToMask On にするとその境界線がアンチエイリアシングされる

終わりに

ただメモを起こしただけ。引き続きVol2を読むぞ。