250121

RTFM·2025년 1월 21일

개발 일지

목록 보기
58/350

✅ 오늘 한 일


  • 대마왕의 유니티 URP 셰이더 그래프 읽기
  • Random Study : Project 2P


📝 배운 것들


🏷️ Unity :: Shader Graph : Vector 4 UV for URP Sample Buffer

urp sample buffer 이거 왜 uv가 vector 4임? 화면 텍스쳐 받아오는거면 vector 2여야하는거 아님?

Unity의 URP Sample Buffer에서 UV가 Vector4로 처리되는 이유는 여러 가지가 있습니다. 이것은 단순히 UV 좌표를 넘어서는 추가적인 기능과 유연성을 제공합니다:

1) Clip Space와 Homogeneous Coordinates

  • 렌더링 파이프라인에서, 화면 좌표는 Clip Space 또는 Normalized Device Coordinates (NDC)로 표현됩니다.
  • NDC 또는 Clip Space 좌표는 종종 Vector4 (x, y, z, w) 형태로 표현되며, 여기서:
    • x, y: UV 좌표처럼 보이는 텍스처 좌표.
    • z: 깊이(Depth) 값.
    • w: 원근 분할(Perspective Division)에 사용되는 값.
  • UV 좌표를 Vector4로 사용하는 이유:
    • GPU가 원근 투영(Perspective Projection)을 처리하는 과정에서, 원근 분할을 적용하기 위해 w 값을 필요로 합니다.
    • 최종 화면 텍스처 샘플링에서 원근 왜곡을 보정하는 데 사용됩니다.

2) 고차원 좌표 계산

  • 일부 상황에서는 추가 데이터(z, w)가 필요할 수 있습니다:
    • z: 예를 들어, Depth-based Effects에서 깊이 값을 사용할 수 있습니다.
    • w: 원근 조정, 클립 공간 계산, 또는 특정 고차원 UV 효과를 구현하는 데 사용됩니다.

3) GPU와 메모리 구조

  • 현대 GPU는 대부분의 데이터를 4D 벡터(Vector4)로 처리합니다. 이유는:
    • 성능 최적화: GPU는 벡터 연산을 4개 단위로 수행하는 것이 효율적입니다.
    • 동일한 데이터 구조: 다른 좌표 데이터(예: 화면 공간, NDC)와 일관성을 유지합니다.

4) 추가 데이터 채널 지원

  • Unity는 UV를 Vector4로 표현함으로써 확장성을 제공합니다:
    • 첫 번째 두 성분(U, V)은 기본 UV 좌표를 나타냅니다.
    • 나머지 두 성분(W, Z)은 추가적인 데이터를 나타내거나 특정 효과(예: Parallax Mapping, Distortion)에서 사용될 수 있습니다.

🏷️ Unity :: What is Mask Map in the HDRP?

1. Ambient Occlusion 설정 위치

Mask Map을 통해 AO 데이터를 설정

  • HDRP의 Lit Material에서 Ambient Occlusion 값은 Mask Map에 포함되어야 합니다.
  • Mask Map은 하나의 텍스처에 여러 채널(R, G, B, A)을 사용하여 데이터를 저장합니다.

Mask Map 채널 구성

  • R (Red): Metallic
  • G (Green): Ambient Occlusion
  • B (Blue): Detail Mask (옵션)
  • A (Alpha): Smoothness

즉, Ambient Occlusion 값은 Mask Map의 Green 채널에 포함됩니다.


2. Mask Map 추가 방법

  1. Mask Map 준비:

    • Photoshop, Substance Painter, Blender 등에서 AO 데이터를 생성합니다.
    • AO 데이터를 Mask Map의 Green 채널에 저장합니다.
    • Metallic, Smoothness, Detail Mask 데이터도 포함시킬 수 있습니다(필요한 경우).
  2. Material 설정:

    • Mask Map 텍스처를 생성한 후 Material의 Mask Map 슬롯에 텍스처를 추가합니다.
    • 이 슬롯은 Surface Inputs > Mask Map에서 찾을 수 있습니다.
  3. AO 강도 조정:

    • Mask Map의 Green 채널에 저장된 AO 값의 강도는 자동으로 반영되며, 강도를 직접 조정하려면 쉐이더를 커스터마이즈하거나 AO 값이 포함된 텍스처를 수정해야 합니다.

3. Ambient Occlusion만 별도로 넣고 싶을 때

