| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ability task
- 게임 개발
- linear regression
- Aegis
- gas
- widget
- local prediction
- gameplay effect
- MAC
- Multiplay
- CTF
- Unreal Engine
- 유니티
- gameplay ability system
- animation
- 언리얼 엔진
- gameplay tag
- listen server
- 언리얼엔진
- Replication
- attribute
- 게임개발
- unity
- os
- UI
- C++
- photon fusion2
- rpc
- stride
- 보안
- Today
- Total
Replicated
[Graphics] Shader와 조명, 재질 처리 본문
Shader의 종류 및 설명
1. Vertex Shader
역할
- 정점(Vertex) 데이터 처리
입력
- 3D 모델의 정점 위치, 색상, 법선 벡터, 텍스처 좌표 등
출력
- 변환된 정점 위치(클립 공간), 보간 가능한 데이터(색상, 텍스처 좌표 등)
주요 작업
- 월드/뷰/프로젝션 매트릭스를 이용한 정점 위치 변환
- 조명 계산 (기초 수준)
- 정점당 애니메이션 처리
2. Fragment Shader
역할
- 화면에 출력될 픽셀의 색상 계산
입력
- 화면에 출력될 픽셀의 색상을 계산
출력
- 최종 픽셀 색상
주요 작업
- 텍스처 샘플링
- 조명 계산
- 투명도, 그림자, 반사 등의 효과 처리
3. Geometry Shader
역할
- 하나 이상의 정점으로부터 도형(점, 선, 삼각형)을 생성하거나 수정
입력
- 프리미티브
출력
- 새로운 정점 모음
주요 사용 사례
- 실시간 실루엣 라인 생성
- 그림자 볼륨 생성
- LOD 또는 변형
4. Tessellation Shader
* Tesellation Control Shader와 Tesselatiion Evaluation Shader 두 단계로 나뉨
역할
- 메쉬를 더 세밀하게 쪼갬
- Control Shader: 테셀레이션 양을 제어
- Evaluation Shader: 분할된 정점의 위치 계산
용도
- 곡면 표현, 지형 디테일, Subdivision 등
5. Compute Shader
역할
- 그래픽스 파이프라인과 별개로 GPU에서 범용 연산을 처리
입출력
- 개발자가 정의한 데이터 구조
용도
- 병렬 연산 처리 (물리 계산, 파티클 시뮬레이션)
- 이미지 처리, AI 추론 등
쉐이딩
- 3D 객체 표면에서 빛과 그림자를 계산하여 현실감을 부여하는 과정. 빛과 수학적 계산 이용
빛과 쉐이딩
- 빛의 방향과 표면의 방향이 쉐이딩 결과를 결정
법선 벡터와 빛 벡터
- 법선 벡터: 표면에서 수직으로 뻗어 나가는 벡터
- 빛 벡터: 빛이 표면에 닿는 방향을 나타내는 벡터
- 두 벡터의 각도를 계산하여 밝기와 색상을 결정
단위 면적당 조명량은 cos( θ )에 비례
* 조명량 변화는 텍스처와 색상이 아닌 기하학적 관계에 의존
디퓨즈 반사 (Diffuse Reflection), 확산 반사
- 디퓨즈 머티리얼(Kd): 표면이 모든 방향으로 고르게 반사
- Kd: 표면의 확산 계수
- 표면의 밝기는 입사각에 따라 달라짐 ( cos( θ ) )
- 텍스처가 적용된 표면 -> 텍스처에서 샘플링한 색상이 Kd 대체
- 빛의 강도와 색상 (I)
- 강도(Intensity): 표면 밝기 결정
- 색상(Color): 표면 색상에 영향
람버트 디퓨즈 모델 (Lambert Diffuse Model)
- C = Kd x I x cos( θ )
- 가장 단순한 조명 모델로, 디퓨즈 반사만 계산
- 장점: 계산이 빠르고 저렴
- 반짝임 없음 -> 금속, 유리같은 재질 표현 불가
ex. 암석, 흙 등 반짝이지 않는 표면
스페큘러 반사 (Specular Reflection), 정반사
- 광택있는 표면에서 빛이 특정 방향으로 반사
- 매끄러운 표면에서 반짝임 추가 (금속, 유리)
- Ks: 광택 강도 (반사 밝기)
- cos( ϕ ) : 반사벡터(r)와 관찰자 방향(v)의 각도
- α : 광택 집중도(샤이니니스 계수) (값이 클수록 반사가 좁게 집중)
Phong Model
C = Cdiffuse + Cspecular = Icos( θ )Kd + IKs(cos( ϕ ))^α
디퓨즈 반사와 스페큘러 반사를 합산하여 표면 표현
문제점
- 빛의 입사각 효과를 반영 안함
수정
- 공통 요소 간소화 (조명 강도를 공통 요소로 묶어 계산 단순화)
- 기하학적 요소 추가: 스페큘러 반사에서도 빛의 입사각을 반영
- 음수값 처리
- 빛이 표면 뒤쪽에서 들어오는 경우: 빛이 도달하지 않는 상황 처리해서 잘못된 조명 제거
- 관찰사가 보지 못하는 경우: 반사광이 관찰자에게 도달하지 않으면 반짝임 효과 제거
조명
장면의 분위기 형성, 물체의 형태와 질감 표현, 현실감 부여
방향성 조명(Directional Light)
- 무한히 먼 곳에서 평행하게 들어오는 빛 (태양)
- 장점: 계산이 간단, 거리와 무관한 일정한 강도
- 단점: 광원 자체는 보이지 않음
포인트 라이트(Point Light)
- 한 점에서 모든 방향으로 빛 방출 (전구)
- 장점: 간단한 구조, 다양한 장면에 적용 가능
- 단점: 물리적으로 크기가 없는 점광원 근사
스포트라이트(Spotlight)
- 특정 각도와 방향으로 제한된 빛 (손전등, 무대 조명)
- 장점: 방향과 범위를 정밀하게 제어 가능
- 단점: 포인트 라이트보다 계산 복잡, 특정 영역에만 빛 집중
에어리어 라이트(Area Light)
- 표면적을 기반으로 빛 방출 (창문으로 들어오는 빛)
- 장점: 매우 사실적인 조명, 부드러운 그림자 표현
- 단점: 높은 계산 비용 (주로 고품질 렌더링에 사용)
앰비언트 조명(Ambient Light)
직접 조명 (Direct Lighting)
- 광원에서 나온 빛이 직접적으로 물체 표면에 닿는 조명
- 장점: 계산이 간단, 성능 효율적
- 한계: 간접 조명 효과(반사, 굴절)를 표현하지 못함
간접 조명 (Indirect Lighting)
- 빛이 물체에 닿은 후 다른 표면에서 반사되어 도달하는 조명
- 장점: 현실감 높은 자연스러운 주명 표현
- 한계: 계산이 복잡하고 연산 비용이 높음
앰비엔트 조명 (Ambient Lighting)
- IaKa
- 간접 조명의 대안
- 장면 전체에 균일하게 퍼지는 기본 조명. 간접 조명을 단순화한 근사치. 빛이 닿지 않는 어두운 영역 밝게 유지. 씬 전체의 기본 밝기를 유지
- 장점: 표면 방향이나 광원 위치와 무관하여 복잡한 계산 없이 일정한 밝기 제공
- 한계: 물리적 현실 반영 부족. 그림자와 반사 효과 표현 불가
C = I( cos( θ )Kd + Ks(cos( ϕ ))^α ) + IaKa
왜 앰비언트 조명이 필요한가
- 간접 조명 계산의 단순화: 벽, 천장, 바닥에서 반사된 복잡한 빛의 효과를 대신함
- 어두운 영역 문제 해결: 빛이 닿지 않는 영역에도 최소한의 밝기 추가
- 씬의 기본 밝기 유지: 장면을 자연스럽고 균일하게 표현
역할
- 직접 조명의 한계 해결: 어두운 영역을 보완하여 장면의 기본 밝기 추가. 최종 조명 공식에 더함
- C = Cambient + Cdiffuse + Cspecular
- Ka: 앰비언트 반사 계수, 물체 표면이 앰비언트 조명을 반사하는 정도, 보통 물체의 기본 색상과 연관
- Ia: 앰비언트 조명의 강도 (씬 전체의 기본 조명 강도)
블린 퐁 모델 (Blinn-Phong)
Phong 모델 최적화한 버전
반사 벡터 대신 하프 벡터 사용
* 차이는 정반사(Specualr) 계산 방식에 국한됨
* 하프 벡터: 빛 방향과 시선 방향의 평균 벡터
왜 반사벡터 대신 하프벡터를 쓰는 것이 효율적인가?

