기본적인 컬러 바꾸기
1 2 3 4 5 | SubShader { Pass { Color (1, 1, 1, 1) } } | cs |
Color 명령어로 RGBA 값을 변경 가능.
물체 표면의 재질(material) 정의
1 2 3 4 5 6 7 8 | SubShader { Pass { Material { Diffuse (1, 1, 1, 1) Ambient (1, 1, 1, 1) } } } | cs |
Material 명령어 안에
Diffuse, Ambient, Shininess, Specular, Emission 을 선언 가능.
Ambient (주변광) : 물체를 덮은 일정한 색상(고정). 빛의 영향을 받지않고 항상 동일.
Diffuse (확산광) : 물체 표면에서 분산되어 들어오는 빛. 빛이 밝은곳에서는 강한 색상. 어두운쪽에선 약한 색상.
그림자가 진것처럼 표현됨
Specular (반사광) : 빛이 반사되어 하이라이트 되는 색상.
Emission (방출광) : 물체의 표면 자체에서 나오는 색상. (외부가 아닌 오브젝트 자체에서 발산)
Shininess (광택) : 하이라이트 선명도. 0~1 사이
라이팅 적용하기
1 2 3 4 5 6 7 8 9 | SubShader { Pass { Material { Diffuse (1, 1, 1, 1) Ambient (1, 1, 1, 1) } Lighting On } } | cs |
Lighting On 명령어를 이용하면 표준 라이팅을 적용가능.
프로퍼티에서 선언한 변수들 사용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Shader "VertexLit Simple" { Properties { _Color ("Main Color", Color) = (1,1,1,1) } SubShader { Pass { Material { Diffuse [_Color] Ambient [_Color] } Lighting On } } } | cs |
값을 직접 입력하지않고 Diffuse [_Color] 처럼 변수를 넣으면 적용가능.
텍스쳐 적용하기
1 2 3 4 5 6 7 8 | Properties { _MainTex ("Base Texture", 2D) = "white" {} } SubShader { Pass { SetTexture[_MainTex] } } | cs |
인스펙터에서 받아와서 SetTexture 로 적용
텍스쳐에 이전 연산결과 적용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Properties { _MainTex ("Base Texture", 2D) = "white" {} _SubTex ("Sub Texture", 2D) = "white" {} } SubShader { Pass { Material { Diffuse[_Color] Ambient[_Color] } Lighting On SetTexture [_MainTex] { Combine texture * primary DOUBLE } SetTextrue [_SubTex] { Combine texture * previous } } } | cs |
SetTexture 뒤에 Combine 명령어를 통해 연산결과를 적용할 수 있음.
primary는 라이팅 계산결과 적용
이전 결과값에 현재 텍스쳐를 곱해 텍스쳐에 라이팅 연산결과를 적용할 수 있음.
previous 바로 직전까지의 결과를 적용
Constant ConstantColor 명령어로 지정된 컬러
DOUBLE은 라이팅 강도를 2배로 높이겠다는 키워드.
QUAD는 4배 적용
보간 (Lerp)
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 | Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _MainTex2("Albedo2 (RGB)", 2D) = "white" {} } SubShader{ Pass { Material { Diffuse[_Color] Ambient[_Color] } Lighting On SetTexture[_MainTex] { Combine texture * primary DOUBLE } SetTexture[_MainTex2] { ConstantColor (1, 1, 1, 1) Combine constant lerp(texture) previous } } } | cs |
constant 명령어는 위에 적혀있듯이 ConstantColor로 설정한 색상을 의미.
A lerp(B) C 처럼 사용하며 B의 알파값을 이용하여 A와 C를 보간하여 결과값을 만듬.
B의 알파는 0~1 값을 가지며. 0일경우 C값. 1일경우 A값이 됨.
위의 경우 B가 texture(_MainTex2) 이므로 B의 알파값이 0인부분은 C(previous)가 적용되어 이전 텍스쳐.
B의 알파값이 1인부분은 A가 적용되어 constant(white)가 적용될것.
블렌딩 (Blend)
1 2 3 4 5 6 7 8 9 10 11 12 | Properties { _MainTex ("Texture to blend", 2D) = "black" {} } SubShader{ Tags { "Queue" = "Transparent" } Pass { Blend SrcColor OneMinusSrcColor SetTexture[_MainTex] { Combine texture } } } | cs |
블렌딩은 투명 오브젝트를 만드는데 사용.
Blend SrcFactor DstFactor 명령어로 블렌드를 적용할 수 있음.
오브젝트의 알파값이 0.6이라고 한다면 OneMinusSrcColor는 0.4가 되어
오브젝트 60% 배경색상 40%비율로 섞여 반투명하게 보이는 효과가 나타남
Factor 인자는 아래와 같다.
렌더링 순서 결정 (Queue 태그)
1 2 3 4 5 6 7 8 | SubShader{ Tags { "Queue" = "Transparent" } Pass { Blend One One SetTexture[_MainTex] { Combine texture } } } | cs |
위와 같이 Queue 태그를 이용해 렌더링 순서를 결정할 수 있다.
Queue태그의 종류로는
Background - 가장 먼저 렌더링됨. 보통 배경에 배치해야할 때 사용
Geometry - 디폴트값. 대부분 오브젝트의 사용. 불투명인 경우에
AlphaTest - 알파테스트된 지오메트리가 사용
Transparent - 알파 값이 적용되어야 할 오브젝트들은 Geometry와 AlphaTest 이후에 렌더링
Overlay - 마지막에 렌더링되야할 항목에 적용
background는 1000, Geometry는 2000, AlphaTest는 2450, Transparent는 3000, Overlay는 4000의 값을 가지고있음.
1 | Tags { "Queue" = "Geometry+1" } | cs |
그렇기에 위처럼 +1을 통해 2001번으로 만들어 모든 Geometry가 렌더링 된 이후에 렌더링시킬 수도 있음.
'프로그래밍 공부 > Shader' 카테고리의 다른 글
유니티 셰이더 기초 - Surface Shader (0) | 2018.07.17 |
---|---|
유니티 셰이더 기초 - Vertex and Fragment Programs / Surface Shader (종류) (0) | 2018.07.17 |
유니티 셰이더 기초 - ShaderLab / Fixed Funtion Shader 1 (0) | 2018.07.17 |
쉐이더란 무엇일까 (0) | 2018.07.17 |
셰이더 기초강좌 링크 (0) | 2018.07.16 |