본문 바로가기
Technical/Organize

[Technical Organize] 기술면접_DirectX

by song.ift 2022. 12. 28.

문제. 버텍스 소팅은 어떻게 하였는가?

버텍스 버퍼 =  점들의 위치를 저장한 것이라 보면 된다. ( 0, 0, 0 ) ( 1, 1, 0 ) 같은 버텍스를 가지고 있는 주머니인 것이다.

인덱스 버퍼 =  인덱스 버퍼는 정점을 저장하기 위한 버텍스 버퍼와 마찬가지로 정점의 인덱스를 보관하기 위한 전용 버퍼를 말한다

인덱스를 사용하는 이유

-정점을 여러 번 나열하는 것보다 메모리 소모량이 적다.

-자주 사용되는 정점을 캐시에 저장해서 성능 상 유리하다.

 

문제. 알파블렌딩에 대해서 설명하시오.

이미지위에 또다른 이미지를 덧씌울때 마치 투명하게 비치는 효과를 내기위해 컴퓨터의 색상표현값

RGB 에 A라는 새로운 값을 각 픽셀에 할당하여 배경 RGB값과 그 위의 그려질 RGB값을 혼합하여 표시하는 방법

 

문제. 알파테스팅에 대해서 설명하시오.

256단계의 부드러운 알파 채널의 단계 중 일정 부분을 정해서 그 투명도를 0 또는 1로 정의해 버립니다.

즉 '반투명' 이란 것은 없고, 이 픽셀이 보이는가 안보이는가만 임의대로 (예를 들어 100보다 크다던가) 결정해 버리는 것이다.

이렇게 하면 일반 오브젝트 그리는 것과 별 차이 없이 처리할 수 있는 장점이 있지만 알파 채널의 퀄리티는 다소 떨어지게 된다. 속도는 빠름

 

문제. zenable과 zwritenable의 차이점을 설명하시오.

zenable이 false 이면 깊이 테스트를 하지않는다.

zwriteenable 이 true 이면 깊이 테스트를 통과한 픽셀의 깊이가 깊이 버퍼에 기록이 되지만 false 이면 깊이 테스트를 통과해도 깊이 버퍼에 새로운 픽셀의 깊이가 기록이 되지 않는다.

 

문제. maptool 작업 시 광선과 지형 충돌은 어떻게 하였는가?

Styx 코드보는게 편함

 

문제. Direct10/11의 스펙이나 주요기술에 대해 설명.

DX9와 DX11의 그래픽 차이를 만드는 기술 중에 하나가 DX11에 새롭게 추가된 '테셀레이션'이라는 기술.

3D 물체는 텍스쳐 안쪽에 와이어프레임이란 뼈대가 있는데, 테셀레이션은 그 와이어프레임의 복잡도를 확 끌어올려서 굴곡을 표현해줄 수 있다

DX9 때는 뼈대가 너무 커서 원형 물체, 굴곡, 돌출부를 잘 표현 할 수 없었지만

DX11의 테셀레이션을 적용하면 DX9에서는 표현할 수 없었던 몸을 빼곡히 덮고 있는 삐죽삐죽 튀어나온 가시를 표현 할 수 있다.

돌바닥, 담벼락도 DX9는 평평하지만 DX11은 울퉁불퉁하거나 작은 틈새까지 표현 할 수 있고,

지붕도 DX9 땐 그냥 판때긴데 DX11은 뼈대 자체를 기와 모양으로 표현 한 걸 볼 수 있다

DX9 게임은 입체감을 살리기 위해서 텍스쳐를 고품질로 쓰고 명암을 줘서 착시를 일으키는 방식으로 커버를 하는데

그럼에도 불구하고 멀리서 볼 땐 입체적으로 보이던 벽이 가까이 딱 붙어서 보면 완전히 평면으로 보인다

 

문제. 테셀레이션이란 무엇인가?

테셀레이션이란 그래픽 카드에 장착된 GPU를 통해 굴곡이 있는 표면을 보다 자연스럽게 만들어주는 역할을 하게 되는데

이로 인해 보다 실사에 가까운 화질을 느낄 수 있게 해 비약적인 그래픽 영상의 발전을 기대해 볼 수 있다.

 

문제. 레이트 레이싱 렌더링은 무엇인지 설명하시오.

