오구의코딩모험

[DirectX] Camera, Resources, Lighting, Normal Mapping 본문

Game/DirectX

[DirectX] Camera, Resources, Lighting, Normal Mapping

오구.cpp 2024. 12. 31. 15:52
반응형

게임 개발에서 배우는 다양한 개념과 그래픽 처리

 

게임 개발에는 데이터 관리, 그래픽 처리, 좌표 변환 등 다양한 개념이 포함됩니다. 

이번 글에서는 union, 좌표계 변환, 광원(Light)와 의 특징, 그리고 Normal Mapping 을 중심으로

학습한 내용을 정리합니다.

 




1. 데이터 관리와 코드 구조

 

Union  
- union은 동일한 데이터를 여러 형식으로 접근할 수 있게 합니다.  
- 메모리를 효율적으로 관리할 수 있지만, 데이터 해석의 일관성에 유의해야 합니다.  

 

DirectX SimpleMath 헤더  
- DirectX의 SimpleMath 헤더에는 좌표계 변환과 관련된 함수들이 포함되어 있습니다.  
- 단, 오른손 좌표계 를 기준으로 동작하므로, 부호 설정을 정확히 해야 합니다.  

코드 구조의 효율성
1. sealed : 변경할 수 없도록 클래스를 설정합니다.  
2. inl 파일 : 헤더 파일의 코드 양이 많을 경우, 함수 구현부를 분리하여 **inl 파일**에 작성합니다.  
3. friend class : 특정 클래스에 다른 클래스의 private 멤버 접근 권한을 부여합니다.  

 



클래스와 객체 관리
- GameObject, Component, Material, Mesh, Shader, Texture는 모두 Object 클래스를 상속받아 일관성 있게 관리합니다.  
- 싱글톤 : 전역적으로 하나의 인스턴스를 유지하기 위해 사용하며, `DECLARE_SINGLE`과 같은 매크로를 통해 구현됩니다.  

템플릿 문법
- 다양한 형식에서 공통적인 기능을 구현하려면 template 문법을 사용합니다.  
- 코드 재사용성과 가독성을 높이는 데 유용합니다.  

 

 

 

2. Light (광원)과 빛의 특징

 

 

광원의 종류  
1. Directional Light : 태양처럼 전역적으로 빛을 비추는 광원입니다.  
2. Point Light : 특정 구 범위 내에서 빛을 비추는 광원입니다. (예: 횃불)  
3. Spot Light : 특정 방향으로 빛을 비추는 광원입니다. (예: 손전등)  

의 특징
- Ambient(환경광) : 빛이 물체를 만나 주변으로 퍼지는 효과입니다.  
- Diffuse(난반사) : 빛의 각도에 따라 물체가 받는 빛의 양이 결정됩니다.  
  * 난반사는 람베르트 코사인 법칙에 따라 계산됩니다.  
- Specular(정반사) : 빛이 물체에 부딪힌 각도로 다시 반사되는 효과입니다.  
  * 햇빛이 반사되어 눈이 부시는 경우가 대표적인 예입니다.  

Normal 벡터와 좌표계
- Normal : 물체 표면에 수직인 벡터로, 빛의 반사를 계산할 때 사용됩니다.  
- 일반적으로, 빛 계산은 world space 또는 view space에서 수행됩니다.  
  * view space 에서 계산하면 카메라 좌표를 따로 계산할 필요가 없어 편리합니다.  

 

 


3. Normal Mapping (Bump Mapping)



Normal Mapping이란?
- 정점의 normal 벡터가 동일하게 설정되어 있으면 빛의 반사가 단조롭게 표현됩니다.  
- Normal Mapping은 픽셀 단위로 normal 벡터를 추가해 빛 반사를 더욱 세밀하게 표현하는 기법입니다.  

Normal Texture
- Normal Texture는 local 좌표계가 아닌 탄젠트 좌표계 에 존재합니다.  
- 탄젠트 좌표계에서는 일반적으로 파란색을 띄고 있습니다.  

 


4. HLSL과 데이터 정렬 

 

// 2 x 16byte elements
cbuffer IE
{
	float4 Val1;
    float2 Val2;	// starts a new vector
    float2 Val3;
};

// 3 x 16byte elements
cbuffer IE
{
	float2 Val1;
    float4 Val2;	// starts a new vector
    float2 Val3;	// starts a new vector
};

 

HLSL의 16-byte boundary
- HLSL에서는 16-byte 경계(boundary)를 지켜야 합니다.  
- 데이터를 정렬하지 않으면 예상치 못한 오류가 발생할 수 있으므로, padding을 추가하거나 Vec4 형식을 사용하는 것이 일반적입니다.  

데이터 정렬 방식  
- 데이터를 16-byte 단위로 맞추기 위해 적절히 배치하거나 추가 공간을 확보합니다.  
- 예를 들어, float2를 여러 개 사용할 경우 float4 형식으로 변환하거나 새 벡터로 시작하도록 조정합니다.  

 




정리

 

1. 광원의 선택   
   - 게임에서 조명의 종류를 적절히 선택하여 분위기를 효과적으로 연출하세요.


2. Normal Mapping 활용   
   - 세밀한 빛의 표현이 필요할 때 Normal Mapping을 적용하세요.


3. 좌표계 변환   
   - 좌표 변환 순서와 기준 좌표계(world space 또는 view space)를 명확히 설정하세요.


4. HLSL 데이터 정렬   
   - 16-byte boundary를 지켜 데이터가 올바르게 해석되도록 해야 합니다.

 


이번 글에서는 union과 객체 관리 방식, 광원의 종류와 빛의 특징, 그리고 Normal Mapping의 중요성을 정리했습니다.

게임 개발자는 항상 효율적이고 직관적인 방식으로 데이터를 처리하고,

빛과 그래픽 표현을 최적화하는 역량 또한 중요하다고 생각됩니다.

반응형
Comments