LoginSignup
38
35

More than 5 years have passed since last update.

Unity Shaderことはじめ1 Shaderの追加と基本書式

Posted at

はじめに

好きな絵作りをするためにシェーダを書く必要が出てきたので勉強したときのメモ

Unityはシェーダを書いてすぐ確認できるのでUnityで勉強することにしたが、
Unityドキュメントで書式を把握するのは結構大変。

書式を気にせずサクッといじりたいのであればUnreal Engineのブループリントエディタで書くほうが楽な気もする。

シェーダの追加

追加は簡単で、Assetフォルダで右クリックすればShaderを追加できる。
けどいきなり4種類も出てきて何がなんだか初めてのときはさっぱりわからん。

  • Standard Surface Shader
  • Unlit Shader
  • Image Effect Shader
  • Compute Shader

とあるが、上から順番にざっくりと

  • Unity標準の物理ベースシェーディングの一部をいじるシェーダー
  • 自力で全部書くシェーダー
  • ポストエフェクトシェーダー
  • コンピュートシェーダー

って感じ。

SurfaceShaderは面倒なライティングとかUnityが用意してくれるので楽チン。
UnlitShaderは全部自前でやるので面倒だけど好きに絵作りできる。
あと二つは名前の通り。

ちなみに別物シェーダーが生成されるのではなく書式テンプレが変わるだけなので、
Surface Shader生成したあとUnlit Shader書式に直せばUnlitで動く。

SurfaceShaderはUnityがコンパイルしていろいろやってくれるので
Unlitで使うPass{...}が使えなかったりするので注意。

自作シェーダーの適用方法

マテリアルを生成して自作シェーダーをD&D等で指定すればよい。
Assetフォルダにマテリアルを置いたり、スクリプト上で実行時にマテリアルを生成してシェーダを割り当てたりする。
後者はImage Effect Shaderでよく使う割り当て方。

参考になるもの

基本だけどUnity > Standard Assetsにあるシェーダーが一番確実な資料。
Unlit > TextureとかImage Effect > Blurとか見てみるとよい。

ざっくりとしたシェーダー構成

Shader "グループ名/シェーダー名" {
  //Inspectorと連携する入力パラメータ
    Properties {
        //入力テクスチャ 場合によっては自動割り当て
        _MainTex ("Texture", 2D) = "white" { }
        // other properties like colors or vectors go here as well
        //色
        _Color ("Color", Color) = (1,1,1,1)
        //小数値
        _Value ("Value", Float) = 1.0
    }
    //シェーダー実装1
    SubShader {
        CGINCLUDE
        //この間にパス共通設定記述
        ENDCG

        //頂点シェーダー等記述。書式はsurfaceやunlitで違う
    }
    //シェーダー実装2 実装1が使えないときはこっちが使われる
    SubShader {
    }
}

Shaderの座標系

頂点シェーダー

頂点単位で処理される。
頂点情報はローカル座標系で渡されるのでMVP変換してビューポート座標系に変換して返す。

サーフェイスシェーダー

フラグメントシェーダー

頂点情報で決定された描画ピクセル毎に処理される。
ウィンドウ座標系な値を取得することもできるが、
基本的に頂点シェーダーで計算した法線やuv値の補間値を使うことになる。

Shaderのパス

パス1で黒塗りして、パス2で本書きとパスで複数回描画指定ができる。
1シェーダーに複数機能をもたせたいときは多パス記述しておいて、スクリプトで描画のときどのパスを使うか指定したりする。

モデルに黒縁をつける絵作りでは

  • Pass1 頂点を法線方向に膨らませて裏面黒塗り
  • Pass2 通常描画

という2パス描画が簡単な方法として使われる。

SurfaceShaderの複数パス

SubShader内に複数描画処理(パス)を書く際はCGPROGRAM〜ENDCGで囲む

SubShader{
//1パス目
CGPROGRAM
...
ENDCG
//2パス目
CGPROGRAM
...
ENDCG

UnlitShaderの複数パス

SubShader内に複数描画処理(パス)を書く際はPass{...}で囲む

SubShader{
//1パス目
Pass {
CGPROGRAM
...
ENDCG
}
//2パス目
Pass {
CGPROGRAM
...
ENDCG
}

38
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
35