3D 그래픽 기술의 기본적인 목적은 3D 공간을 특정 시점에서 바라봤을 때의 2D 영상을 만들어 내는 것인데, 크게 2가지가 있다. 그 중 하나가 바로 레이트 레이싱 렌더링이다. 이 기법은 광선의 이동 경로를 추적하여 색을 결정하는데, 실 세계에서는 광원에서 광자들이 출발하여 물체에 충돌 후 우리의 눈으로 들어오지만 이 기법은 반대로 카메라에서 화면 방향으로 광선이 출발한다. 레스터 라이즈 같은 경우는 광원에서 물체에 충돌 시, 바로 그때의 색깔로 결정되어 화면에 출력되어서 실 세계에서의 색과 거리가 좀 있지만 속도면에서는 빠른 장점이 있어 주로 레스터라이즈 기법을 사용한다.

 

문제. Ray tracing은 무엇인가?

광원에서부터의 빛이 여러 물체의 표면에서 반사되는 경로를 추적하여 각 물체의 모양을 형성하는 기법이다.

 

문제. 쿼드트리에 대해서 설명하시오.

쿼드트리는 자식을 4개를 가지는 트리 구조이며, 이 쿼드트리를 사용하여 지형 연산에 사용을 하는 것이 쿼드트리 컬링이다.

쿼드트리를 구성할 때, 전체 지형을 하나의 루트 노드로 만들고, 지형을 균등하게 4등분하여 루트 노드의 자식 노드로 만드는 식으로 리프 노드가 인덱스 간격이 1이 될 때까지 나누어서 하나의 트리를 구성한다.

거대 지형처리에서 사용된다. 왜냐하면 지형이 커지면 커질수록 버텍스의 수가 많아지면서 GPU에서 버텍스 정점 연산이 많아지게 되므로 속도 저하가 일어난다. 하지만 쿼드트리를 가지고 컬링을 할 시에 절두체 안에 있는 부분이 있다면 없는 자식들에 대해서는 연산을 하지 않기 때문에 퍼포먼스가 좋아진다. 지형을 만들 때 2^n+1 * 2^n+1 크기로 만들며 그 이유는 원점을 지형의 중심으로 위치시키기 위해서이다.

 

문제. DirectX 란 무엇인가?

마이크로 소프트사가 윈도즈용으로 개발한 멀티미디어 응용 프로그램 인터페이스 즉 API 의 각종 미디어를

사용한 응용 프로그램이 하드웨어 장치를 직접 접속 (direct access)하여 고속으로 처리 할 수 있도록 해 주는 API라는 의미에서 다이렉트 X

 

문제. 컴퓨터 그래픽스란

컴퓨터 그래픽스란, 추상적인 표현을 시각화해 이미지를 만들어내는 것을 의미하는 것으로 크게 세가지로 분류할 있다.

  • 모델링: 수학적(기하학적) 방식으로 물체를 정의하는 것. 실제 존재하는 것들을 3D 스캔하여 쓰거나, 기하학적 모델로 만들어 사용.
  • 렌더링: 물리적(광학적) 방식으로 물체를 시각화하는 것. 빛과 모델 속성, 사용자의 눈 위치 정보를 기반으로 모델의 음영, 색깔을 결정하는 과정.
  • 애니메이션: 물리적(역학적)으로 시간에 따라 물체를 움직이게 하는 것. 키프레이밍, 모션캡쳐, 시뮬레이션 방식이 있음

 

문제. 렌더링 파이프라인에 대해서 설명하시오.

렌더링 파이프라인은 3D 장면의 기하학적 표현으로 2D 이미지를 만들어내는 과정이다.

3D 세계에 대한 기하학적 표현과 이 세계를 바라보는 관점을 정의하는 가상 카메라를 이용해 2D 이미지를 만들어내는 역할을 담당합니다. 이 렌더링 파이프라인에는 일련의 과정이 있다.

모델을 시각화하기 위한 과정은 사진을 찍는 것과 비슷하다.

(1) 모델을 만들고,
(2)
모델을 3D 공간에 배치하고
(3)
모델의 어느 부분을 찍을 결정해서 카메라를 설치한
(4)
사진을 찍어 2D 이미지로 만듭니다

이런 일련의 과정은 여러가지 좌표계와 그들간의 좌표 변환의 연속이다.

 

문제. 렌더링 파이프라인 각 과정 정리

- 로컬 스페이스

모델의 공간이다. 모델링 과정을 쉽고 단순하게 만들어주며 삼각형 리스트를 정의하는데 이용하는 좌표다.

각자의 모델을 자기 자신의 기준점(원점) 기반으로 좌표계를 통해 만들어진다.

- 월드 스페이스

로컬좌표 내에 다수의 모델을 구성된 것을 하나의 장면으로 옮겨 구성해야 하는데 이때 로컬 스페이스의 물체들은 이동, 회전, 크기 등을 포함하는 월드 변환이라는 작업을 거쳐 월드 스페이스를 구성한다.

