3D 그래픽을 화면에 나타내기 전에 만들어야 할 일이 있다. 바로 '창(window)'를 만드는 것이다. 예를 들어 응용 프로그램의 주된 창(main window)과 메뉴, 도구 모음, 스크롤바, 버튼 등등은 모두 창이다. 일반적으로 Windows 응용 프로그램은 아무

Windows 응용 프로그램을 만들려면 visual studio를 실행 후 'Windows 데스크톱 어플리케이션'을 선택해야 한다. 그리고 앞으로 x86에서만 실행할 예정이니, 미리 구성 관리자를 통해 다른 모드를 없앤다. 
이 시리즈는 Direct3D에 대해 다룬다.Direct3D란 무엇인가? 그 정의는, '응용 프로그램이 3차원 그래픽 가속 기능을 이용해서 3차원 세계를 렌더링할 수 있게 하는 저수준 API(application programming interface)이다. 저수준은 무
이제부터 Direct3D를 초기화 하는 구체적인 방법을 알아본다. 다음과 같은 순서를 따른다. D3D11CreateDevice 함수를 이용해서 장치,즉 ID3D11Device 인터페이스와 장치 문맥,즉 ID3D11DeviceContext 인터페이스를 생성한다. ID3
애니메이션을 수행하려면 시간을 측정해야 한다. 특히 프레임과 프레임 사이의 시간을 측정할 수 있어야 한다. 이번 포스팅에서는 그걸 알아본다.정확한 시간을 측정하기 위해서, <windows.h> 라이브러리가 제공하는 함수들을 이용해야 한다. QueryPerforma

3차원 장면의 모습에 근거해서 2차원 이미지를 생성하려면 많은 작업들이 필요하고, 이를 기능에 따라 단계별로 나누어 놓았다. 이를 렌더링 파이프라인(rendering pipeline)이라 한다.왼쪽이 렌더링 파이프라인을 구성하는 단계, 오른쪽은 그 단계들과 관련된 GP

