Unity Shader 21.05.04. 수업내용
어제 렌더타입에 들어갔던 큐가 뭔지 궁금해서 찾아보았다.

============================================================================
어제 했던 것들 복습

풀과 모래가 섞인 공은 lerp를 사용했고 불은 UV좌표를 이동시키는 코드들을 이용하여 만들었다.

왼쪽 구 같은 경우엔 텍스쳐 외엔 전부 필요없을듯 해서 다 지우고 새로 만들었다. 텍스쳐들의 색은 그대로 받아오고, lerp함수를 이용하여 lerp(텍스쳐1, 텍스쳐2, 섞을정도)로 구현하였다.
그리고 _Brightness를 추가하여 각각의 텍스쳐의 밝기를 조절할 수 있도록 했으며, _Mixed - c.a를 섞을정도로 넣어 풀 텍스쳐에서 풀은 항상 노출되도록 하였다. 또한, _Mixed를 통해 두 텍스쳐가 섞이는 정도를 바꿀 수 있다.

불 텍스쳐는 조금 더 간단하게 코딩했다. 불이 올라가는 속도를 정하는 _Speed와 불의 일렁거림을 조절하는 _Power이 있고, 불의 효과로 사용되는 텍스쳐2의 색상정보를 텍스쳐1의 UV좌표에 더해주어 일렁거림을 표현하였다.
============================================================================



color:COLOR값은 FBX에 저장되어있는 색상정보를 불러오는 코드이다.(Vertex의 색상정보
)
그래서 o.Emission에서 c.rgb를 출력하느냐, color.rgb를 출력하느냐에따라 위 사진의 좌 또는 우측 결과가 나타난다.
============================================================================
Polybrush 사용방법 - 유니티 내장기능

페인트 세팅을 Fill로 바꿔 준 뒤, colorMask는 사용하지 않고 색깔로만 RGB영역을 지정해 줄 수 있다. 이를 이용해 영역을 지정해준 뒤 텍스쳐가 섞인 오브젝트를 만들 수 있다.
단, RGB페인팅 이전에 검은색으로 도배해주어야한다.


color는 Vertex의 색상정보를 나타낸다. 현재는 RGB페인팅을 하지 않고 검은색만 도배하여 전부 까만 모습이다.


아무것도 없는 값 + 텍스쳐의 색상정보이기때문에 텍스쳐의 색상정보가 출력된다.

폴리브러쉬로 RGB를 칠해주었다. 안보이는 부분은 검은색이다.

color의 RGB와 텍스쳐의 RGB를 더해서 출력하니 이젠 이렇게 색이 칠해진게 눈에 띈다.
이제 여기서 각 RGB영역에 다른 텍스쳐를 할당해보겠다.


c를 전체에 할당하고 c2를 그 중 color의 R영역에 할당하였더니 이렇게 된다.
같은 코드로 계속 덧씌우면 된다.

결과는 성공적으로 나왔다. 칠해뒀던 RGB영역에 각각의 텍스쳐가 할당되어 나온다.

칠해지지 않은 검정색 부분은 여전히 돌바닥 텍스쳐가 출력된다.

출력한 알베도에 계속 덧씌우는 작업이다. 어제 배운 내용을 토대로 각 텍스쳐의 밝기를 조절할 수 있을것 같다.
============================================================================
Normal은 오브젝트의 굴곡을 표현해주는 텍스쳐이다.


이런식으로 노멀을 사용할 때는 일반적인 텍스쳐와는 다르게 bump를 기본값으로 설정하고 사용할 때는 UnpackNormal이라는 CG의 기능을 사용하여 값을 도출해낸 뒤, 오브젝트의 노멀값으로 지정해준다.
-normal데이터로 사용할 텍스쳐의 UV를 할당해 준뒤,
-그 값을 노멀로 Unpack해주는 UnpackNormal을 사용하여 Normal값을 구한다.
-오브젝트의 Normal값을 설정.



**오클루전 텍스쳐는 UV를 할당받지 않는다.

오클루전이 적용된 쪽의 홈이 좀 더 짙고 어둡게 보인다.

노멀로 굴곡을 표현하고 오클루젼으로 표현되는 색감을 조금 더 짙게 해준다.

오클루젼까지 포함된 코드. 오클루젼은 특이하게 UV값을 할당받지 않고 바로 tex2D로 메인텍스쳐에 입힌다.
ㄴ아마 오클루젼은 메인텍스쳐에 추가적인 효과를 주는 것이라서 UV를 메인텍스쳐로 쓰면서 변수선언만 하고 바로 할당하는듯 하다.
============================================================================



Bump텍스쳐를 할당하자 확실히 울퉁불퉁한 느낌이 두드러진다. 그리고 Smoothness코드를 살짝 조정해주자 디테일이 산 느낌이 든다...

여기서 IN.color.b를 추가한 이유는 버텍스 색상 Blue인 영역에만 저 효과를 적용하겠다는 뜻이다.




