티스토리 뷰

//테크니컬 아티스트를 위한 유니티 쉐이더 스타트업 발췌

Properties{
_Color("Color", Color) = (1,1,1,1)
_Size("Out Line Size", float) = 1
}
SubShader{
	Tags { "RenderType" = "Opaque" }
	LOD 200

	//cull은 '배제'를 의미한다. front를 배제하여 렌더링 하지 않았으니 그릴 것은 면의 뒷면일 뿐이다.
	//그러니까 면을 뒤집는 것과 같다. (= flip)
	cull front

	//여기서 부터가 면을 뒤집고 버텍스를 이동시키는 첫번째 Pass
	CGPROGRAM
	#pragma surface surf _Outline vertex:vert noshadow noambient
	#pragma target 3.0

	//OutLine의 두께를 조절하기 위해 float 값 하나를 받아왔다.
	//정확히는 버텍스를 각 노말 방향으로 _Size 만큼 이동시켜서 그리는 것이다.
	//주의할 것은 _Size = 1 이 1m를 의미한다.
	//적당히 조절하자.
	float _Size;

//버텍스를 조작하는 함수
void vert(inout appdata_full v) {
	//_Size 1당 0.01을 곱해주어 1cm로 이동하게 해준다.
	v.vertex.xyz += v.normal.xyz*.01*_Size;
}

//아무 값도 받아오지 않으면 오류가 생기기에...
struct Input {
	float4 color:COLOR;
};

//OutLine 컬러를 설정하는데 사용한다.
float4 _Color;

//딱히 역할이 없다.
void surf(Input IN, inout SurfaceOutput o) {
}

fixed4 Lighting_Outline(SurfaceOutput s, float3 lightDir, float atten) {
	return _Color;
}
ENDCG

 

+

외곽선 안쪽으로 그리고 싶은 Pass를 작성해 주면 끝이다.

대신 뒤집었던 면은 원래대로 만들어 줘야하기 때문에

두번째 CGPROGRAM을 작성하기 전에

cull back을 작성해주자.


void vert(appdata_full v)는 처음 보는 것인데,

#pragma에서 vertex 쉐이더를 vert라는 이름으로 사용한다는 것을 알려주기 위해

vertex:vert라고 적어주는 것이다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함