Unity - Shader

[TOC]

쉐이더 자료형

쉐이더 Properties

명령어

함수

UV

텍스쳐 옵션

유니티에 내장된 시간 변수

#pragma

버텍스 정보

물리 기반 쉐이더

주변 환경에 따른 재질 변화를 물리 법칙에 기반하여 실시간으로 재질을 구현해주는 사실적인 쉐이더 표현 기법

Matallic Value Chart [https://docs.unity3d.com/Manual/StandardShaderMaterialCharts.html]

노멀맵

노멀맵 저장 방법

노멀벡터의 x, y, z 값을 저장할 때 z값은 x, y 값으로 계산해낼 수 있으므로 x, y 값만 저장한다.

저장 포맷은 DXTnm(DXT5nm)이라는 방식을 사용하는데 이 포맷은 DXT와 같지만 R, G를 A, G에 저장하도록해서 가장 넓은 대역폭을 가진 A와 G를 활용하는 포맷이다.

DXT는 다음과 같이 배분되어 있다.

R:G:B:A = 5:6:5:8

UnpackNormal 함수

 inline fixed3 UnpackNormal(fixed4 packednormal)
 {
 #if defined(SHADER_API_GLES) && defined(SHADER_API_MOBILE)
     return packednormal.xyz * 2 - 1;
 #else
     fixed3 normal;
     normal.xy = packednormal.wy * 2 - 1;
     normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y);
     return normal;
 #endif
 }
x, y 값에 x2 - 1 해주는 이유

좌표값이 양수만 있을 경우 각도를 90도까지밖에 나타낼 수 없으므로 -1~1 사이의 값을 나타내기 위해 저장 시 1을 더하고 x0.5 해주기 때문

UnpackNormal 함수가 normal.z 구하는 원리

normal 벡터는 길이가 1인 벡터이므로 x, y 값을 알면 삼각함수를 이용하여 z값을 구할 수 있다. \(\begin{gather*} 1=\sqrt{x^{2} +y^{2} +z^{2}}\\ 1=x^{2} +y^{2} +z^{2}\\ z^{2} =1-x^{2} -y^{2}\\ \therefore z=\sqrt{1-x^{2} -y^{2}} \end{gather*}\)

프레스넬 효과(Fresnel Effect)

fixed Luminance (fixed3 c)

컬러를 휘도(그레이스케일)로 변환합니다.

IBL RImLight

외곽라인이 빛나게 하는것

렌더링 파이프라인

3차원 이미지를 2차원 래스터 이미지로 표현하기 위한 단계적 방법

래스터란?

렌더링 파이프라인 순서

  1. 로컬 변환
  2. 월드 변환
  3. 뷰 변환
  4. 후면 추려내기(back-face culling)
  5. 조명(Light)
    • 광원 벡터, 시선 벡터, 법선 벡터 등 조명 계산식을 이용해 정범의 색상을 계산
  6. 테셀레이션
    • GPU에서 정점을 증가, 감소
  7. 클리핑
    • 시야 절두체를 벗어나는 폴리곤 자르기
  8. 투영
  9. 뷰포트
    • 렌더 타겟(윈도우)의 화면 좌표로 변환
  10. 래스터라이즈
    • 폴리곤을 픽셀로 변환하고 컬러를 계산
  11. 픽셀 쉐이더
    • 텍스처 컬러와 (래스터라이즈된)정점 컬러를 사용하여 픽셀의 최종 색상 결정
  12. 렌더 백앤드
    • 비디오 메모리에 넣을지 결정
    • 알파 테스트(Alpha Test)
      • 알파값이 있으면 1, 없으면 0으로 판단하여 그릴지 안그릴지 판단. 연산 속도가 빠르다.
    • 스텐실 테스트(Stencil Test(buffer))
      • 그리지 말아야할 부분인지 체크
    • 깊이 테스트(Z buffer Test) - 비디오 메모리에 넣을 방법
    • 알파 블렌딩(Alpha Blending)
    • 안개(Fog)
    • 안티앨리어싱(Anti-aliasing)
  13. 출력

Input 구조체

버텍스 구조체

렌더링 방식

탄젠트 좌표계

z buffer

Z Fighting

같은 z값을 가진 픽셀이 매 프레임 먼저 그려지기위해 경합하며 깜빡이게 보이는 현상

알파의 원리

알파가 느린 이유

알파 블렌딩에서 알파 소팅의 문제

알파 테스트