본문 바로가기
Graphics

[Graphics] Custom Shader 셰이더 가상의 광원 Normalize

by david_동근 2025. 5. 19.

아래 포스트는 고민하고 시도해본 방법들을 정리하였으며,

https://bulletprooves.tistory.com/34

 

[Unity] Custom Shader 셰이더 에디터 / 빌드 다른 결과

해당 포스트는 고민하고 시도해본 방법들을 정리하였으며,해결하지는 못했지만, 나름 다른 방법으로 우회(?)하여 겉보기엔 문제 없이 해결한 방법은 다음 포스트에서 다뤘습니다.https://bulletproov

bulletprooves.tistory.com

 

해당 포스에서는 해결하지는 못했지만, 나름 다른 방법으로 우회(?)하여 겉보기엔 문제 없도록 만든 과정을 정리했습니다.

 


 

문제 : Build 하고난 뒤, 음영이 반영 안 됨

빌드하고 나면, 전부 어두운 팩터만 곱해 밝은 부분과 중간 부분 음영이 반영 되지 않습니다.

원인은... 모르겠고, 여러 방법 시도해 보았지만 해결하지 못 했습니다.

아래 해결 방법을 찾기 위해 찾아본 것들입니다.

 

커스텀 쉐이더를 사용 중, Shader가 Editor 와 Build 에서 반영 결과가 다른 문제가 생겼습니다.

왼쪽이 Editor, 오른쪽이 Build 한 .exe 파일의 스크린샷입니다. (Post 프로세싱의 Bloom을 너무 과하게 한 거 같네요...ㅎㅎ)

 

내 Shader 코드 분석

우선 프로퍼티는 다음과 같습니다.

 

반투명용으로 사용할 Albedo, 그리고 아래 이미지와 같이 광원으로 부터의 방향과 표면 방향의 밝기에 따라

그 값을 바꿔 줄 factors, 상한값과 하한값 전용 Threshold입니다.

 

광원 (Directional Light)로 부터의 방향과 표면 방향을 dot product 했습니다.

먼저 빛이 오브젝트에 닿는 밝기에 따라 3개 구간으로 분기합니다.

  • 밝은 곳 = 밝은 쪽 살짝 강조
  • 중간 밝기 = 중간은 기본 텍스처
  • 어두운 곳 = 음영 색깔 곱해줌

아래처럼 말이죠.

 

그럼 혹시 지침 키워드를 바꿔볼까? 생각해봤습니다만...

 

#pragma multi_compile_fwdbase 를 multi_compile_forwardadd로 바꿔보기 → 실패

UsePass "Legacy Shaders/Diffuse/FORWARD" 방식으로 Pass를 강제로 가져오는 것도 고려해 볼 수 있겠지만...

(혹은 Lighting.cginc 대신 UnityCG.cginc로 전환해서 직접 Directional Light 우회도 가능할까...? 안해봐서 모르겠어용)

// Tag { "LightMode" = "ForwardBase" } 이거 열어두니 아래처럼 나왔습니다.

https://docs.unity3d.com/kr/530/Manual/SL-PassTags.html

Tag 키워드는 위 링크에서 확인할 수 있습니다.

 

 

고민 끝에 선택한 방법은, 

 

광원 레퍼런스 없이 Y축 수직으로부터 내려오는 가상의 빛

정말 제 머리 축으로 부터 수직한 방향으로 빛이 내리쬐는 것만 같았습니다.

 

위쪽에서 수직으로 내리쬐는 가상의 빛을 만들어 실제 Scene 내에 광원 (Directional Linght)가 존재하지 않아도

위에서 짠 프로퍼티 팩터가 잘 반영되도록 가짜로 광원을 만드는 겁니다.

float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

 

월드공간 내의 광원의 위치로 부터 Normalization 필요 없이, 아래와 같이

float3 lightDir = normalize(float3(0, 1, 0));
// Y축 위쪽에서 수직으로 내려오는 화려한 조명, 가상의 빛이 저를 비추네요

 

애초에 이렇게 한 줄 바꾸면 될 것을 허구하게 삽질하고 있었습니다.

 

아오... 드디어 됐습니다.

 

비교해 보겠습니다.

 

좌측 → 맨 처음 Editor 결과입니다. Build 하고도 좌측처럼 나오길 바랐지만,

중앙 → Build 결과가 중앙 사진 처럼 나와서 울었습니다. 그러다 아이디어가 떠올라 코드 한 줄 바꿔,

우측 → Build 후에도 광원(바꿔준 가상의 Light)으로부터의 밝기에 따른 factor에 맞게 구간별로 return합니다.

 


 

다들 화이팅! 오늘도 좋은 하루 되시기 바랍니다. (っ˘▿˘)(˘▿˘)˘▿˘ς)

 

'Graphics' 카테고리의 다른 글

[Graphics] HLSL Vector 벡터 메서드 정리  (0) 2025.04.30
[Graphics] Shader Programming & HLSL  (0) 2025.04.28