GameChoi
Choi Programming
GameChoi
전체 방문자
오늘
어제
  • 분류 전체보기 (468)
    • C++ Algorithm & Study (184)
      • C++ & Algorithm Strategies (45)
      • Game Math & DirectX 11 (72)
      • Server + UE5 (29)
      • Lyra Clone Coding (37)
    • Create Game (284)
      • [Window API] Game Client & .. (55)
      • [DirectX] DirectX 2D & 3D (155)
      • [UE5] BLUEPRINT & C++ (74)
    • odds and ends (0)
      • English (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Player State
  • UE5
  • client
  • GAME Client
  • protobuf
  • Direct3D
  • Game Server
  • session
  • c++
  • RPG Game
  • core
  • Other Character
  • server
  • Player Move Packet
  • Destination Move Packet
  • Network Worker
  • job queue
  • Game Room
  • Direct11
  • Algorithm Strategies

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GameChoi

Choi Programming

[Direct11] 35. 3D Direct Application - Cube Mapping System
C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 35. 3D Direct Application - Cube Mapping System

2023. 6. 27. 18:59

1. 3D Direct Application

1.1 Cube Mapping System

1.1.1 Cube Mapping

 - 여섯 장의 Texture를 어떤 좌표계의 좌표축들에 정렬된 입방체의 여섯 면으로 사용

   - 입방체 Texture가 축에 정렬, 각 면은 좌표계의 각 주축 방향에 대응, 입방체의 특정 면을 지칭하는 구조체 사용

typedef enum D3D11_TEXTURECUBE_FACE;

 - 2차원 Texture와 달리 입방체 맵에서는 한 텍셀을 2차원 Texture 좌표로 지칭X, 3차원 Texture 좌표가 필요

   - 원점에서 시작하는 하나의 3D Lookup Vector를 정의

     - Lookup Vector의 3차원 좌표가 지칭하는 텍셀은 Lookup Vector가 입방체 맵과 교차하는 곳의 텍셀

TextureCube gCubeMap;
SamplerState samTriLinearSam { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; };

 

1.1.2 Environment Mapping

 - 수평 시야각과 수직 시야각이 모두 90도인 카메라를 장면의 한 물체를 중심에 둠

   - 여섯 가지 좌표축 방향으로 각각 장면을 렌더링하여 이미지로 저장

     - 시야각이 90도이므로 여섯 이미지는 주어진 물체에서 본 주변 환경 전체를 담게 됨

 - 환경 맵은 환경 매핑을 적용할 각 물체마다 따로 만드는 것이 정석

   - 그러나 멀리 있는 배경 정보를 포착하는 용도로 환경 맵 하나만 사용하는 경우도 많음

     - 위의 경우 근처에 있는 물체들이 동일한 환경 맵을 공유 가능

 - 카메라가 바라보는 축 방향들이 세계 공간 좌표축들과 일치하도록 설정하여 환경 맵 이미지들을 생성

   - 세계 공간을 기준으로 환경 맵을 생성, 조회 벡터의 좌표는 환경 맵이 기준으로 한 것과 같은 공간에 존재

     - 외부의 3차원 세계 편집기에서 장면을 만들고 그 장면을 미리 여섯 개의 입방체 면 이미지들로 렌더링 가능

ID3DX11EffectShaderResourceVariable* CubeMap;
CubeMap = mFX->GetVariableByName("gCubeMap")->AsShaderResource();

1.2 Sky System

1.2.1 Sky System

 - 하늘 Texture를 입힐 기하구조로는 장면 전체를 감싸는 타원체를 사용

   - 상자 대신 타원체로 하늘을 표현하면 하늘이 더 평평해서 자연스럽게 보임

     - 지평선 멀리 있는 산들과 하늘을 나타내기 위해 타원면에 환경 맵 Texture를 입힘

 - 타원체의 표면이 무한히 멀리 있다고 가정

   - 세계 안에서 카메라가 어디로 움직이든 하늘 타원체 표면이 가까워지거나 멀어질 일은 없음

     - 무한히 멀이 있는 하늘을 구현하는 방법은 세계 공간에서 하늘 타원체 중심을 카메라 위치에 두면 됨

       - 위 방법을 사용할 경우, 카메라가 움직이면 하늘 타원체도 움직이므로 동일하게 움직이게 됨

1.2.1.1 Vertex Shader

 - 하늘이 항상 먼 평면에 있도록 설정하기 위해 z = w로 설정

   - 국소 정점 위치를 입방체 맵 조회 벡터로 사용

VertexOut VS(VertexIn vin)
{
	VertexOut vout;
	vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj).xyww;
	vout.PosL = vin.PosL;
	return vout;
}

