뇌졸중은 일반적으로 게임에서 객체를 강조, 효과의 매우 일반적인 종류의 게임의 효과이다. 쉐이더를 사용하는 다음과 같은 간단한 획 효과.
스트로크는 일반적으로 두 가지 방법으로 달성된다 : 하나의 정점의 법선 방향에서의 간격을 확장 모델이며, 그 깊이 마이그레이션을 사용하는 것이다.
먼저, 연장에 의해 법선
원리 : 제 만 전방을 제외한이면 렌더링 회 렌더링 모델은 꼭지점 법선 방향 거리, 뇌졸중의 표시 색을 확장
위로 컬링 제 2 묘화 만 긍정적 정상 렌더링.
Shader "Custom/Stroke"
{
Properties
{
_MainTex("main tex",2D) = ""{}
_Factor("factor",Range(0,0.1)) = 0.01 //描边粗细因子
_OutLineColor("outline color",Color) = (0,0,0,1)//描边颜色
}
SubShader
{
Pass
{
Cull Front //剔除前面
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 vertex :POSITION;
};
float _Factor;
half4 _OutLineColor;
v2f vert(appdata_full v)
{
v2f o;
//将顶点沿法线方向向外扩展一下
v.vertex.xyz += v.normal * _Factor;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
half4 frag(v2f v) :COLOR
{
//只显示描边的颜色
return _OutLineColor;
}
ENDCG
}
Pass
{
Cull Back //剔除后面
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 vertex :POSITION;
float4 uv:TEXCOORD0;
};
sampler2D _MainTex;
v2f vert(appdata_full v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
half4 frag(v2f v) :COLOR
{
half4 c = tex2D(_MainTex,v.uv);
return c;
}
ENDCG
}
}
FallBack "Diffuse"
}
둘째, 깊이 마이그레이션
원리 : 먼저 오프셋 명령, 심도있는 작업을 사용하여, 전면 만 다시 렌더링 제거, 두 번 렌더링합니다.
위로 컬링 제 2 묘화 만 긍정적 정상 렌더링.
오프셋 깊이 마이그레이션
계수, 단위 오프셋
팩터 : 주요 영향 우리는 다각형의 최대 깊이 기울기를 그릴
좌표계 창의 깊이 값의 가변 해상도의 차이는 주로 생성 될 수있는 최소의 값에 영향을 단위.
통용 명령 오프셋 라인에 일정한 값으로 단위는, 주요 기능 인자이다. 상기 Z 축 방향 팩터 조정은 계수가 0보다 큰 경우, 상기 오프셋 값은 상기 Z 축의 양의 방향으로 이동된다 로부터 멀리 화면. 계수는 0 미만이며, 상기 오프셋 값은 Z 축 방향을 따라 음수 가 화면에 가까이.
Shader "Custom/Stroke2" {
Properties
{
_MainTex("main tex",2D) = ""{}
_OutLineColor("outline color",Color) = (0,0,0,1) //描边颜色
}
/*
Offset:深度偏移
Offset Factor,Units
Factor参数表示 Z缩放的最大斜率的值。
Units参数表示可分辨的最小深度缓冲区的值。
*/
SubShader{
//描边
pass {
Cull Front //剔除正面
Offset -5,-1 //深度偏移
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
half4 _OutLineColor;
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag(v2f i) : COLOR{
return _OutLineColor;
}
ENDCG
}
//正常渲染物体
pass {
Cull Back //剔除背面
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
float4 frag(v2f i) : COLOR
{
float4 c = tex2D(_MainTex,i.uv);
return c;
}
ENDCG
}
}
FallBack "Diffuse"
}
렌더링 :