Pink Transparent Star

Shader

[ Shader ] 06. 스페큘러와 메탈릭 표면

채유나 2023. 5. 25. 15:53
728x90
해당 포스팅은 " 따라 하면서 배우는 유니티 5 셰이더와 이펙트 입문 " 기반으로 정리 하였습니다 

 

 

 

물리 기반 쉐이딩(Physically - Based Shading)

 : 메탈릭과 스페큘러 워크플로

 

 

보조 알베도 텍스처 적용

 

Detail Mask : 기본 텍스처와 동일한 UV 좌표를 사용할 수 있다.

- 타일링이나 UV 오프셋을 변경하면 모든 맵에 영향을 받아 별도로 좌표 집합을 사용하는 쉐이더를 작성하는것이 좋다.

 

SurfaceOutputStandard

 : 입출력 용도로 사용

 : 하지만 고품질 렌더링 할 때 사용하는 URP, HDRP 등에서는 사용할 수 없다.

 

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

 

 

[ 데칼 커스텀 쉐이더 만들기 ]

Properties
{
   _Matallic("Metal(R), Smoothness(A)",2D) = "white"{}
   _DecalTex("Decal Albedo(RGB)",2D )= "white"{}
}

Matallic : R 채널을 사용

               Range (0,1)의 범위를 주어 금속 여부를 결정 ( 0 : 비금속 / 1 : 금속 )

Smoothness : A 채널을 사용

  => 해당 방법에서는 텍스처 맵의 알파 채널을 사용하기 때문에 자체 프로퍼티를 사용하지 않았다.

 

struct Input
{
     float2 uv_DecalTex;
};

void surf (Input IN, inout SurfaceOutputStandard o)
{
     fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
     fixed4 d = tex2D (_DecalTex, IN.uv_DecalTex);
     fixed4 m = tex2D (_Metallic, IN.uv_MainTex);
     o.Albedo = lerp(c.rgb, d.rgb, d.a);
}

추가 UV좌표를 사용하는 DecalTex를 Input 선언하였다.

 - Metallic의 경우 MainTex와 동일한 UV 좌표를 사용하기 때문에 선언하지 않아도된다

 

fixed4 결과 = text2D(샘플러, UV);

 : 텍스처의 컬러를 화면에 출력

 

tex2D (_MainTex, IN.uv_MainTex) * _Color : 텍스처맵을 쉐이더의 색상과 결합 ( UV 좌표를 이용해 텍스처에 적용 시킴)

o.Albedo : 반사율 또는 물체가 빛을 받았을 때 반사하는 정도를 나타냄

 - lerp(c.rgb, d.rgb, d.a) : MainTex와 DecalTex RGB 값을 블렌딩을 나타낸다

   : d.a의 기준으로 c.rgb와 d.rgb의 선형보간으로 DecalTex의 알파 채널이 제거되어 MainTex에는 영향을 미치지 않는다.

 

 

 

 


 

 

쉐이더 조명 모델

 #pragma surface surf Standard fullforwardshadows

 

 : 물리 기반 표준 조명 모델 ( 모든 종류 조명에 그림자 활성화 )

  - Standard : 쉐이더가 사용하는 입력 집합을 지정, 입력 집합은 외부 원본에서도 접근

   >> UnityPBSLighting.cginc  정의 

   >> surf 함수에서 SurfaceOutputStandard 구조체 사용

 

 

 

아래의 경로에서 Lighting의 원본을 확인 할 수 있다.

(유니티설치경로)\Data\CGIncludes\UnityPBSLighting.cginc 

 

UnityPBSLighting.cginc 조명 모델의 코드

inline half4 LightingStandardSpecular (SurfaceOutputStandardSpecular s, float3 viewDir, UnityGI gi)
{
    s.Normal = normalize(s.Normal);

    // energy conservation
    half oneMinusReflectivity;
    s.Albedo = EnergyConservationBetweenDiffuseAndSpecular (s.Albedo, s.Specular, /*out*/ oneMinusReflectivity);

    // shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
    // this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha
    half outputAlpha;
    s.Albedo = PreMultiplyAlpha (s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha);

    half4 c = UNITY_BRDF_PBS (s.Albedo, s.Specular, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, gi.light, gi.indirect);
    c.a = outputAlpha;
    return c;
}

해당 코드는 쉐이더가 다른 Cg파일인 UnityGI에서 계산되는 글로벌 일루미네이션(GI : Global illumination)을 포함하는 빛에 반응 방법을 지정한다. 

 

사진 출처 : 그냥 그런 블로그

글로벌 일루미네이션

  : 물리적인 현상에 기반한 빛의 이동에 대한 시뮬레이션 결과이다.

    즉, 반사되거나 굴절되는 모든 빛을 새로운 광원으로 삼는 것을 이야기 한다.

   이를 통해 게임의 사실성을 부각 시키는 효과를 보여 줄 수 있다.

 

BRDF, 양반향 반사도 분포 함수(Bidrectional Reflectance Distribution Function)

  : 조명각(light direction)과 조명강도가 표면에 미치는 영향을 면법선과 관찰각(view direction)을 고려해 정확하게 계산하는 조명 함수

 

#pragma surface surf Lambert 

 

  : 표면 하이라이트를 포함하지않고 빛에 의한 밝고 어두움이 구현된 가벼운 라이트 구조

   >> Lighting.cgic  정의

   >> surf 함수에서 SurfaceOutput 구조체 사용

 

Lighting.cgic 조명 모델의 구조체

struct SurfaceOutput 
{
    fixed3 Albedo;
    fixed3 Normal;
    fixed3 Emission;
    half Specular;
    fixed Gloss;
    fixed Alpha;
};

 

 

 

 

왼) 표준 스페큘러 / 머터리얼 오) Lambert tnpdlej

 

 

[2023.05.25] 이 챕터는 조명에서 이해를 잘 못하고 있는거 같다 한번 다시 훑고 정리해보도록,.,, 하겠습니다.

 

728x90