LoginSignup
6
5

More than 5 years have passed since last update.

UNITYでOutlineシェーダ

Last updated at Posted at 2018-10-24

UNITYのビルトインシェーダーのコードよめばいいよ!

アウトラインの描き方はいろいろあるけど、その中で最も簡単で実績があるものは
レンダリングの裏面のポリゴンをカリング反転させ 少し拡大し 黒色でレンダリング
すると、オブジェクトより少し大きいところに黒いラインができる

そのオーソドックスな手法

プロパティー

_OutlineWidth("Outline Width", Range(0.0002, 0.01)) = 0.001
_OutlineColor("Outline Color", Color) = (0.0, 0.0, 0.0, 1.0)

アウトラインの太さと色の設定をする

ヘッダ部分

Name "OUTLINE"

Lighting Off
Cull Front
ZWrite On
ColorMask RGB

CGPROGRAM

#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"


uniform float _OutlineWidth;
uniform float4 _OutlineColor;


struct appdata
{
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float2 texcoord   : TEXCOORD0;
};

struct v2f
{
    float4 pos : SV_POSITION;
    fixed4 outlineColor : COLOR;
};

特に変わったことはない。outlineColorを フラグメントシェーダにわたしているが、太さは渡してないのは気まぐれ
気にしないでほしい

コード部分

v2f vert(appdata v)
{
    v2f o;
    //UNITY_INITIALIZE_OUTPUT(v2f,o);
    float3 norm = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));
    float2 offset = TransformViewToProjection(norm.xy);


    o.pos = UnityObjectToClipPos(v.vertex);
    o.pos.xy += offset  * _OutlineWidth;

    o.outlineColor = _OutlineColor;
    return o;
}

fixed4 frag(v2f i) : SV_Target
{
    return i.outlineColor;
}

法線方向にポジションを拡大すればいいのですが
法線はモデル座標系なので、View座標系にし、さらにProjection座標系にする
そこで法線方向に引き延ばす

説明すれば簡単な事なんだけど
いがいに Projection座標での法線を計算するのが面倒だけど
それらが 組み込まれているのは便利ですね

SnapCrab_NoName_2018-10-25_5-21-21_No-00.png

6
5
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
6
5