어떤 3D 공간에 모델들을 배치하게 되면, 모델들이 다같이 공유할 있는 좌표계를 사용해 서로의 위치를 정의할 있다. 이때 모델 좌표계를 월드좌표계로 변환하는 과정(Modeling Trasformation) 거치게 된.

- 뷰 스페이스

월드 스페이스 내에서 물체와 카메라는 월드 좌표 시스템과 연계되어 정의된다. 한편, 카메라가 월드 내 임의의 위치나 방위를 가진다면 투영이나 그 밖의 작업이 어렵거나 덜 효율적이 된다. 따라서 작업의 수월함을 위해 카메라를 월드 시스템의 원점으로 변환하고, 카메라가 양의 z축을 내려다보도록 회전시켜야 한다. 이때 월드에 대한 관점이 바뀌지 않도록 하기 위해서는 카메라에 맞추어 월드 내의 모든 기하물체를 변환해야 되는데, 이와 같은 변환을 뷰 스페이스 변환이라한다. 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 말할 수 있다.

카메라의 역행렬이 뷰스페이스 변환할 떄 필요한 행렬임. 카메라는 항등행렬이 됌.

다음에는 모델들을 어디에서 바라볼지 결정하고, 카메라를 원점으로 했을 모델들의 상대적인 좌표를 계산힌다.

- 후면 추려내기

카메라는 후면을 볼 필요가 없으므로 오브젝트 후면의 폴리곤을 추려냄으로서 퍼포먼스에 상당한 이득을 취하게 된다.

CCW, CW, None 등으로 추려낼 면을 설정할 수 있습니다.(시계방향, 반시계방향, 제외)

- 조명

물체에 명암을 추가하여 물체의 사실감을 더해줍니다.

빛은 크게 3가지로 추상화할 수 있다.

- Ambient     환경광 

  다른 표면에 반사 되어서 비추는 전반적인  

- Diffuse    난반사광

  특정한 방향으로 진행하며 , 모든 방향으로 동일하게 반사되는  ( 말이 어렵지만 , 그냥 일반적인 빛의 색이라 생각해 )

- Specular 정반사광

  특정 방향으로 강하게 반사되는 빛으로특정 각도에서만 보이는  . 빛이 사물에 비출때의 하이라이트 부분의 빛임.

광원에도 3가지가 있다. Direction Light(방향), Point(점), Spotlight(스포트라이트)가 있다.

- 클리핑

카메라 절두체를 기준으로 외부에 있는 물체를 추려내는 과정이다.

- 투영

뷰 스페이스에서는 3D 장면의 2D 표현을 얻는 과정이 남아있다. 이와 같이 n차원에서 n-1차원을 얻는 과정을 투영이라 한다. 투영을 수행하는 방법엔 여러 가지가 있지만 대체로 원근 투영이라는 방법으로, 원근법을 이용해 기하물체를 투사한다.

투영 변환은 우리 시야 볼륨(절두체)을 정의하고, 절두체 내의 기하물체를 투영 윈도우에 투영하는 과정을 담당한다.

N ~ N-1 차원에 공간에 3D 공간의 물체들을 원근감을 가진 2D 좌표로 만들어준다.

원근법을 사용하는 원근 투영(Perspective Projection)을 통해 3D 월드를 2D 이미지로 표햔한다. 카메라로 부터 가까운 평면의 거리(n), 먼 평면의 거리(z), 시야각(fov), 높이와 넓이에 대한 비율인 종횡비(Aspect) 를 설정해야한다. 원근법을 적용하지 않는 투영을 직교 투영(Orthogonal Projection)이라고 한다.

- 뷰포트

뷰포트 변환은 프로젝트 윈도우의 좌표를 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다. 게임에서의 뷰포트는 보통 직사각형의 전체 화면이 되지만, 윈도우 모드에서 실행되는 경우에는 클라이언트 영역이나 화면의 일부가 될 수도 있다. 뷰포트 사각형은 이를 포함하고 있는 윈도우에 대해 상대적인 좌표와 크기를 가지게 해주며, 윈도우 좌표를 이용해 지정한다.

투영공간에 바뀐 좌표에 윈도우 사이즈를 곱해주면 최종적으로 화면에 뿌릴 위치를 갖게된다.

- 래스터라이즈

스크린 좌표로 버텍스들을 변환한 다음에는 2D 폴리곤들의 리스트를 가지게 된다. 래스터라이즈 단계는 각각의 폴리곤을 그리는 데 필요한 픽셀 컬러들을 계산하는 과정이다. 래스터라이즈 과정은 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어에서 처리되어야 한다,

