Help us understand the problem. What is going on with this article?

UNITYでOutlineシェーダ

More than 1 year has passed since last update.

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

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

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

https://github.com/YukiMiyatake/UnityLesson/tree/Outline_1

プロパティー

_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

YukiMiyatake
C++が喋れる ゲームプログラマ インフラ、サーバ、UNITY、ゲームエンジンが最近多いな・・ MONA: MPpuEnmqDYBCxSZyG5cBDt6UWtXczmRmkn BTC: 13JpgsF3n6K2WhjEeUuUUqS7V71gWdFx56 BCH: 18q6rfi9ynyTgynrB8tJ2eSDLPQM32RZk5
http://murasame-labo.hatenablog.com/
murasame
ゲーム、エンタメ、サーバインフラ等 少人数で技術力の高い仕事をする会社
http://murasame-lab.com/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした