Unity シェーダー 頂点カラー

Unity シェーダーチュートリアル  頂点カラーの活用方法

シェーダー

今回は何かと便利な頂点カラーの活用方法についてです。

うまく使えば楽に色々な表現が出来る様になります。

 

 取得方法

まずは簡単なコードで頂点カラーの取得方法を確認しましょう。

 

 

入力構造体で COLOR の指定をすれば頂点カラーが渡ってきます。

重要なのは : COLOR の方です。変数名は color である必要はありません。何でも良いです。

それを Surface 関数内で IN.変数名で取得するだけです。簡単ですね。

 

DCC ツールでボックスに赤い頂点カラーを設定して Unity にインポートしています。

上記の例では RGB 値をそのままアルベドにつなげているので、下図のような結果になります。

Unity シェーダー 頂点カラー

 

 頂点カラーを利用するメリット

 UV展開の必要が無い

まず思い当たるメリットはここですね。何といってもラク。

有機的なモノだったり、複雑な機械の UV 展開・・・

考えただけでも気が重くなります。メンドクサイのです。

 

 すべてのオブジェクトで個々の値を持てる

頂点に情報を持たせるので当たり前の事ですが、これはパフォーマンス・表現的にかなりのメリットです。

 

複数のオブジェクトで違う色を表示したい場合、マテリアルカラーやテクスチャだと、

それぞれに別のマテリアルを当てる必要があり、スタティックバッチの対象外になってしまいます。

マテリアルがどんどん増えていくのも何か嫌です。

(GPU Instancing を使った場合は別)

 

ですが、頂点カラーの場合は同一のマテリアルで良いので、

スタティックバッチを効かせることができます。

 

 リアルタイムに変更できる

これはメリットと言うほどでもないかもしれませんが、

エディター上でもプレイ中でもスクリプトから変更できるので、

何らかの表現的なトリックの為に便利なツールにもなり得ます。

 

 活用方法

上記のメリットを踏まえた上で、取得した頂点カラーをどのように使うことができるのか、

例をあげていくつか紹介していこうと思います。

 

 色として使う

まずは単純に色として使うのが一番オーソドックスですね。

上記のコードが正にそれです。取得した頂点カラーをそのままアルベドに突っ込めば

オブジェクトの色として表現できます。

 

 アンビエントオクルージョンとして使う

色ではなく数値として使うのも便利です。

"頂点カラー"と言ってますが、つまりは数値のパラメーターが4つあるという事です。(RGBA)

色としてしか使えないわけではありません。

 

下図のような複雑な機械形状にアンビエントオクルージョンを効かせたい場合は、

頂点カラーに焼き付けるのが一番手っ取り早いです。

そして、シェーダー側でオクルージョンの強さをコントロールできるようにすれば、調整もし易いですね。

(左が Vertex Color AO 無し、右が有り)

Unity シェーダー 頂点カラー

 

 

今回の場合は0~1のパラメーターが1つだけあれば十分なので、

入力構造体で頂点カラーを取得する際に fixed にしています。

これでRチャンネルのみを取得できます。

fixed2 で RG、fixed3 で RGB、fixed4 で RGBA チャンネルを取得できます。

 

0~1で強度をコントロールできるようにしたい場合は、lerp 関数を使います。


lerp(線形補完値が0の時の値, 線形補完値が1のときの値, 線形補完値)

 

 色ムラの表現に使う

遠景に並んでいるビルボードの樹木に明るさのムラを付けたい場合、

マテリアルを増やしてバリエーションを作るよりも、

スクリプトで頂点カラーをランダムに設定した方が作業効率もパフォーマンスも良いです。

Unity シェーダー 頂点カラー

 

 

 マスクとして使う

頂点カラーを lerp 関数の線形補完値として利用すれば、マスキングの効果が得られます。

最もシンプルな色のブレンディングをやってみます。右下の図が頂点カラーの設定状況です。

Unity シェーダー 頂点カラー

 

 

 おわりに

紹介した活用例はいづれもシンプルなものですが、

頂点カラーをうまく利用すれば手間をかけずに様々な表現が可能になるので、是非使ってみてください。

Show Comments0

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)