Standard쉐이더는 유니티에서 빛계산은 자동으로 해주는 기능이다.(물리기반 쉐이더)
============================================================================
유니티 - 매뉴얼: 스탠다드 쉐이더(Standard Shader) (unity3d.com)
유니티 - 매뉴얼: 스탠다드 쉐이더(Standard Shader)
Creating and Using Materials 스탠다드 쉐이더(Standard Shader) 새로운 머티리얼을 만들 때는 항상 이 쉐이더가 기본으로 선택됩니다. 사용자는 다양한 특징의 조합(투명, 범프, 반사 등)을 지원하는 쉐이더
docs.unity3d.com


pragma에 Lambert // Blinn Phong // Standard에 무엇을 쓸건지 선언을 하고,
아래에 있는 surf의 구조체를 반드시 위 사진들처럼 알맞게 바꿔줘야한다.
ex) SurfaceOutput 또는 SurfaceOutputStandard 또는 SurfaceOutputStandardSpecular 처럼.


스페큘러를 바꿀때는 pragma의 타입과 surf의 inout의 타입을 알맞게 바꿔주어야 한다.

블린퐁의 경우, 반사광이 확실히 보이며 램버트의 경우 짙은 색감이며 스탠다드는 밝은 색감을 띈다.



블린퐁의 경우는 Gloss를 추가로 선언하였고 나머지는 그런거 없이 간단했다.
ㄴ그리고 블린퐁의 경우 SpecColor로 반사광의 색깔을 정할 수 있는데, 이 때, Float이나 Color이런 값으로 평소처럼 변수를 선언하려 하면 안된다. ex)Color _Speccular; 같은 방식
ㄴ프로퍼티에만 선언하고 바로 사용할 수 있다.
ㄴ그리고 _SpecColor의 경우 철자 하나라도 틀리면 작동하지 않는다. 꼭 철자를 준수할 것.



어제 배운 내용과 합치면 이런식으로 현란하게 돌릴수도 있다 :D
Shader "Custom/Blinn Phong
"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_MainTex2 ("Albedo2 (RGB)", 2D) = "white" {}
_BumpTex ("BumpTexture", 2D) = "bump" {}
_SpecColor ("Specular Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
sampler2D _MainTex;
sampler2D _MainTex2;
sampler2D _BumpTex;
struct Input
{
float2 uv_BumpTex;
float2 uv_MainTex;
float2 uv_MainTex2;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c2 = tex2D (_MainTex, float2(IN.uv_MainTex.x - _Time.y, IN.uv_MainTex.y));
fixed4 c = tex2D (_MainTex2, float2(IN.uv_MainTex2.x + _Time.y, IN.uv_MainTex2.y));
o.Normal = UnpackNormal(tex2D(_BumpTex, float2(IN.uv_BumpTex.x - _Time.y, IN.uv_BumpTex.y)));
o.Gloss = 1;
o.Specular = 0.5;
o.Albedo = c.rgb;
o.Albedo = lerp(o.Albedo, c2, 1 - c.a);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Standard"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_MainTex2 ("Albedo2 (RGB)", 2D) = "white" {}
_BumpTex("BumpTexture", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard
sampler2D _BumpTex;
sampler2D _MainTex;
sampler2D _MainTex2;
struct Input
{
float2 uv_BumpTex;
float2 uv_MainTex;
float2 uv_MainTex2;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c2 = tex2D (_MainTex, float2(IN.uv_MainTex.x, IN.uv_MainTex.y - _Time.y));
fixed4 c = tex2D (_MainTex2, float2(IN.uv_MainTex2.x + _Time.y, IN.uv_MainTex2.y));
o.Normal = UnpackNormal(tex2D(_BumpTex, float2(IN.uv_BumpTex.x, IN.uv_BumpTex.y - _Time.y)));
o.Albedo = c.rgb + c2.rgb;
o.Albedo = lerp(o.Albedo, c2, 1-c.a);
o.Alpha = c.a * c2.a;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Lambert
"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_MainTex2 ("Albedo2 (RGB)", 2D) = "white" {}
_BumpTex ("BumpTexture", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _MainTex2;
sampler2D _BumpTex;
struct Input
{
float2 uv_BumpTex;
float2 uv_MainTex;
float2 uv_MainTex2;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 c2 = tex2D (_MainTex2, IN.uv_MainTex2 + _Time.y);
o.Normal = UnpackNormal(tex2D(_BumpTex,IN.uv_BumpTex + c));
o.Albedo = c.rgb;
o.Albedo = lerp(o.Albedo, c2, 1-c2.a);
o.Alpha = c.a * c2.a;
}
ENDCG
}
FallBack "Diffuse"
}
이런식으로 각자 x또는 y에 값을 주어 돌아가는 효과를 주었고 준 값은 공통적으로 시간값을 주었다.
(가운데는 불효과 만들때처럼 c값을 직접 더해줬다.)