삼각형을 그리는데 필요한 픽셀 컬러들을 계산하여 뿌려주는 과정이다.

스크린 좌표로 버텍스들을 변환하면 폴리곤 정보를 가지게 되는데 레스터라이즈는 각각의 폴리곤을 출력하는데 필요한 픽셀컬러를 계산하는 과정이다. 단순하게 얘기하면 폴리곤을 픽셀로서 변환하는 과정이다. ( 그래픽 하드웨어 담당 )

마지막으로 원하는 디스플레이/스크린에 정규화된 좌표계의 모델들을 픽셀 하나하나의 색상값으로 변환하는 Rasterization 통해 2D 이미지를 얻을 있게 된.

래스터 라이즈 과정에서 기본형을 구성하는 픽셀 컬러가 이용되는 방법.  크게 2가지로 나누어짐

플랫(flat) 셰이딩 -> 첫번째 버텍스에 지정된 컬러로 기본형을 채운다.
그라우드(Gouraud) 셰이딩 -> 각 버텍스의 색깔을 기준으로 보간된 (색이 그라데이션으로 되는것) 색상이 나온다.

 

문제. 동차좌표계에 대해서 설명.

3D에서는 기본적으로 3차원 좌표계이지만 어떤 목적으로 4차원으로 확장이 가능하다.

어떤 목적을 위해 한 차원의 좌표(n) 을 추가한 좌표 (n+1)로 표현을 하는 것을 동차 좌표계라고 한다.

- 투영행렬과 동차좌표의 관계

투영행렬에서, 카메라 공간상에 존재하는 점과 카메라 위치 사이의 깊이값(z)를 최종 결과점의 x,y,z에 각각 곱해지고, w에 저장된다.

바로 이 과정이 동차좌표계를 위한 과정이다.

좌표공간에서의 3d좌표를 얻어내려면 w로 나눠내면 된다.

여기서 월드공간 카메라 공간에서는 w값이 항상 1이기 때문에 아무런 변화가 없다.

그렇지만 투영공간에서는 w값이 카메라 공간에서의 카메라의 위치에서 부터 정점 사이의 거리이기 때문에 z값에 따라 정점의 위치와 크기가 변환된다.

따라서 쉐이더에서 다른공간은 상관없지만, 투영공간상에 존재하는 좌표를 다를 경우 동차 좌표계상에서 존재하기 때문에 w성분으로 나눠줘야 한다.

 

문제. 3D 렌더링 중 공간 상에 점이 있고 카메라로 위치를 옮기는 과정을 설명해보세요.

점좌표 카메라 좌표 있으면 점을 카메라 좌표 기준으로 투영한다음에 그 점을 모니터 기준인 뷰포트 기준으로 투영하고, 최종적으로 결정된 점 위치에 같이 있는 정보를 픽셀 쉐이더에 넣어서 색깔을 뽑내고 그것을 최종적으로 그려낸다.

 

문제. 와우 같은 게임이 있다고 치고 몬스터가 캐릭터 뒤에서 공격했을 시 200% 데미지가 들어갑니다. 어떻게 구현하실 껀가요?

두 캐릭터의 Front Vector 두개의 차이를 구하고 각도를 계산하여 180도 이상이면 뒤라고 판단하도록 한다음, 뒤일 경우 추가 데미지를 넣는 로직을 피해 입는 로직에 추가하면 될 것 같다.

 

문제. 애니메이션 기법 – 스키닝

스키닝(skinning)이란 피부를 붙이는 작업이라고 말할 수 있다.

3차원 메쉬는 관절과 관절 사이가 사람과 달리 끊김 현상이 발생할 수 있는데 , 이를 막는 기법을 스키닝이라고 한다.

마치 사람의 뼈 위에 피부가 있어서 관절부위가 보이지 않는 것처럼 말이다. 과거에는 고급 기법이었으나, 요즘에는 스키닝이 되지 않는 경우가 더 어색해 보일정도로 일반화 되었다. 

 

문제. 스탠실 버퍼란

스텐실 버퍼는 깊이 버퍼, 백 버퍼와 마찬가지로 같은 크기를 가지는 오프 스크린 버퍼이다.
백버퍼의 일부 영역을 차단하여 그리지 않기 위해 사용되어지는 특수한 버퍼라고 생각하면 된다.

특징 : 

후면 버퍼 및 깊이 버퍼와 동일한 해상도를 가짐.

스텐실 버퍼 내의 ij번째 픽셀은 후면버퍼나 깊이 버퍼의 ij번째 픽셀과 대응.

후면 버퍼의 일정 부분이 렌더링 되는 것을 막는 스텐실 효과에 이용

