환경매핑은 큐브매핑을 활용해서 물체에 주변 사물이 반사되어 비치는 것을 구현하는 기술이다.
먼저, 반사를 테스트 하기 위한 구체 렌더러 하나를 추가해주었다.
우측에 검정색 동그라미가 하나 보인다. 아직 텍스쳐를 입히지 않아서 새까맣게 보인다.
일단 환경매핑 쉐이더를 작성해보자.
버텍스 쉐이더는 기존과 완전히 동일하다.
#include "LightHeader.hlsli"
cbuffer WorldLightBuffer : register(b0)
{
float3 EyeWorld;
float Padding;
Light Lights[LIGHT_NUM];
};
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float2 TexCoord : TEXCOORD;
float3 WorldPos : POSITION1;
float3 WorldNormal : NORMAL;
};
TextureCube CubeMapTexture : register(t0);
SamplerState Sampler : register(s0);
float4 main(PixelShaderInput _Input) : SV_TARGET
{
float3 EyeDir = _Input.WorldPos - EyeWorld;
EyeDir = normalize(EyeDir);
_Input.WorldNormal = normalize(_Input.WorldNormal);
float3 RefEyeDir = reflect(EyeDir, _Input.WorldNormal);
float4 Color = CubeMapTexture.Sample(Sampler, RefEyeDir);
return Color;
}
이렇게 픽셀쉐이더를 작성해주었다.
이존의 배경을 만들기 위한 큐브매핑과 다르게 Light 정보를 상수버퍼로 연결해주었다.
일단은 빛을 적용하지 않고, EyeWorld만 가져와서 사용할 것이다.
물체가 반사되어 눈으로 들어오는 과정을 역산하여, 눈으로부터 나가는 광선이 반사되었을 때 큐브맵의 어디에 충돌하는가를 계산하여 색을 정하는 것이다.
공식은 매우매우 간단하다. EyeDir(눈이 물체를 바라보는 방향 벡터)를 WorldNormal에 대해 반사시킨 벡터로 큐브맵을 샘플링하면 된다.
텍스쳐도 적용하고, 해당 쉐이더를 연결해주면 아래와 같은 결과가 나온다.
구체에 배경이 잘 반사되어 비치는 것을 확인할 수 있다.
'프로젝트 > Direct X 그래픽스' 카테고리의 다른 글
프로젝트 : DirectX를 활용한 그래픽스 (20 - 포스트 프로세스 (1)) (0) | 2024.05.25 |
---|---|
프로젝트 : DirectX를 활용한 그래픽스 (19 - 텍스쳐 로드 수정) (0) | 2024.05.17 |
프로젝트 : DirectX를 활용한 그래픽스 (17 - 큐브매핑) (0) | 2024.05.14 |
프로젝트 : DirectX를 활용한 그래픽스 (16 - 림 라이트) (0) | 2024.05.14 |
프로젝트 : DirectX를 활용한 그래픽스 (15 - 3D 모델링 파일 로드) (0) | 2024.05.13 |