• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    미해결

쉐이더에 연산 코드 선언

24.02.22 15:59 작성 24.02.22 16:00 수정 조회수 134

0

안녕하세요..!

지금까지 강의를 보고 있는데, 생각보다 쉐이더 파일에 특별한 코딩을 안 하고 있다는 걸 느꼈습니다.

막연하지만 41c-rotate3.cpp에서 볼 수 있는 행렬 연산 같은 것들을 쉐이더 쪽에서 처리하지 않는 이유가 있는지 궁금합니다..!

답변 1

답변을 작성해보세요.

1

안녕하세요.

 

행렬 연선을 버텍스 쉐이더나, 심지어 프래그먼트 쉐이더에 시킬 수도 있습니다만,

쉐이더 프로그래머나, 게임 엔진 프로그래머들은 되도록... 특별히 필요한 경우가 아니면, 그렇게 하지 않으려고 합니다.

 

게임 엔진 프로그래머들이 극단적으로 효율성을 추구하는 경향이 있는데, 쉐이더 와 CPU 간에 누가 하면 더 빠른가를 계산해 보면, 행렬 연산은 CPU가 딱 한번 해서, 모든 쉐이더에 주는 쪽이 훨씬 효율적입니다.

예외적으로, 버텍스마다 적용해야 하는 행렬 연산이 다르거나, 특별히 프래그먼트에서 행렬 연산을 해야만 하는 특수 효과가 아니라면, 강의 시간에도 한번 설명했습니다만, CPU가 미리 계산해서 주는 쪽이 훨씬 효율적입니다.

 

q = M1 M2 M3 q_w 와 같은, 전형적인 행렬 연산을 할때,

쉐이더 프로그램에서 저걸 해 주려면, M1, M2, M3 모두 주고,

q = M1 x M2 x M3 x q_w 라는 연산을 GPU 에서, 모든 버텍스에 대해서, 1백만개의 버텍스마다 일일이 하고 있어야 합니다. (행렬 곱하기 3번씩)

동일한 계산을, (M1 x M2 x M3)를 CPU 쪽에서 한번만 한 후에, 결과만 버텍스 쉐이더에 주면,

q = M x q_w 로, 행렬 연산 1번씩으로, 훨씬 줄어든 연산량을 수행하면 됩니다.

 

버텍스가 몇 천개 일때는 대수롭지 않은데,

전체 장면에서 몇억개의 버텍스를 다루고 있다면, 분명한 차이를 보이게 됩니다.

그래서, 왠만하면, 쉐이더 프로그램은 최대한 작고 가볍게 유지하려는 경향이 있습니다.

 

강의 뒷부분에 가면, 퐁 쉐이딩의 계산이나, 텍스처 매핑이 나오면서, 쉐이더 쪽에서 처리할 계산들이 점점 늘어나게 될 것입니다. ^^;;

 

감사합니다.

 

TaengE님의 프로필

TaengE

질문자

2024.02.22

답변 감사합니다! 제가 아직 코드 실행에 대한 이해도가 많이 낮은 것 같습니다^^;