sencil buffer는 특수한 효과를 위한 off-screen buffer로, back buffer 및 depth buffer와 동일한 해상도를 가진다. 따라서, stencil buffer 내의 (i, j)번째 픽셀은 back/depth buffer의 (i, j)번째 픽셀과 대응된다.

이름이 의미하는 것 처럼 stencil buffer는 back buffer의 일정 부분이 렌더링되는 것을 막는 효과를 위해 사용된다. 예를 들어, 거울에 특정 물체를 반사하도록 할려고 한다면, 거울에 반사되는 부분에 대해서만 드로잉을 수행하면 된다. 이 때 거울에 비치지 않는 부분은 렌더링되는 것을 막을 수 있는 있도록하는 것이 바로 stencil buffer다.

사용 예 :

거울, 평면 그림자에서 많이 사용

거울을 표현하고자 하면 거울 평면에 특정 물체만을 반사하도록하면 되며, 거울에 반사되는 부분에 대해서만 드로잉을 수행

이때 거울에 있지 않은 다른 부분이 렌더링 되는 것을 막을 수 있음

방법 :

스탠실 버퍼를 활성화하기 전 D3DRS_ZWRUTEENABLE를 false로 지정하면 깊이 버퍼로 쓰여지는 것을 막을 수 있다. 또한, 원본 블렌드 인수와 목적지 블렌드 인수를 ZERO로 지정하고 블렌딩을 이용하면 후면 버퍼가 갱신되는 것을 막을 수 있다. 이렇게 z버퍼, 후면버퍼는 값을 유지되도록 쓰기를 막아야한다. 그런 장치 초기화를 하고 나서 스탠실 버퍼를 활성화하고 객체를 렌더한다.

 

문제. 포워드 렌더링과 디퍼드렌더링에 대해서 설명.

포워드 정점쉐이더는 래스터라이즈 전에 실행

디퍼드 픽셀쉐이더는 래스터라이즈 후에 실행

 

문제. 노멀 매핑이란?

노말 맵핑 (Normal Mapping)은 폴리곤의 법선 벡터 (Normal Vector)의 값을 사용하여 로우 폴리곤의 그래픽 환경에서 입체감 및 질감을 구현하는 방법이다.

물체의 질감을 폴리곤으로 표현하기엔 연산량을 많이 차지하는데 이걸 텍스쳐로 대신하는 표현해주는 일종의 "눈속임" 기술이다.

물체의 질감을 있는 그대로 폴리곤으로 표현하면 삼각형의 양이 많아지고 결국 연산이 많이 필요하게 되는데 폴리곤을 무척 적게 사용하고도 비슷한 효과를 낼 수 있는 기술이다.

또 다른 답변 :

텍스쳐의 텍셀에 RGB 색깔값이 아닌 법선 벡터 값이 들어있는 텍스쳐를 사용하여 특수하게 맵핑하는 기법을 말한다.

이 텍스쳐의 법선 벡터와 광원의 연산을 통해서 정점 단위의 조명이 아닌 픽셀 단위의 조명을 할 수 있도록 해준다.

픽셀별 조명(per pixel lighting) 기법의 대표적인 예이다.

 

문제. 셰이더란?

“Shader란 화면에 출력할 픽셀의 위차와 색상을 계산하는 함수” 라고 한다. 처음 접하는 사람에게는 이러한 정의가 전혀 이해되지 않을 것이다.

“Shade”라는 단어에는 ‘색의 농담, 색조, 명암 효과를 주다.’라는 뜻을 가진다고 한다.

셰이더에는 Vertex Shader(정점 셰이더), Geometry Shader(지오메트리 셰이더), Pixel Shader(픽셀 셰이더)가 있는데 책에서는 우선 Geometry Shader가 어렵다는 이유로 빠져있다.

 

문제. 고로셰이딩과 퐁셰이딩의 차이점은 무엇인가?

고로 셰이딩 : 정점의 법선벡터와 조명벡터로 정점의 밝기 계산

퐁 셰이딩   : 픽셀의 법선벡터와 조명벡터로 픽셀의 밝기 계산

 

문제. 버텍스 쉐이더와 픽셀 쉐이더의 역활은 무엇인가?

정점 셰이더 -> 레스터라이즈 -> 픽셀 셰이더 -> 화면

 

문제. 멀티샘플링 

픽셀 매트릭스로 이미지를 표현할때 나타나는 거친 이미지를 부드럽게 해주는 기술

대표적으로 안티 알리어싱(Anti- Aliasing)  있다. 계단현상 ( 픽셀이 계단처럼 나타나는 현상) 완화 하기 위해 사용한다

댓글