1.2.1.2 Pixel Shader

float4 PS(VertexOut pin) : SV_Target { return gCubeMap.Sample(samTriLinearSam, pin.PosL); }

 - 깊이 함수를 <=로 설정하여 깊이 버퍼를 1로 지웠다고 할때 정규화된 깊이 값들이 깊이 판정에 실패하지 않도록 설정

DepthStencilState LessEqualDSS { DepthFunc = LESS_EQUAL; };
RasterizerState NoCull { CullMode = None; };

1.3 Mirror Reflection System

1.3.1 Mirror Reflection

 - 임의의 물체가 주변 환경을 반사하는 모습을 묘사

   - 물체의 표면은 마치 거울처럼 작용, 표면의 점P를 향한 눈은 P에 반사된 환경을 보게 함

     - 물체를 렌더링할 때 픽셀별로 반사 벡터를 계산하고, 그것을 이용하여 환경 맵의 텍셀을 추출

if (gReflectionEnabled)
{
    float3 incident = -toEye;
    float3 reflectionVector = reflect(incident, pin.NormalW);
    float4 reflectionColor = gCubeMap.Sample(samAnisotropic, reflectionVector);
    litColor += gMaterial.Reflect * reflectionColor;
}

 - 한 픽셀의 색이 전적으로 반사된 색으로 결정되는 것은 아님

   - 조명 공식을 완전히 새로 만드는 대신, 기존의 조명 공식에 반사항을 도입하는 것이 바람직 함

     - 환경 맵에서 추출한 색 & 응용 프로그램이 제어하는 일종의 반사재질을 사용

struct Material { /* ... */ float4 Reflect; };

 - 조명 공식에 이러한 반사항을 추가하면 색이 과포화될 가능성이 존재

   - 주변광 재질 계수와 분산광 재질 계수를 낮추어 주변광과 분산광이 표면에서 덜 반사되게 만듦

   - 환경 맵에서 추출한 색과 통상적인 조명 공식에 의해 계산된 픽셀 색상의 가중 평균을 사용

저작자표시 (새창열림)

'C++ Algorithm & Study > Game Math & DirectX 11' 카테고리의 다른 글

[Direct11] 37. 3D Direct Application - Normal Mapping  (0) 2023.06.30
[Direct11] 36. 3D Direct Application - Dynamic Cube Mapping System  (0) 2023.06.27
[Direct11] 34. 3D Direct Application - Picking System  (0) 2023.06.27
[Direct11] 33. 3D Direct Application - Instancing & Culling  (0) 2023.06.26
[Direct11] 32. 3D Direct Application - Camera  (0) 2023.06.26
    'C++ Algorithm & Study/Game Math & DirectX 11' 카테고리의 다른 글
    • [Direct11] 37. 3D Direct Application - Normal Mapping
    • [Direct11] 36. 3D Direct Application - Dynamic Cube Mapping System
    • [Direct11] 34. 3D Direct Application - Picking System
    • [Direct11] 33. 3D Direct Application - Instancing & Culling
    GameChoi
    GameChoi

    티스토리툴바