반사 벡터는 내적, 스케일링하고 빼기까지 해야 함 (내적, 곱셉, 빼기)

하프 벡터는 평균 구하고 정규화하면 끝남
GPU적으로도 코드 단순성으로도 이게 더 빠름 (덧셈, 정규화)
세 모델 비교
| 모델 | 반사 종류 | 계산 복잡도 | 정반사 | 특징 요약 |
| Lambert | 확산만 | ★☆☆☆☆ | 없음 | 단순하고 빠름, 광택 없음 |
| Phong | 확산 + 정반사 | ★★★☆☆ | 있음 | 광택 표현 가능, 느림 |
| Blinn-Phong | 확산 + 정반사 | ★★☆☆☆ | 있음 | Phong과 유사, 더 효율적 |
* 램버트 자체는 주변광(Ambient Light) 포함 안하는데 실제로는 함께 사용
퐁이든 블린 퐁이든 사실 조명 모델 자체가 Ambient 조명 자체를 포함하지 않음
그냥 같이 쓰는 거
PBR (Physically Based Rendering)
물리 기반의 조명과 재질 모델링을 통해 더 현실적인 그래픽 표현을 목표로 하는 렌더링 기법
퐁, 블린 퐁같은 고전 조명 모델보다 자연스러운 반사, 재질 차이, 조명 반응을 표현할 수 있도록 설계됨
핵심 개념
1. 에너지 보존 (Energy Conservation)
- 표면이 반사하는 빛의 양은 입사된 빛보다 많을 수 없음
- 반사 + 확산 <= 1 이 되도록 재질 계산
2. 정확한 반사 모델 (Microfacet 기반 BRDF)
- 표면이 아주 작은 거친 미세면(Microfacet)으로 구성되어 있다고 가정
- BRDF(Bidirectional Reflectance Distribution Function)를 통해 빛의 입사 및 반사 방향에 따라 색과 강도 계산
- 대표적인 BRDF: Cook-Torrance 모델
3. 정확한 입사광 처리 (IBL, HDR)
- 주변광(Ambient Light)은 단순 고정값이 아닐, 실제 환경 텍스처로부터 샘플링 (HDR, High Dynamic Range)
- 이를 IBL (Image-Based Lighting) 이라 함
4. 일관된 조명 반응
- 어떤 조명이든 재질이 물리적으로 일관된 방식으로 반응
- 광택, 거칠기, 금속성 등이 표준화된 파라미터로 제어됨
| 장점 | 설명 |
| 현실적인 표현 | 금속, 플라스틱, 나무 등 다양한 재질의 특징을 자연스럽게 표현 |
| 조명 일관성 | 다양한 조명 조건에서 재질이 동일하게 반응 |
| 환경 조명 반영 가능 | 실시간 HDR 환경 조명 (IBL) 사용 가능 |
| 표준화된 재질 파라미터 | 아티스트 간 협업이 쉬움, 재사용 용이 |
Unity나 Unreal은 기본적으로 PBR 기반
PBR의 재질 맵, 각 맵은 표면의 한가지 특성만 담당
| 이름 | 설명 |
| Albedo Map | 표면의 기본 색상 텍스처 |
| Normal Map | 표면의 미세 굴곡 표현 (조명 반응용) |
| Metallic Map | 금속 여부 지정 |
| Roughness Map | 거칠기 정도 (빛 반사에 영향) |
이 재질 맵을 통해서
| 구성 | 설명 |
| Diffuse | 알베도 색, 거칠고 불투명한 면에서 반사됨 |
| Specular | 금속, 유리처럼 빛을 특정 방향으로 반사함 |
| Roughness | 표면의 반사 흐림 정도 결정 (1=거침, 0=매끈) |
| Metallic | 금속 여부 결정 (금속이면 거의 specular로 반사) |
조명 모델의 계산 결과를 얻음
*Normal Map은 조명 반응을 위조해서 울퉁불퉁한 것처럼 보이게 만드는 텍스처임
Alpha Blending
픽셀의 투명도(Alpha값)를 이용해 두 색상을 섞는 기술
유리, 물, 연기같은 투명하거나 반투명한 물체 표현 가능
각 픽셀은 RGBA로 표현
ColorFinal = α*ColorSrc + (1 - α)*ColorDst
- Src: 현재 렌더링하려는 픽셀 (투명 객체)
- Dst: 이미 프레임 버퍼에 그려진 배경 (픽셀)
주의 사항
1. 렌더 순서
- 투명한 오브젝트는 반드시 뒤에서 앞으로 그려야 함. 누적 연산이기 때문
- 투명 오브젝트만 따로 분리해서 깊이값 기준 소팅 후 그려야 함
2. Depth Buffer 사용 제한
- 뒤쪽 투명 픽셀이 잘못 가려질 수 있어 대부분의 투명 객체는 Depth Wirte 꺼야 함
- 보통 Depth Test는 켜둠
3. Primultiplied Alpha 고려
- 경우에 따라 소스 색상이 이미 알파값으로 곱해져 있을 수 있는데 이 경우 공식을 다르게 적용
4. MSAA (Multisample Anti-Aliasing) 충돌
Shader에서 텍스처를 샘플링하는 방식
지정된 좌표로부터 색상 값을 읽어오는 과정인데, Fragment Shader나 Compute Shader에서 발생
기본적으로 uv 좌표 기반으로 색을 가져옴
영향을 주는 요소
1. 보간 방식 (Filtering)
텍스처 좌표는 소수점일 수 있으니 픽셀 사이 색 보간 필요
- 가장 가까운 픽셀 색 사용(NEAREST) 혹은 인접한 4픽셀 평균값(LINEAR)
- Mipmap 사용 시 삼중 선형 보간, 선형 보간 + mipmap 단일 선택
2. 주소 지정 방식 (Wrapping Mode)
텍스처 좌표가 0~1 범위를 벗어날 경우 처리 방식
- 반복(타일링) - REPEAT
- 가장자리 색 유지 - CLAMP_TO_EDGE
- 대칭 반복 - MIRRORED_REPEAT
- 지정한 색상으로 채움 (경계 밖) - CLAMP_TO_BORDER
3. Mipmap
텍스처의 여러 해상도 버전을 자동 생성해 거리나 크기에 따라 적절한 해상도로 텍스처를 샘플링
장점
- 원근 왜곡 감소
- 성능 개선
4. Anistropic Filtering
- 경사로 보이는 표면에서 텍스처가 흐려지거나 왜곡되는 걸 방지
- 고품질 텍스처를 원할 경우 사용 (성능 소모 있음)
'지식' 카테고리의 다른 글
| [Graphics] 그래픽스 성능 최적화 (0) | 2025.05.30 |
|---|---|
| [Graphics] 좌표 변환 및 카메라 처리 (0) | 2025.05.30 |
| [Graphics] 렌더링 파이프라인 및 클리핑, 컬링 (0) | 2025.05.29 |
| [Graphics] 그래픽스 기초 (0) | 2025.05.28 |
| [Graphics] Draw Call과 CPU, GPU 병목 (0) | 2025.05.28 |