Mask Map을 사용하지 않고 AO만 별도로 넣고 싶다면:
1. Custom Shader:

  • AO 데이터를 처리할 커스텀 셰이더를 작성하여 별도의 AO 텍스처를 입력받도록 설정합니다.
  1. Post-Processing AO:
    • HDRP에서는 포스트 프로세싱을 통해 SSAO(Screen Space Ambient Occlusion)을 추가로 활성화할 수 있습니다.


📖 대마왕의 유니티 URP 셰이더 그래프


Part 22 | 스텐실(Stencil)

스텐실 버퍼

  • 일반적으로 한 픽셀에 8비트 (0~255~) 값을 가진 버퍼 이미지
  • 프레임 디버거를 활용하지 않는 이상 화면에는 안 보인다
  • 유니티에서는 보통 Z 버퍼와 함께 만들어진다
  • 흑백의 이미지로 되어 있는 현재 화면 사이즈의 빈 이미지

01 스텐실 옵션

Stencil

  • Value : 스텐실을 제어하기 위한 레퍼런스 값. 지금 그리고자 하는 나의 스텐실 값이다.
  • Compare Function : Ref값을 비교해서 어떤 행동 할 건지
  • Pass, Fail : 그리는데 성공하거나 실패했다면 그 픽셀 위치 스텐실 값 어떻게 할건지
  • Z Fail : 그리는데 실패했는데 그 이유가 Z 때문이라면 그 픽셀 위치 스텐실 값 어떻게 할 건지

02 스텐실 준비하기

스텐실은 투시 카메라, X-Ray 카메라 등 보이지 않는 것을 보이게 한다거나 하는 등의 작업에 많이 사용된다

  • 조각상에 Statue 레이어, 벽에 Wall 레이어를 설정한다
  • Create > Rendering > URP Universal Renderer > 'Stencil Renderer' 명명
  • 렌더러 파이프라인 애셋 선택 > Rederer List에 Stencil Renderer 추가 > Set Default
  • Stencil Renderer 선택
    • Opaque Layer Mask에서 Wall 레이어 끄기
    • Add Renderer Feature > Render Objects > Wall Renderer 명명
      • Event는 AfterRenderingOpaques, Layer Mask는 Wall 선택
      • 불투명 오브젝트를 그린 다음에 Wall을 그리라는 명령 내린 것
    • Overrides > Stencil 활성화
      • Value는 1, Compare Function은 Equal, Pass는 Replace
      • 다른 스텐실 값을 비교해(Compare) 봐서 어떤 값이 있더라도 그냥 다 그리고(Always), 그리는데 성공한(Pass) 픽셀은 내 Value인 1로 바꿔(Replace)라는 뜻
      • Wall이 있는 부분은 스텐실 값이 1이 되고, 나머지 영역은 전부 0으로 남아있다.
  • 셰이더 만들고 붉은색을 Base Color에 연결
    • Graph Inspector > Depth Test > Always
    • 기존 Depth 값을 무시하고 찍어버리기 때문에 어떤 경우라도 가장 앞에 찍힘
  • Stencil Renderer 선택 > 새 'Render Objects' 렌더러 피쳐 추가
    • Event는 AfterRenderingOpaques, Layer Mask는 Statue 선택
    • Overrides > Material > 만들었던 붉은색 셰이더를 적용한 머테리얼 설정
    • Overrides > Stencil 활성화
      • Value는 1, Compare Function은 Equal
      • 스텐실 값이 1이랑 같을 때만 그린다는 명령 내린 것

wall 그리고, 그려진 영역에 스텐실 값 1로 적은 다음에
스텐실 값 1인 곳에 빨간색 머테리얼 가진 석상을 다시 한 번 그린 것.

Part 23 | 포스트 프로세스 (Post Process)

01 포스트 프로세스를 위한 기본 작업

포스트 프로세스

02 흑백 포스트 프로세스 만들기

  • 렌더러 새로 만들어서 파이프라인에 적용시킨다
  • 렌더러에 Full Screen Renderer Feature 추가한다
  • 렌더러 피쳐에 Full Screen Pass Shader Graph 만들고 적용시킨 머테리얼 적용시키기
  • 셰이더 그래프에서 URP Sample Buffer와 Vector 3 값을 외적한다
  • URP Sample Buffer 노드 : 현재 렌더된 프레임, 현재의 스크린 텍스쳐를 가져온다
  • Vector 3 외적하는 이유 : 흑백으로 만들어주려고. 인간 눈 색깔 받아들이는 어쩌구 그거 계수
  • BlitSource : 라이팅, 그림자, bloom 같은 이전의 렌더링, 포스트 프로세싱 결과 가져옴

