inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12

Lighting #3

reflectionDir 구하는 과정에서 질문 있습니다

289

김원래

작성한 질문수 3

0

안녕하세요 선생님 skybox 강의 보고 큐브를 뒤에서 본 후 질문이 생겼습니다.

float3 reflectionDir = normalize(viewLightDir + 2 * (saturate(dot(-viewLightDir, viewNormal)) * viewNormal));

이렇게 구하게 되면

saturate(dot(-viewLightDir, viewNormal))이 0 인 경우에 reflectionDir = viewLightDir이 되어서

큐브의 면 중 빛의 방향과 같은 방향에 있는 면을 마주보게 되면 ambient 만 있어야 하는데 specular 때문에 밝게 됩니다.

이 문제를 어떻게 해결하면 좋을지 궁금합니다.

directx 게임수학

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

reflectionDir를 구하는 식에서 saturate(dot(-viewLightDir, viewNormal))이 0인 경우에 reflectionDir = viewLightDir이 되어 큐브의 면 중 빛의 방향과 같은 방향에 있는 면을 마주보게 되면 ambient가 아니라 specular이 적용되어 밝게 보이는 문제가 있네요.

이 문제를 해결하기 위해서는 reflectionDir를 구할 때 saturate(dot(-viewLightDir, viewNormal))이 0이 아닌 값이 되도록 조정해야 합니다. 보통 이를 위해 reflectionDir를 구하기 전에 viewNormal과 viewLightDir를 비교하여 둘 중 하나가 0인 경우에는 reflectionDir를 구하는 과정을 건너뛰는 방식을 사용합니다. 즉, 둘 중 하나가 0인 경우 reflectionDir를 따로 구하지 않고, 기존의 viewLightDir 값을 그대로 사용하는 것입니다.

따라서 reflectionDir를 구하는 부분을 다음과 같이 변경해보세요.

float3 reflectionDir;
float cosine = dot(-viewLightDir, viewNormal);
if (cosine > 0) {
    reflectionDir = normalize(viewLightDir + 2 * (cosine * viewNormal));
} else {
    reflectionDir = viewLightDir;
}

위와 같이 변경하면 saturate(dot(-viewLightDir, viewNormal))이 0인 경우에도 reflectionDir은 viewLightDir과 같은 값이 되므로, 큐브의 면 중 빛의 방향과 같은 방향에 있는 면은 ambient만 적용되게 됩니다.

이렇게 수정하면 문제가 해결되지 않을 경우, 다른 부분에도 문제가 있을 수 있으니 코드 전체를 확인해보시고 다른 부분을 살펴보시는 것도 좋을 겁니다.

혹시 더 궁금한 점이 있다면 언제든지 물어보세요. 좋은 결과 있기를 바라요~!

복습중에 커맨드 큐 관련 질문이 있습니다.

0

39

1

_vsBlob와 _psBlob에서 nullptr이 뜨면서 실행이 안됩니다

0

60

1

#include d3dx12.h 추가했지만 오류

0

83

1

LNK1104 error, DirectXTexD.lib 파일을 열 수 없습니다.

0

124

1

[DirectXTex LNK2019 에러]

0

247

2

UI 랜더링이 이해가 안되어 질문드립니다

0

177

1

insideTess 값 관련 질문

0

126

1

렌더 타겟을 SRV로 사용하려고 합니다.

0

184

1

C++ 언어 표준과 Engine.lib 오류에 관하여..

0

283

2

실행과정에서의 문제

0

402

3

결과물에 의문이 생겨서 한가지 질문 드립니다

0

149

1

uv좌표변환

0

150

1

Shader 관련 문제

0

224

1

Load 부분에서 문제가 있어 질문드립니다

0

167

1

강의에서 보여진 모습과 다른모양이 되어서 질문드립니다

0

174

1

enumclass 질문입니다

0

155

1

nullptr오류가 발생해요.

0

363

2

Normal Mapping / Assertion failed! 오류

0

223

1

1>LINK : fatal error LNK1104: 'Engine.lib' 파일을 열 수 없습니다.

0

432

2

shared_ptr 과 헤더파일 관련하여 질문있습니다

0

210

1

질문있습니다.

0

178

1

장치 초기화 nullptr이 자꾸 발견 되네요.

0

302

2

용 모델에 분명 Diffuse 텍스쳐가 있는것같은데 왜 적용이 안되나요?

0

255

1

안녕하세요 질문있습니다

0

207

1