해당 포스팅은 " 따라 하면서 배우는 유니티 5 셰이더와 이펙트 입문 " 기반으로 정리 하였습니다
물리 기반 쉐이딩(Physically - Based Shading)
: 메탈릭과 스페큘러 워크플로
보조 알베도 텍스처 적용
Detail Mask : 기본 텍스처와 동일한 UV 좌표를 사용할 수 있다.
- 타일링이나 UV 오프셋을 변경하면 모든 맵에 영향을 받아 별도로 좌표 집합을 사용하는 쉐이더를 작성하는것이 좋다.
SurfaceOutputStandard
: 입출력 용도로 사용
: 하지만 고품질 렌더링 할 때 사용하는 URP, HDRP 등에서는 사용할 수 없다.
[ 데칼 커스텀 쉐이더 만들기 ]
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;
};
[2023.05.25] 이 챕터는 조명에서 이해를 잘 못하고 있는거 같다 한번 다시 훑고 정리해보도록,.,, 하겠습니다.
'Shader' 카테고리의 다른 글
[ Shader ] 05.투명 표면 (0) | 2023.05.17 |
---|---|
[ Shader ] 04.쉐이더를 이용한 애니메이션 (0) | 2023.05.13 |
[ Shader ] 03.조명과 발광 효과 (0) | 2023.05.11 |
[ Shader ] 02.커스텀 쉐이더( Custom Shader ) 란? (1) | 2023.05.10 |
[ Shader ] 01.표준 쉐이더(Standard Shader) 란? (0) | 2023.05.09 |