앞에서 Property에 대해서 알아보았습니다.
[Unity3D/Shader] 02. Editor UI와 연동하는 Property (tistory.com)
입력은 일단 이 정도로 알아두고 출력을 알아보도록 하겠습니다. surf 함수의 인자 중, SurfaceOutputStandard 는 입출력 용도로 사용되는데, 앞의 예에서도 알베도에 값을 설정하는 것으로 색상을 변경하는 것을 보았습니다. 이것에 대해서 좀 알아보도록 하겠습니다.
SurfaceOutputStandard
일단, 이 구조체에 대한 자세한 내용은 유니티 매뉴얼에 있어요
Unity - Manual: Writing Surface Shaders (unity3d.com)
내용을 보다보니, 예상치 못한 내용이 있네요. URP나 HDRP 등에서 쓸 수 없다니.... 특별한 고품질 랜더링을 손쉽게 할 때 URP를 쓰던데, 얘도 약간 구시대 유물일지도 모르겠네요. GLSL을 배우고 여기 왔듯, 이것을 배워두면 또 URP, HDRP 공부 할 때 도움이 되겠죠.
기본적인 구조체는 아래와 같습니다.
struct SurfaceOutput
{
fixed3 Albedo; // diffuse color
fixed3 Normal; // tangent space normal, if written
fixed3 Emission;
half Specular; // specular power in 0..1 range
fixed Gloss; // specular intensity
fixed Alpha; // alpha for transparencies
};
유니티5에서는, Surface Shader는 물리 기반 조명 모델을 사용 할 수 있다고 합니다. 빌트인으로 제공되는 Standard 그리고 StandardSpecular 조명 모델은 아래 구조체를 사용합니다.
struct SurfaceOutputStandard
{
fixed3 Albedo; // base (diffuse or specular) color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Metallic; // 0=non-metal, 1=metal
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // diffuse color
fixed3 Specular; // specular color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
...
이렇게 잘 모르는 내용들이 막 쏟아지면서 범위가 급격하게 넓어질 때는 과감하게 무시하고 휙~ 넘어가버려야겠습니다.
우리 모두의 정신 건강을 위해서.
Color
일단 지금까지 사용 해 온 샘플 코드에 있던 구조체만 살펴보는 것으로 우리의 정신 건강을 지켜 보겠습니다.
struct SurfaceOutputStandard
{
fixed3 Albedo; // base (diffuse or specular) color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Metallic; // 0=non-metal, 1=metal
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
Albedo
알베도는 온도, 경도, 강도 처럼 어떤 정도를 나타내는 한자와는 아무런 관련이 없습니다.
度 ( 정도, °(온도, 각도 등의 단위), 길이...)
위키백과에 따르면, 반사율 또는 알베도(albedo)는 물체가 빛을 받았을 때 반사하는 정도를 나타내는 단위이다. 라고 되어 있네요. 라틴어의 흰 정도를 나타내는 단어라고 합니다. 예전에 지구과학 시간에 처음 들어 본 단어였더 것 같아요.
https://ko.wikipedia.org/wiki/%EB%B0%98%EC%82%AC%EC%9C%A8
이 알베도는 지금까지 쭉 살펴 본 예제에서 살펴 본 것 처럼, 오브젝트의 표면 색상이라고 보면 될 것 같아요. GLSL에서 공부한 내용으로 이해를 하자면, 재질의 Diffuse 속성에 해당하는 색상이라고 보면 될 것 같아요.
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = _Color.rgb;
}
Emission
emission은 발광/발산 그런 의미인데, 위에서 사용한 빨간색을 이 속성에만 할당하여 어떻게 되는지 봅시다.
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Emission = _Color.rgb;
}
아래와 같이 나오는데, 조명 설정은 전혀 바꾸지 않았고, Albedo 대신 Emission에 빨간색을 할당하였을 뿐입니다. Albedo가 빨간색 오브젝트라면, Emission은 빨간색 전구라고 보면 됩니다. 전구는 다른 조명에 의한 음영 효과가 잘 드러나지 않죠. 앞에서 소개한 참고 서적을 보면 이 Emission 속성은 매우 유용한데요, Emission이라는 속성처럼 빛을 발산하는 특성을 나타내기도 하지만, 아래 그림처럼 설정 된 색상이 조명의 영향을 받지 않고 그대로 표현된다는 특성에 따라, 일종의 디버깅 용도로 사용 될 수도 있습니다.
Alpha
알파는 투명도를 나타내는데요, 한번 반투명하게 한번 설정해 보겠습니다.
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = _Color.rgb;
o.Alpha = 0.5;
}
기대와 다르게 결과는 반투명하게 되지 않습니다.
'반투명'은 매우, 매우, 매~~~~~~~~~~~~~~~~~~~~~~~~``애우 비싼 연산입니다.
그래서 최적화를 할 때 중요한 부분이죠. Unity도 그래서 요 부분을 잘 처리하기 위해서 따로 처리 할 수 있는 방법을 사용하고 있어요. 예제 코드의 상단에 요런 부분이 있었는데요,
Tags { "RenderType"="Opaque" }
...
#pragma surface surf Standard fullforwardshadows
fullforwardshadows는 그림자에 대한 것이라 없어도 되겠고,
아래와 같이 수정 해 보겠습니다.
Tags { "RenderType"="Transparent" "Queue"="Transparent"}
...
#pragma surface surf Standard alpha:fade
결과는~
요렇게 잘 됩니다.
하지만, 이런 처리를 하기 위해 비싼 처리를 하고 있을 것이니, 꼭 필요한 경우가 아니라면 쓰지 않는게 좋겠죠?
이렇게 입출력을 대략 이해 한 상태에서, 출력에 대한 수식을 구현하면서 결과가 어떻게 되는지 보면서 배워 갈 수 있습니다.
예를 들면, 상자 텍스쳐를 흑백으로 바꾸려면 텍스쳐 색상을 그대로 할당하는 것이 아니라, 흑백으로 처리하기 위한 계산(평균 등)을 한 후, 그 하나의 값을 rgb 성분에 똑같이 할당하면 흑백이 됩니다.
코드는 요렇게~
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = (c.r + c.g + c.b)/3.0;
}
결과는 요렇게~
GLSL의 마지막 예제였던 멀티 텍스쳐링도 Property에 텍스쳐를 추가한 후, 처리 할 수 있습니다.
한번에 너무 많이 하면 지치니까 요기까지만~
https://learn-and-give.tistory.com/75
'공허의 유산 > 표현의 자유' 카테고리의 다른 글
[Unity3D/Shader] 05. 텍스쳐를 이용하여 불꽃 효과 내기 (6) | 2023.02.22 |
---|---|
[Unity3D/Shader] 04. 텍스쳐 맛보기 (2) | 2023.02.21 |
[Unity3D/Shader] 02. Editor UI와 연동하는 Property (0) | 2023.02.19 |
[Unity3D/Shader] 01. 기본 환경 준비 (0) | 2023.02.16 |
[3DReconstruction] 03.meshroom tutorial review(3) (0) | 2023.02.14 |
댓글