unity surface shader for artist 03

23
03. Lighting과 Shader Compiler 이상윤 http://illu.tistory.com

Upload: sangyun-yi

Post on 13-Apr-2017

106 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Unity Surface Shader for Artist 03

03. Lighting과 Shader Compiler

이상윤 http://illu.tistory.com

Page 2: Unity Surface Shader for Artist 03

2주차 과제 확인

Page 3: Unity Surface Shader for Artist 03

Shader "Study/Terrain4BlendVertexColor" {

Properties {

_MainTex1(“Base 텍스쳐”, 2D) = “white” {}_MainTex2(“R 텍스쳐”, 2D) = “white” {}_MainTex3(“G 텍스쳐”, 2D) = “white” {}_MainTex4(“B 텍스쳐”, 2D) = “white” {}

}

SubShader {Tags { "RenderType"="Opaque" }

GPROGRAM#pragma surface surf Lambert

sampler2D _MainTex1;sampler2D _MainTex2;sampler2D _MainTex3;sampler2D _MainTex4;

struct Input {

float4 color:COLOR;float2 uv_MainTex1;float2 uv_MainTex2;float2 uv_MainTex3;float2 uv_MainTex4;

};

void surf (Input IN, inout SurfaceOutput o) {

fixed3 t1 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t2 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t3 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t4 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;

fixed3 c1 = lerp( t1, t2, IN.color.r);fixed3 c2 = lerp( c1, t3, IN.color.g);fixed3 c3 = lerp( c2, t4, IN.co.or.b);

o.Albedo = c3.rgb;

}ENDCG

}}

Page 4: Unity Surface Shader for Artist 03

Shader "Study/Terrain4BlendMasking" {

Properties {

_MainTex1(“Base 텍스쳐”, 2D) = “white” {}_MainTex2(“R 텍스쳐”, 2D) = “white” {}_MainTex3(“G 텍스쳐”, 2D) = “white” {}_MainTex4(“B 텍스쳐”, 2D) = “white” {}

_BlendTex(“마스킹 텍스쳐”, 2D) = “white” {}

}

SubShader {Tags { "RenderType"="Opaque" }

GPROGRAM#pragma surface surf Lambert

sampler2D _MainTex1;sampler2D _MainTex2;sampler2D _MainTex3;sampler2D _MainTex4;

sampler2D _BlendTex;

struct Input {

float2 uv_MainTex1;float2 uv_MainTex2;float2 uv_MainTex3;float2 uv_MainTex4;

float2 uv2_BlendTex;

};

void surf (Input IN, inout SurfaceOutput o) {

fixed3 bl = tex2D(_BlendTex, IN.uv2_BlendTex).rgb;

fixed3 t1 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t2 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t3 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;fixed3 t4 = tex2D(_MainTex1, IN.uv_MainTex1).rgb;

fixed3 c1 = lerp( t1, t2, bl..r);fixed3 c2 = lerp( c1, t3, bl.g);fixed3 c3 = lerp( c2, t4, bI.b);

o.Albedo = c3.rgb;

}ENDCG

}}

Page 5: Unity Surface Shader for Artist 03

Uv scroll

tex2D(_MainTex, IN.uv_MainTex);

tex2D(_MainTex, float2(IN.uv_MainTex.x + _Time.x, IN.uv_MainTex.y));

http://docs.unity3d.com/462/Documentation/Manual/SL-BuiltinValues.html

Page 6: Unity Surface Shader for Artist 03

흐름의 세기를 조절할수 있는 Shader를 만들어 봅시다.

힌트 : IN.uv_MainTex.x + _Time ????

Page 7: Unity Surface Shader for Artist 03

Custom Lighting

Page 8: Unity Surface Shader for Artist 03

CGPROGRAM

#pragma surface surf Lambert

Lambert와 BlinnPhong은 Lighing.cginc 파일에 내장되어 있어 선언만 해주면 되지만 직접 만들경우(Custom

Lighting) 에는 조명 설계를 해주어야 합니다.

half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten)

라이트 모델의 포워드 렌더링 패스에서 사용됩니다

half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)

뷰 방향에 의존하고 있는 라이팅 모델의 포워드 렌더링 패스에서 사용됩니다

자세한 내용은 : http://docs.unity3d.com/kr/current/Manual/SL-SurfaceShaderLighting.html

Page 9: Unity Surface Shader for Artist 03

fixed4 LightingUnityLambert (SurfaceOutput s, half3 lightDir, half atten)

{

fixed diff = max (0, dot (s.Normal, light.dir));

fixed4 c;

c.rgb = s.Albedo * light.color * diff;

c.a = s.Alpha;

return c;}

Lambert Lighting 공식

dot ( a, b ) : a와 b의 내적max( a, b ) : a와 b의 최대값

Page 10: Unity Surface Shader for Artist 03

