본문 바로가기
공허의 유산/표현의 자유

[Unity3D/Shader] 03. SurfaceOutputStandard 맛보기

by 바른생활머시마 2023. 2. 20.
728x90
반응형

앞에서 Property에 대해서 알아보았습니다.

[Unity3D/Shader] 02. Editor UI와 연동하는 Property (tistory.com)

 

[Unity3D/Shader] 02. Editor UI와 연동하는 Property

유니티 환경에서 쉐이더에 대해서 알아보기 위해 기본 환경을 구축하였습니다. https://learn-and-give.tistory.com/71 [Unity3D/Shader] 01. 기본 환경 준비 최근에 GLSL에 대해 리뷰를 해왔습니다. https://learn-and-

learn-and-give.tistory.com

 

입력은 일단 이 정도로 알아두고 출력을 알아보도록 하겠습니다. surf 함수의 인자 중, SurfaceOutputStandard 는 입출력 용도로 사용되는데, 앞의 예에서도 알베도에 값을 설정하는 것으로 색상을 변경하는 것을 보았습니다. 이것에 대해서 좀 알아보도록 하겠습니다.

 

 

 

SurfaceOutputStandard 

 

일단, 이 구조체에 대한 자세한 내용은 유니티 매뉴얼에 있어요

Unity - Manual: Writing Surface Shaders (unity3d.com)

 

Unity - Manual: Writing Surface Shaders

Surface Shaders and rendering paths Writing Surface Shaders In the Built-in Render PipelineA series of operations that take the contents of a Scene, and displays them on a screen. Unity lets you choose from pre-built render pipelines, or write your own. Mo

docs.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

 

반사율 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 반사율 또는 알베도(albedo)는 물체가 빛을 받았을 때 반사하는 정도를 나타내는 단위이다. 반사율은 입사되는 전자기파에 대한 반사량으로 계산되며, 일반적으

ko.wikipedia.org

 

 이 알베도는 지금까지 쭉 살펴 본 예제에서 살펴 본 것 처럼, 오브젝트의 표면 색상이라고 보면 될 것 같아요. 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] 04. 텍스쳐 맛보기

앞에서 출력 구조체에 대해서 조금 알아보았습니다. https://learn-and-give.tistory.com/74 [Unity3D/Shader] 03. SurfaceOutputStandard 맛보기 앞에서 Property에 대해서 알아보았습니다. [Unity3D/Shader] 02. Editor UI와 연동

learn-and-give.tistory.com

 

728x90
반응형

댓글