読者です 読者をやめる 読者になる 読者になる

Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

ShaderLabの基礎:SubshaderとColor, Material, Lightingを理解する

1つのShaderには複数のSubshaderを記述できる。Unityは上からSubshaderを見ていき、現在のマシン(GraphicCard)に適用できるシェーダがあれば、それを適用する。

1つのSubshaderの中には、1つ以上のレンダリングパス(Pass)を指定できる。また、オプションとして特定のタグ(Tag)を指定できる。

レンダリングパスには - Regular Pass (Pass) - Use Pass (UsePass) - Grab Pass (GrapPass) の3種類がある。

次の例は、シングルパスで、ライトを消し、_MainTexというテクスチャを設定してメッシュを表示するもの。

// ...
SubShader {
    Pass {
        Lighting Off
        SetTexture [_MainTex] {}
    }
}
// ...

Passは Pass {[Name and Tags\] [RenderSetup\] [TextureSetup] } という構造になる。

Name and Tagsは、Passの名前と、複数の任意のタグを指定するもの。

  1. レンダリング設定

パスの中にはレンダリングに関するさまざまな設定を記述する。レンダリング設定には次のブロックがある。

  • Material 下のMaterialブロックを参照
  • Lighting: Materialブロックの設定を有効にするには、LightingをOnにする必要あり。
  • Cull
  • ZTest
  • ZWrite
  • Fog
  • AlphaTest
  • Blend
  • Color
  • ColorMask
  • Offset
  • SeparateSpecular: テクスチャリングの後にスペキュラを設定するか?
  • ColorMaterial: Materialの設定カラーではなく、Per-vertexカラーを使う。AmbientAndDiffuseとEmissionの2つがある。

f:id:yasuda0404:20150214190647p:plain

レンダリングパスの最初は、Vertex ColoringとLighting。ここではColor、Material、Lightingが関係する。

Materialブロックには次の設定がある。

  • Diffuse color:オブジェクトの基本色

  • Ambient color: アンビエントライトの色

  • Specular color:スペキュラの色

  • Shininess number:スペキュラの集中度。0(全体に拡散)~1(一点に集中)

  • Emission color: オブジェクトの発光色。ライトの影響を受けない。

サンプル

Shader "VertexLit" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
}

※SetTextureについては、ShaderLab:Texture Cobiners、または、ShaderLabの基礎:Texture Combinersを理解するを参照のこと。