1225

Twitter:@dn0t_ GitHub:@ogrew

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

はじめに

Vol.1を読んで勉強になったので、引き続き暇な時間にVol.2を読みました。 taiga.hatenadiary.com あ、Boothのリンクも貼っておきますね。 xjine.booth.pm

学んだことのメモ(章ごと)

1.スクリプトからシェーダの値を設定する

  • Materialに対してだったりShaderに対してだったり、値をセットできる
  • 同じマテリアルでもパラメータを変えたい場合はRendererに対しても値をセットできる
  • ただし、Renderer.Materialでマテリアルをセットするとマテリアルのインスタンスがその分生成されてしまう=>何が問題?ー>オブジェクトを破棄してもマテリアルのインスタンスは破棄されずメモリリークする(下のURL参考)
  • それを解決するのがRenderer.SetPropertyBlock。Renderer毎にPropertyを制御できる light11.hatenadiary.com

2. 複数のSubShader と LOD / Fallback

  • LOD(Level of Detail)を使えば環境に応じてSubShaderを使い分けることができる
  • 一番最後にFallbackを宣言すると、どのSubShaderも実行されない(できない)場合に使われる
  • つまり、そいつはいかなるケースも拾えるようなものを宣言しておいたほうが良い

3. 複数のPassを使ったオブジェクトの描画

  • 複数のPassが定義されている場合は上から順に出力され、その結果がBlendingされる
  • 以前のPassの描画結果を参照したい場合や、複数光源にてられる場合などに有効

4. ColorMask によるカラーチャネルの出力制限

  • 3の続き。Passから出力するチャネルの値を制限できる

5. 複数のPassとColorMaskによる完全な透過

  • 塗りつぶすような半透明シェーダを書く場合、Passを連結させて1stのPassではZ Bufferの書き込みだけしてどこを描画するか(重なる範囲は無視する)を決めて2ndのPassで後ろのポリゴンは描画されないので塗りつぶすことができる(みたいな)

※複数Passが使える1つの例って感じ。

6. ライブラリによる関数や構造体の共通化

  • 複数Passを連結させるなどの場合、同じ関数や構造体を繰り返すのを省略するためにライブラリファイルを作って#include XXX.cgincする方法がある

7. シェーダバリアントによる複数シェーダの生成

8. MipMapの効果と仕組み

  • あるテクスチャに対して、元の解像度よりも低い解像度のテクスチャを複数用意しておく機能
  • ピクチャ<-ピクセル(Pixel)、テクスチャ<-テクセル(Texel)
  • ピクセルの大きさで拾えないテクセルの変化がジャギーやモアレを生む
  • ここでMipMapが登場!あらかじめ低解像度でアンチエイリアシング処理が施されているテクスチャを代替
  • 元解像度テクスチャをMip Level 0とするとき、その半分の解像度のMipMapテクスチャはMip Level 1
  • Mip LevelはSceneViewでMipmapsを見れば簡単にわかる

さいごに

結構速いペースで読んでいるけど、構成がしっかりしているのですごい読みやすいし、Githubのサンプルレポをローカルに落としてちまちまいじりながら進めていけるのでただ読むよりは確実に身についている!ということで今度はVol.3です。全部読んだらPhong shadingをイチから書いてみようと思う。よーし、頑張ろう。