작성
·
63
0
안녕하세요 제가 알기로는
output.normal = mul(input.normal, (float3x3)World);
이렇게만 해줘도 월드 좌표에서의 단위벡터로 만들어 주는걸로 알고 있는데
GeometryHelper.cpp 파일에서 CreateSphere 메서드에서
v.normal = v.position;
v.normal.Normalize();
Normal.fx 에서
normalize(input.normal)
위 1, 2 부분에서의 normalize를 안해도 별 차이 없지 않나요?
혹시 차이가 있다면 어떤 부분에서 차이가 있을까요?
아니면 제 개념이 틀렸을까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
먼저, 게임 프로그래밍의 쉐이더 관련 질문에 대해 답변드리겠습니다.
정점 셰이더에서의 output.normal = mul(input.normal, (float3x3)World);
코드는 정점의 법선을 월드 공간으로 변환하는 과정입니다. 이 변환은 모델의 로컬 공간에서 정의된 법선을 월드 공간으로 가져오기 위해 필요합니다. 변환 과정에서 (float3x3)World 행렬을 사용하는 이유는, 법선은 방향을 나타내는 벡터이므로 위치는 고려하지 않고 회전과 스케일만 적용하기 위함입니다.
GeometryHelper.cpp
파일의 CreateSphere
메서드에서 v.normal = v.position;
후에 v.normal.Normalize();
를 수행하는 부분은, 구의 각 정점에서 법선 벡터를 계산하기 위한 과정입니다. 구의 중심을 원점으로 가정했을 때, 각 정점의 위치 벡터가 해당 정점에서의 법선 벡터와 같기 때문에, 이와 같은 계산을 합니다. 여기서 Normalize() 함수는 법선 벡터를 단위 벡터로 만들어 줍니다.
Normal.fx
파일에서의 normalize(input.normal)
은 셰이더에서 입력으로 받은 법선 벡터를 단위 벡터로 만들어주는 과정입니다. 이는 쉐이더 연산에서 일관된 법선 벡터의 길이를 보장하기 위해 필요합니다.
위 1, 2 부분에서의 normalize 작업이 없다면, 법선 벡터가 단위 벡터가 아닐 경우 조명 계산 등에 오차가 생길 수 있습니다. 따라서, 이러한 normalize 과정은 법선 벡터를 이용한 정확한 그래픽 연산을 위해 중요합니다.
즉, 월드 좌표에서 단위 벡터로 만드는 과정은 맞지만, 정점의 위치에서 법선을 계산하거나 쉐이더에서 정확한 연산을 위해 normalize 과정을 거치는 것이 필요하다고 할 수 있습니다. 따라서, 개념 자체는 틀리지 않았으나, 그래픽스 프로그래밍에서 해당 연산들이 사용되는 정확한 맥락과 목적을 이해하는 것이 중요합니다.