이미지한장을 받는 스크립터를 먼저 만들고 시작한다.
기본 램버트를 받는 스크립터로
----
이번에는 CG를 두 번 렌더링 할 것이다.
이것을 Two Pass 라고한다.
기본적으로 밑에 이렇게 넣고 채우면 된다.
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
//2pass
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
---- 2pass 완성
위에랑 똑같이 채워 넣어주면 된다.
-----
1pass 에서 검정으로 채울 것이다.
렌더할때 뒷면은 안하게 되는데 명시적으로 적어 줄 수 있다.
이것을 cull back 이라고 한다.
태그 밑에 넣어주면 된다
Cull Back // Front // off 가 될 수도있다. // 프론트는 앞을 렌더 안함 오프는 둘다 안함
----
오브젝트 크기를 키울 수 도 있다.
쉐이더에서 버텍스를 조절 할 수 있다.
그 전까지는 우리는 픽셀을 가지고 놀았는데, 이번에느 버텍스를 가지고 해본다.
vertex:vert 와
void vert(inout appdata_full v){
}
를 추가해준다. 꼭 이름이 같아야한다.
appdata_full 에 들어가는 건
구조체가 들어간다.
float4 이기 때문에 (x,y,z,w) 의 값을 가진다. (vertex)
테스트할겸
v.vertex.xyz += v.vertex.xyz;
커진걸 확인 할 수 있다.
----
옵션중에는 noshadow라는 것도 있다 // 모든 그림자를 없애준다.
------
조금 늘어나게 해 줄 수 잇다.
v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;
----
1pass에서는 라이트가 필요없으니깐 _NoLight 옵션을 달아주고 라이트 를 달아준다.
그리고 서프 함수 안에 지워준다.
인풋은 비워두면 안되서 컬러를 받는다.
컬 프론트로 해준다.
이걸 해주는건 1pass는 검정색만 받는 걸로 하기 위해서임
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Cull Front
CGPROGRAM
#pragma surface surf _NoLight vertex:vert noshadow noambient
#pragma target 3.0
sampler2D _MainTex;
void vert(inout appdata_full v){
v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;
}
struct Input
{
float4 color: COLOR;
};
void surf (Input IN, inout SurfaceOutput o)
{
}
float4 Lighting_NoLight(SurfaceOutput s, float3 linghtDir, float atten){
return float4(0,0,0,1);
}
ENDCG
//2pass
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
-----
겉 선이 너무 두꺼우면
void vert(inout appdata_full v){
v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;
}
숫자를 조절해주면 된다.
프로퍼티에서 조절값을 받아서 해보자
------
문제는 Cull Front 한게 2 Pass에서도 적용되서
면이 뒤집어 져서 보인다. 그래서 2 Pass에서 Cull Back 해줘야한다.
2Pass 에서 CGPROGRAM 들어가기 전에
CULL BACK 해준다.
-----
'Unity > 그래픽스프로그래밍' 카테고리의 다른 글
0507 _ 툰쉐이더 _ 1pass로 음영 표시하기 (0) | 2021.05.07 |
---|---|
0507 _ 툰쉐이더 _ 음영을 계단식 -> 2pass 로 외곽 만들어준다. (0) | 2021.05.07 |
0507 _ Lim 라이트를 커스텀 라이트로 옮기기 (0) | 2021.05.07 |
0506_ Lambert에서 BlinnPhong 스펙큘러 만들기 (0) | 2021.05.06 |
0506_ 홀로그램 만들기 (0) | 2021.05.06 |