요한 하인리히 람베르트(Johann Heinrich Lambert) : 스위스의 수학자, 물리학자, 천문학자, 철학자

램버시안 반사율 : 관찰자가 바라보는 각도와 관계없이 같은 겉보기 밝기를 갖는다. 이를 난반사가 이루어지는 표면을 묘사하기 위해

램버시안 모델을 사용하게 되는데 이는 표면의 특징을 잘 모를때 램버시안 반사는 적당한 근사치가 될 수 있기 때문이다.

Page 11: Unity Surface Shader for Artist 03

half NdotL = dot (s.Normal, lightDir);

half diff = NdotL * 0.5 + 0.5;

half4 c;

c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);

c.a = s.Alpha;

Page 12: Unity Surface Shader for Artist 03

Unlit Lighting 공식

fixed4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)

{

return fixed4(s.Albedo, 1);}

Unlit : Unlighting을 준말으로 빛을 계산하지 않는 상태로 많이 표기 된다.}

Page 13: Unity Surface Shader for Artist 03
Page 14: Unity Surface Shader for Artist 03

UE4 Nod Unlit 설정. Shading Model에서 Unlit를 설정

Shading Model에서 Unlit로 설정하면

Base color 항목이 비활성되며 Emissive

color 항목만이 활성화 된다.(ambient

source의 영향은 받는 상태)

Page 15: Unity Surface Shader for Artist 03

Unlit Diffuse Shader를 작성해 봅니다.

Page 16: Unity Surface Shader for Artist 03

noambient option에 따른 밝기 변화 비교

Unlit 경우처럼 빛을 계산하지 않는 상태에

서도 ambient color에 영향을 받는다.

Light probe를 사용할 경우 이 옵션을 꺼버

리면 아예 빛계산을 못하고 까맣게 나온다.

Page 17: Unity Surface Shader for Artist 03

Compiler code

alpha : 알파 블랜딩 타입, 반투명한 셰이더에 사용.

alphatest:VariableName : 알파 테스팅 모드, transparent-cutout 셰이더에 사용. Cutoff 값은 변수 이름에 따름

addshadow : 그림자 생성과 수집 패스를 추가. 절차적인 버텍스 애니메이션이 그림자에 영향을 미치도록 커스텀 버텍스수정 함수와 함께 사용.

Page 18: Unity Surface Shader for Artist 03

Surface는 Shader는 전처리된 코드를 적절히 잘 사용할 수 있는 반면 많은 경우의 수에 대하여 Shader가 컴파일 되므로

Compiler 구문에서 막아서 선언해줘야 한다. 반대로 fragment 구조에서는 필요한 경우에 대해서 Shader에서 계산을 해

줘야 한다.

Page 19: Unity Surface Shader for Artist 03

Compiler code

noambient : 앰비언트 라이팅이나 SH라이트가 적용되지 않게 함

novertexlights : 포워드 렌더링에서 SH나 vertex light가 가동되지 않게 함

nolightmap : 셰이더가 라이트맵을 지원하지 않게 만든다

nodirlightmap : directional lightmap을 지원하지 않게 한다

noforwardadd : 포워드 렌더링 가산 패스를 비활성화한다. 그 결과 셰이더는 하나의 디렉셔널 라이트를

완전히 지원하고, 나머지 라이트는 버텍스 단위 또는 SH 방식으로 처리된다. 셰이더를 가볍게 만든다.

approxview : 픽셀이 아니라 버텍스 단위로 단위화된 시선 방향 벡터를 계산한다. 처리가 빨라지지만 카

메라가 오브젝에 근접할 경우 시선방향의 계산이 부정확할 수 있다.

>> Unity 5에서 interpolateview로 변경

halfasview : 시선 방향 대신 하프 디렉션 벡터를 라이팅 함수에 전달한다. 하프 디렉션은 벡터는 버텍스

단위로 연산되고 단위화 된다. 빠르지만 정확도가 떨어진다.

Page 20: Unity Surface Shader for Artist 03

Unlit alphatest Shader를 만들어 봅시다.

Alphatest

0, 1 alpha만 존재.

Alphablend

반투명

Page 21: Unity Surface Shader for Artist 03

fixed4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)

{

return fixed4(s.Albedo, s.Alpha);}

Properties {

_AlphaCut (“AlphaCut”, Range(0,1)) = 0.5

}

SubShader {Tags {“Queue"=“Transparent” "RenderType"=“Transparent”}

CGPROGRAM#pragma surface surf Unlit alphatest:_AlphaCut

Page 22: Unity Surface Shader for Artist 03

512x256 4x1 texture를 animation scroll로 이펙트를 표현해 봅니다.

Gif 파일로 애니메이션되는 이미지를 올려주시기 바랍니다.

Page 23: Unity Surface Shader for Artist 03

수고하셨습니다.