Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@YukiMiyatake

UNITYでOutlineシェーダ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?