본문 바로가기

Library/Computer Graphics

A Rough D3D10 Initialization Sketch D3D10을 사용하여 화면에 무엇을 나타내고자 한다면, 다음과 같은 최소의 과정을 거쳐야 한다. D3D10 이후로는, 각 스테이지에 바인딩되는 뷰를 통해 해당 스테이지에 접근할 수 있다. 또, D3D9은 버텍스 버퍼, 인덱스 버퍼를 각각의 함수를 통해 생성할 수 있었는데, D3D10은 각각의 버퍼들을 단일한 버퍼 생성 함수와 버퍼의 특성을 기술하는 디스크립터를 통해 생성하도록 바뀌었다. 또, 고정 기능 파이프라인의 하드웨어 T&L 기능이 완전히 제거되었기 때문에, 이들 기능을 사용하고자 한다면 직접 쉐이더 코드를 작성해주어야 한다. 또, 과거 FVF 포맷으로 이들을 버텍스 속성을 지정했던 것과 달리, D3D10에서는 IA 스테이지(Input Assembly) 단계에서 버텍스를 인식할 수 있도록 입력 형식.. 더보기
Varying Shader Inputs and Semantics (HLSL in Direct3D 9) 가변 입력값(varying input) 파라미터들은, 반드시 시맨틱(semantic)으로 선언되거나, 실행 시점에서 상수임을 알려주는 고정값 입력(uniform input)으로 선언되어야 한다. 만약, 최상위 쉐이더 레벨 입력이 둘 중 하나로 선언되지 않는다면 쉐이더 코드는 컴파일되지 않는다. 입력 시맨틱은, 주어진 입력을 전 단계의 그래픽스 파이프라인 출력과 연결하기 위한 이름이다. 예를 들어, 버텍스 쉐이더에 의해 사용되는 입력 시맨틱 POSITION0은, 버텍스 버퍼로부터의 위치 데이터가 어디로 연결되어야 하는지 정의하기 위한 것이다. 픽셀 쉐이더와 버텍스 쉐이더는 각각의 쉐이더 유닛으로 입력되는 다른 그래픽스 파이프라인 때문에, 서로 다른 입력 시맨틱을 가진다. 버텍스 쉐이더의 입력 시맨틱은 버텍.. 더보기
Uniform Shader Inputs (HLSL in Direct3D 9) 버텍스 쉐이더와 픽셀 쉐이더는 2 종류의 입력을 받아들이는데, 그때 그때 상황에 맞는 입력(varying inputs)과, 상황에 상관없이 고정적인 값(uniform inputs)이 그것이다. 전자는 쉐이더의 각 실행 시점에서의 고유한 값이며. 버텍스 쉐이더에 있어서 이런 값들은 버텍스 스트림에서 넘어온 것이다. 고정적인 입력값들은 복수의 쉐이더 실행에서도 변하지 않는 상수이다. 어셈블리 쉐이더 모델과 비슷하게, 이런 고정 값들은 상수 레지스터(constant register)에 정의되며, 변하는 값들은 v, t 레지스터에 정의된다. 고정적 입력값은 두 가지 방식으로 정의될 수 있는데, 가장 일반적인 방법은 전역 변수를 선언하고 그것을 쉐이더 코드 내부에서 사용하는 것이다. 쉐이더 내부에서의 이들 전역 .. 더보기
Deprecated Features in Direct3D 10 Direct3D 10(D3D10)에서 삭제된 주요한 기능들은 다음과 같다. 1. D3D10은 더 이상 고정 기능 파이프라인의 하드웨어 T&L을 지원하지 않는다. 이를 하고 싶다면 직접 쉐이더 코드를 작성해야 한다. 2. D3D10은 더 이상 고정 기능 파이프라인의 텍스처 블렌더를 지원하지 않는다. 3. D3D10은 새로운 래스터라이즈화 규칙를 구현했으며, 이것은 Direct3D 9.0에서 구현되었던 GDI 규칙보다 더 간단하고 깔끔하다. 여기에 대한 완전한 정보는 http://msdn.microsoft.com/en-us/library/ee415655(VS.85).aspx에서 찾아볼 수 있다. 더보기
Direct3D 10 Rendering Pipeline Diriect3D 10(D3D10)의 렌더링 파이프라인은 Direct3D 9.0(D3D9)과 매우 다르다. D3D9과 구별되는 외형상의 가장 커다란 특징이라면, 디스플레이 어댑터, 출력기기(모니터)와 같은 하드웨어 인프라를 다루는 부분을 DXGI(DirectX Graphics Infrastructure)로 완전히 독립시켰다는 것이다. DXGI 이전에는 Direct3D가 이런 하부 구조까지 책임지고 있었기 때문에, 코드를 마이그레이션 하는 경우 실제 이식 작업과 상관없는 이런 부분까지 손 대야 하는 불편함이 있었다. DXGI는 어댑터, 백버퍼(스왑체인), 출력 기기에 대한 정보를 Direct3D와 별도로 관리한다. 또, D3D9에서는 출력으로 지정된 윈도우 핸들을 실행 도중 바꿀 수 있었는데, DXGI는 .. 더보기
시점 좌표계를 통한 자유로운 카메라 구현 모델뷰 변환(modelview transformation)은 사실 같은 변환이라고 할 수 있다. 그러나, 임의의 공간에서 물체에 변환을 가하는 모델 변환과, 이를 관찰하는 카메라의 입장에서의 뷰 변환을 제대로 이해하고 있지 않다면, 자유롭게 시점 변환을 할 수 있는 카메라를 구현하는데 어려움을 겪을 것이다. OpenGL이나 DirectX에서 제공하고 있는 gluLookAt, D3DXMatrixLookAtLH와 같은 함수는 간단하게 카메라의 위치, 바라보는 방향, 그리고 업벡터만을 지정하는 것으로 뷰행렬을 계산해주지만, 보통 이것보다 더 다양한 시점이 필요하다. 이런 시점을 지원하는 카메라를 구현하기 위해서는, 시점 좌표계에 대한 이해가 필요하다. 현재 임의의 공간의 물체들은 모델 변환이 적용되어 있는 상.. 더보기
OpenGL Fixed Rendering Pipeline 대다수의 OpenGL 구현은 OpenGL 렌더링 파이프라인(OpenGL rendering pipeline)이라고 부르는 일련의 처리 단계를 따른다. OpenGL을 반드시 다음과 같은 렌더링 파이프라인대로 구현해야 하는 것은 아니다. OpenGL은 구현만을 지칭하는 것은 아니며, ARB가 평가하는 OpenGL 스펙을 모두 만족한다면 OpenGL 구현으로 인정받을 수 있다. 그래서 OpenGL은 공식적인 구현 외에도 Mesa3D와 같은 공개 OpenGL 구현도 존재한다. Mesa3D는 공식적인 OpenGL 구현은 아닌데, 이것은 라이센스 문제 때문이다. Mesa3D는 X.org와 같은 프로젝트에서도 중요하게 사용되고 있다. OpenGL 파이프라인에서 정점, 선, 폴리곤과 같은 기하 데이터는 평가자(Evalu.. 더보기
Direct3D 9.0 Rendering Pipeline Direct3D 9.0의 렌더링 파이프라인은 다음과 같다. 이 내용은 http://msdn.microsoft.com/en-us/library/ee417844(VS.85).aspx을 참조한 것이다. 매 업데이트마다 혁명적으로 바뀌는 Direct3D이고, Direct3D 10 이후의 파이프라인은 이와 또 다르지만, Direct3D 9.0은 고전적인 Direct3D로서 가치가 있다. Direct3D 9.0 이전의 렌더링 파이프라인은 제한적으로 쉐이더를 사용할 수 있는, 고정 기능 파이프라인(fixed rendering pipeline)이었고, 하드웨어 T&L(Transform & Lighting)과 같은 하드웨어가 처리해 줄 수 있는 기능이 중요했다. 하지만 Direc3D 9.0의 파이프라인은 'All or .. 더보기
텍스처 매핑(Texture Mapping) 어떤 물체를 가상의 3D 공간에서 폴리곤(polygon)을 사용하여 완전하게 재현하려면 엄청난 수의 폴리곤이 필요하다. 물체는 평평한 면으로만 구성된 것이 아니며, 이런 물체의 질감을 사실적으로 표현하려면 물체의 요철을 모두 묘사해야 하기 때문이다. 그러나, 현실적으로 엄청난 수의 폴리곤을 실시간으로 처리하는 것은 아무리 좋은 하드웨어라고 해도 성능상의 문제가 있다(테셀레이터는 이 주제를 다룬다). 따라서, 적정 수의 폴리곤을 사용하면서 사실적인 영상을 만들어내는 방법이 필요한데, 그 중 하나가 텍스처(texture)를 사용하는 것이다. 텍스처 처리란, 간단히 말해 물체의 표면의 속성을 모델링하는 기법 중 하나라고 할 수 있다. 즉, 물체의 질감이나 기타 효과를 표현하기 위해 폴리곤을 증가시키는 것이 아.. 더보기
Viewport Transformation 뷰포트 변환(viewport transformation)은 전 단계의 투영 변환의 결과를 이용하여 출력 장치 좌표계로 매핑하여 실제 장치에 출력된 2D 영상을 만들어내는 단계이다. 뷰포트 변환은 투영 방식에 상관없이 장치 좌표계로 변환할 수 있는데, 이것은 이미 투영 변환에서 투영 방식을 고려하여 정규화했기 때문이다. 화면에 최종적으로 출력하기 위해 필요한 것은 (x, y) 한 쌍의 좌표값이며, z = 0 평면에 무엇이 위치해야 할지는 z-버퍼(z-buffer) 검사에 의해 결정된다. 뷰포트 변환에서는, 출력할 윈도우(window)와 윈도우 내에서의 출력 공간을 지정하는 뷰포트(viewport)가 필요하다. 윈도우 크기와 뷰포트 크기가 동일할 때도 있지만, 언제나 그런 것은 아니다. 뷰포트 변환 행렬은,.. 더보기