03 블러 만들기

Box blur

박스 블러 : 모든 칸이 자신의 색깔을 /9해서 인접한 8칸에 뿌려서 이미지 만듦 (물론 자기 자신도 더해짐)

  • UV 좌표는 0~1 사이다.
  • 한 픽셀은 UV를 화면의 픽셀 사이즈로 나눈 크기다.
  • Screen 노드를 사용하면 현재 화면의 픽셀 사이즈를 얻어올 수 있다.

겨우 9픽셀 블러 넣은거라 차이가 크진 않다.
이것보다 늘리면 더 효과가 강해지겠지만, 연산이 많아지게 된다.
평균값으로 만드는 블러 방식이라 품질이 좋은 편도 아니다.

Troubleshooting

  • URP sampling buffer 포함한 서브 그래프 만들었더니 Validation: URP Sample Buffer Node is not allowed by Custom Render Texture implementation 에러 발생.
  • 이 노드는 Fullscreen Shader Graph용으로 만들어진거라 다른 곳에서 쓰면 안된다고 함. 만드는 거 자체는 문제는 없다고 함.
  • 만들었더니 unrecognized identifier 'TEXTURE2D_X' at line 181 오류 발생
  • 검색했더니 HDRP 전용 기능이라고 함. gpt한테 물어봤더니 원래 HDRP 코드도 같이 생성되는게 맞다고 함. 이유는 정확히 안 알려줌.
  • 근데 무시하고 그냥 사용해봤더니 픽셀 이동 잘만 함
  • 셰이더 그래프 창 닫았다가 다시 여니까 경고창도 없어짐

다운샘플링 해보려고 했는데 그 기능 자체는 제공되는 셰이더 코드가 해주고,
셰이더 그래프는 좌표를 알맞게 바꾸는 방식으로 수정하는 것만 남아있어서 일단 스킵.
실제로는 다운샘플링 해줘야 연산도 적어지고 효과도 커진다고 함.

Gaussian Blur

정규분포 기반으로 픽셀들을 가로 7칸에 걸쳐 배분해준다.
렌더 피쳐 새로 만들고 세로축에 대해 배분해주는 머테리얼 추가로 넣어주면 가로도 세로도 블러됨.
이미 가로 블러가 된 이미지를 가지고 세로로 블러하는 것이기 때문에 가볍게 연산할 수 있다.

어떤 연산이 셰이더에서 무거운 연산일까?

  • 필요 없는 연산은 제거해야 한다
  • 알파 블렌딩(Transparent)는 무겁다
  • Lit 셰이더는 SimpleLit 등에 비해 그 자체로 무겁다
  • 텍스쳐가 아니라 연산으로 그림 그리는 노드들은 일반적으로 무겁다

04 비내리는 효과 만들기

  • PP_Rain이라는 Fullscreen Shader Graph와 머테리얼을 만들어 Post Process Renderer의 Renderer Feature에 적용한다
  • Post Process Renderer 말고도 다른 Renderer가 파이프라인에 존재해야 한다
  • 제공된 파티클을 땅 아래쪽에 잘 숨기고, 레이어를 Particle로 설정한다
  • 파티클만 촬영할 카메라를 만들어 준다
    • Projection은 Orthgraphic
    • Renderer은 PP Renderer말고 기본 렌더러
    • Culling Mask는 Particle
    • Environment > Background Type > Solid Color > 검은색
    • 카메라를 적절히 위치시켜 파티클을 촬영한다
  • 촬영한 카메라를 렌더 텍스쳐로 만든다
    • Create > Render Texture
    • size는 2048x2048
    • Color Format은 R16_UNORM (16비트 채널 하나만 받음)
    • 렌더 텍스쳐를 파티클 촬영 카메라의 Output Texture에 연결해준다
  • 렌더 텍스쳐를 Normal From Height 노드를 이용하여 노말맵으로 바꿔주고, URP Sample Buffer의 UV에 넣어준다

Troubleshooting
셰이더 그래프 만들었는데 작동 안 함. 렌더러 피쳐의 Requirements에서 Normal을 체크해주니 작동됨.



🎮 Random Study


Project 2P

환경광 안 지워짐

바닥이 빛남

  • directional light 삭제하고
  • Rendering > Lighting에서 intensity도 0으로 했고
  • 시점 변경해봐서 프레넬 아닌것도 확인
  • emission도 없음

→ skybox 지우고, ambient color 검은색으로 만들었더니 완전히 깜깜해짐



0개의 댓글