입력 조립기(input assembler, IA) 단계는 메모리에서 기하 자료(정점들과 색인들)를 읽어서 기하학적 기본도형(삼각형, 선분 등)을 조립한다.3D 물체는 어떻게 표현하는가? 제일 기본적인 도형인 삼각형으로 표현한다.(출처 : https://www.
Direct3D의 정점은 공간적 자료 이외에 추가적인 자료를 가질 수 있다고 했다. 원하는 자료를 가진 커스텀 정적 형식을 만들려면, 우선 그러한 자료를 담을 구조체를 정의해야 한다. 예를 들어 다음 정점 구조체들은, 하나는 정점의 위치와 색상을 담고 있고, 다른 하나
GPU가 정점 배열에 접근할 수 있으려면, 배열의 정점들을 버퍼(buffer)라고 부르는 특별한 자원에 담아 두어야 한다. 마치 자원 말고 자원 뷰를 묶는 것처럼? Direct3D 코드에서 버퍼는 ID3D11Buffer 인터페이스로 대표된다. 정점들을 담는 버퍼를 '정

정점과 마찬가지로, 색인도 GPU가 접근할 수 있는 특별한 자원에 넣어야 한다. 이를 '색인 버퍼'라 부른다. 색인 버퍼는 정점 버퍼와 매우 비슷하다. 예제 코드를 통해 몇 가지 차이점에만 주목하자.입력 조립기 단계에 묶을 때, ID3D11DeviceContext::I
입력 조립기 단계에서 기본도형들을 조립했으면, 정점들이 정점 셰이더 단계로 입력된다. 정점 셰이더는 마치 정점 하나를 받아서 정점 하나를 출력하는 함수로 간주해도 된다. 모든 정점들이 정점 셰이더 단계를 거쳐 간다. 그 함수의 구체적인 내용은 프로그래머가 구현해서 GP

정점 버퍼에 있는 정점 데이터들이 향하는 곳이 바로 정점 셰이더다. 셰이더는 HLSL(high level shading language, 고수준 셰이딩 언어)이라고 하는 언어로 작성했다. 이 언어는 문법이 C++와 비슷하기 때문에 예제를 보면서 알아봐도 무방하다.정점

셰이더들은 나중에 나오겠지만, hlsl이라는 고급 언어를 쓰기 때문에 다른 파일로 따로 만들어야 한다. 그럼 어떻게 컴파일 하는가? 가령 D3DX 함수를 사용해서 컴파일 할 수 있다.(다른 함수들도 있다.)pFileName : 컴파일할 셰이더 소스 코드를 담고 있는 파
테셀레이션(tessellation)이란 한 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정을 말한다. 그러면 좀 더 세밀한 메시를 만들 수 있다. 테셀레이션은 생략 가능하기도 하고 고급 기술이라 나중에 한다.
생략 가능한 단계이고 고급 기술이라 나중에 하겠다.

래스터화 단계(rasterization stage)라고도 하는 래스터화기 단계(rasterizer stage)의 주 임무는 투영된 3차원 삼각형으로부터 픽셀 색상들을 계산해내는 것이다.NDC 좌표계까지 변환을 했다면, 2차원 이미지의 x, y 좌표성분들을 후면 버퍼의
입력 조립기 단계에서 많이 봤듯이, 기본도형 위상구조, 입력 배치, 정점 버퍼, 색인 버퍼는 다른 것을 묶기전까지는 이전에 묶은 자료가 그대로 남아있다. 이와 비슷하게 다른 것들도 한 번 변경하기 전까지는 그대로 유지하는 것들이 있다. 그런 렌더링 파이프라인의 특정 측
픽셀 셰이더(pixel shader, PS)는 프로그래머가 작성해서 GPU에서 실행하는 프로그램이다. 픽셀 셰이더는 각각의 픽셀 단편마다 실행되어 하나의 색상을 출력한다. 이는 고정된 상수 색상을 돌려주는 아주 간단한 작업에서부터 그림자, 조명, 반사 등등의 복잡한 형
정점 버퍼들이 정점 셰이더, 래스터화기 단계를 거치면, 정점 특성들이 삼각형의 픽셀들을 따라 보간한 결과를 픽셀 셰이더에 입력한다. 픽셀 셰이더도 정점 셰이더처럼 본질적으로 하나의 함수이다. 정점 셰이더랑 차이는, 각 정점이 아니라 각 픽셀 단편마다 실행된다는 것이다.
픽셀 셰이더가 생성한 픽셀 단편들은, 렌더링 파이프라인의 출력 병합기(output merger, OM) 단계로 입력된다. 출력 병합기 단계에서 일부 픽셀 단편들이 폐기(깊이 판정이나 스텐실 판정에 의해)된다. 기각되지 않은 픽셀 단편은 후면 버퍼에 기록된다. 두 픽셀이
지금까지의 버퍼들은 정점 버퍼들을 사용했는데, 정적 버퍼의 내용은 초기화 시점에서 고정된다. 반면에 동적 버퍼의 내용은 실행 시점에서 얼마든지 변할 수 있다. 그리고, 매 프레임마다 변하는 경우가 많다. 예를 들어 파도를 구현한다고 하자. 평범한 언덕과는 달리 파도는

텍스처 매핑(texture mapping)이란 메시의 삼각형 면에 이미지 자료를 입히는 기법으로, 이를 통해서 장면의 세부도와 사실감을 크게 높일 수 있다.텍스처를 기입하려면 먼저 텍스처 좌표를 알아야 한다. Direct3D는 u 축이 이미지의 가로 방향이고, v 축이

일반적으로 텍스처 자료는 디스크에 저장된 이미지 파일에서 읽어서 ID3D11Texture2D 객체에 적재한다. 텍스처는 알다시피 자원 뷰를 따로 만들어서 파이프라인에 묶어야 한다. 그 과정은 다음과 같다.D3DX11CreateTextureFromFile을 호출해서 디스

만약 우리 화면 해상도가 1024 x 1024이고, 텍스처 이미지 크기가 256 x 256이고, 그 이미지를 화면에 꽉 채웠다. 어떤 일이 일어날까? 화면이 텍스처보다 크므로 텍스처의 확대(magnification)가 일어난다. 즉, 적은 수의 텍셀들로 더 많은 수의

이번에 배울 내용은 샘플러(sampler)다. 샘플러는 여러 가지 방식을 한다. 샘플러를 파이프라인에 묶는 방법은 다음과 같다. D3D11SAMPLERDESC 구조체를 채운다. CreateSamplerState 함수를 이용해 samplerstate를 생성한다. ID
물이나 유리같은 반투명한 물체를 어떻게 출력할 것인가? 이런 반투명한 물체 뒤로 또 다른 물체가 보여야 한다. 하지만 지금까지 배웠던 픽셀 출력 방법은 이런 게 불가능하다. 이를 가능하게 하려면 '혼합(blending)'을 이용해야 한다. 혼합 기법은 현재 래스터화하는
지금까지 혼합 연산자와 혼합 계수를 알아보았다. 응용 프로그램에서 이를 설정하려면 어떻게 해야 할까? 이와 같은 절차를 따르면 된다.생성할 혼합 상태를 서술하는 D3D11_BLEND_DESC 구조체를 채운다.ID3D11Device::CreateBlendState 메서드
원본 픽셀을 더 이상의 처리 없이 완전히 잘라내야 할 때가 있다. 이럴 경우에는 hlsl의 내장 명령인 clip(x) 함수를 이용한다. 이를 통해 원하는 부분의 픽셀을 자를 수 있다. 다음 그림의 일부를 잘라보겠다.일부러 이미지 전체를 반투명화 시켰다. 부분 투명화는

알다시피 모든 정점은 world-view-projection transformation을 거친다. 처음엔 이 개념을 배우는 게 굉장히 헷갈린다. 여기서 world에 대해 더 쉽게 이해할 수 있는 예시를 가져와봤다.큐브를 y축 기준으로 자전하게 만들었다. 그 모습은 다음