전체 글 102

[Directx12][9장]텍스처

개요 지금까지는 정점별 색상이나 오브젝트의 재질과 조명에 의해서 물체 표면의 색상을 정했다. 이제는 이미지파일을 물체 표면에 적용시키는 방법을 이야기 할 것이다. 우선 텍스처라는 자원에 대해 이야기하자면 기존에도 사용했던 후면버퍼나 깊이버퍼도 다 텍스처이다. 텍스처는 원소들의 n차원 배열(행렬)이다. 대부분의 경우 이미지를 담는 용도로 사용하지만 깊이버퍼처럼 다른 용도로도 많이 사용된다. 이러한 텍스처와 버퍼의 차이점은 텍스처는 밉맵 수준, 필터링, 다중표본화등의 gpu와 연관된 추가기능들이 가능하지만 특정 종류의 타입들만 원소로 사용할 수 있다. 그에 비해 버퍼는 그러한 기능들이 없는 대신 임의의 자료를 담을 수 있다. 아무튼 이번 장에서는 이미지를 담고 있는 텍스처를 이용하여 물체 표면에 그 이미지를..

[Directx12][8장][2]HLSL 구조체 채우기

HLSL 구조체 채우기 HLSL에서 사용하는 구조체(입력용 구조체 포함)은 메모리에 저장,해석될 때 다음과 같은 규칙을 따른다. 바로 32비트 4개짜리 벡터 단위로 저장이 된다. 예를 들어 다음 구조체는 메모리에 다음과 같이 저장된다. cbuffer cb1 : register(b0) { float4 a; float3 b; float c; float2 d; float3 e; } vector1 {a.x, a.y, a.z, a.w} vector2 {b.x, b.y, b.z, c} vector3 {d.x, d.y, empty, empty} vector4 {e.x,e.y,e.z,empty} ​ 위에서 보듯이 한 요소가 두 벡터에 걸쳐서 저장되는 것이 불가능하다. 따라서 cpu에서 gpu쉐이더 입력 구조체에 데이터..

[Directx12][8장][1]조명

개요 3차원 그래픽에서 사실같은 렌더링을 할때 꼭 필요한 요소는 바로 조명이다. 지금까지는 정점 별 색상을 이용해 물체의 특정 픽셀의 색상을 정했다. 하지만 이제부터는 광원과 해당 물체의 표면점의 위치와 면한 방향, 재질, 시점의 위치 등를 이용해서 해당 빛을 표면점이 반사해서 시점에 들어오며 나타나게될 색상을 정할 것이다. ​ 법선 벡터 법선 벡터는 물체의 표면점이 면한 방향을 나타내는 벡터이다. 좀 더 수학적으로는 해당 점의 접 평면에 수직인 벡터이다.(앞면 방향) 조명 렌더링을 위해선 각 표면점의 법선벡터가 필요한데 모든 점에 법선벡터를 일일히 설정할 수 없으므로 그 표면점의 삼각형을 나타내는 정점들에 정점 법선을 부여한다. 이후 래스터화 과정에서 해당 표면점에 해당하는 픽셀의 법선 벡터를 삼각형의..

[Directx12][7장]파이프라이닝2

프레임 자원 기존 방식에서는 cpu가 gpu에 명령 제출 후 flush를 통해 gpu가 명령들을 다 처리할때 까지 대기했다. 이러한 방식은 flush대기중에는 cpu가, flush후 다음 명령 제출까지는 gpu가 쉬게 된다. 이러한 성능 저하를 막기위해 프레임 자원이라는 기술을 사용한다. 기존에 flush를 통해 cpu가 gpu를 기다려줘야했던 이유는 commandAllocator 초기화 시점에 대한 이유와 매 프레임 변할 수 있는 자원들(오브젝트 위치 정보 등)을 gpu가 그리기를 처리하기도 전에 다음 프레임 값으로 바꿔버릴 위험이 있기 때문이었다. 따라서 commandAllocator 및 매 프레임 변하는 자원들을 묶어 프레임 자원이라는 것으로 만들고 이러한 프레임 자원 n개를 사용하면 기존의 방식보..

[Directx12][6장][2]파이프라이닝 구현

파이프라이닝 구현 월드 tranform이 기본값으로 고정된 박스 기하구조 하나를 렌더링하는 프로그램 기준으로 설명한다. ​ 1.초기화 단계 기본 구현의 9번까지의 초기화 다음에 다음과 같은 초기화 과정이 추가된다. ​ 1~9 기본 초기화 10. 상수 버퍼 힙 생성 11. 업로드 상수 버퍼 생성 및 힙 핸들에 뷰로 연결 12. 루트 서명 생성 (셰이더에 전달될 추가 버퍼들 나열) 13. 쉐이더 컴파일 14. 입력 배치 서술 생성 (셰이더에 전달될 정점 버퍼들의 특성 나열) 15. 기하구조 생성 (MeshGeometry를 생성하고 거기에 사용할 정점버퍼 및 색인버퍼 생성 + SubMesh 생성) 16. 파이프라인 상태 객체 (PSO) 생성 +명령 목록 제출 및 FlushQueue ​ 위 과정을 모두 수행한 ..

[Directx12][6장][1]파이프라이닝 구현 - 기본 지식

기본 지식 1.정점 특성 / 입력 배치 서술★ directX의 정점셰이더에서 처리되는 정점들은 위치정보외의 다른 정보들도 포함할 수 있다. 예를 들면 법선 벡터나 텍스처 좌표, 또는 절대 색상정보등을 가질 수 있다. ditectX에서 cpu에서의 정점 데이터들을 관리할때는 그냥 구조체로 정점들의 특성을 나열하면 된다. ex) struct Vectex1 { XMFLOAT3 Pos; XMFLOAT4 Color; } 이러한 구조체들의 배열은 바이트 그대로 gpu의 자원으로 전달 생성되어 사용된다.(void*로 전달) ​ 파이프라인이 실행될때 여러 슬롯에 등록된 정점버퍼(gpu의 정점배열데이터)들로부터 어떤 방식으로 각 정점의 특성들을 가져올지는 입력배치서술이라는 것으로 서술된다. 입력배치서술은 정점특성 입력 ..

[Directx12][5장]렌더링 파이프라인

기초 지식 1.렌더링 그래픽 프로그래밍에서 렌더링이란 점과 기하구조 등으로 표현된 3차원의 기하학적 데이터들을 특정 카메라를 기준으로 하여 그 카메라에 보이는 2차원 이미지를 그리는 것을 말한다. 우리가 실제로 2차원 이미지로 볼 때 다음과 같은 특성으로 3차원의 형태를 인식한다. 1.소실점 2.원근감 3.앞물체에 뒷물체가 가려짐 4.조명과 그림자 여기서 1과 2번은 원근 투영 변환으로 구현한다. 3번은 깊이 버퍼링으로, 4번은 각각의 조명,그림자 알고리즘등으로 구현한다. ​ 2.메시 그래픽 프로그래밍에서는 3차원 물체를 삼각형 면들의 합으로 근사하여 표현한다. 이를 삼각형 메시라고 한다. 경우에 따라서는 특정 장면을 점이나 선으로 표현할 때도 있다. ​ 3.색상 컴퓨덧셈터에서는 색상을 R,G,B 삼원색..

[Directx12][4장][2]Direct3D 기본 구조

기본 Direct3D의 구성 1.초기화 단계★ DIrectX12의 초기화는 다음의 단계를 따른다. 0.winapi를 통해 mainWindow생성 후 그 핸들 확보 1.IDXGIFactory4 생성 2.ID3D12Device 생성 3.fence생성 및 4X MSAA 품질 수준 지원 여부 점검 (지원/비지원, 최대 레벨) 4. 명령 대기열, 명령 할당자, 명령 목록 생성 5. 교환사슬 생성 (윈도우 핸들 필요) 6. 서술자 힙 생성 7. 교환사슬의 후면버퍼와 RTV서술자 힙에 대한 RTV생성 8. 깊이 스텐실 버퍼 생성 및 그 자원과 DSV 서술자 힙에 대한 DSV생성 9. 뷰포트 및 가위 직사각형 구조체 초기화 ​ 보통 함수 구조는 다음과 같이 된다. init함수() { 메인 윈도우 생성(); factor..

[Directx12][4장][1]Direct3D 초기화 - 기본 지식

기본 지식 1.Direct3D 개요 Direct3D는 윈도우의 제작사인 마이크로소프트와 여러 그래픽카드 제조사들의 직간접적인 협력으로 개발된 윈도우에서의 GPU 그래픽 인터페이스이다. C++의 API로 제공된다. ​ 2.COM 객체 ★ COM(Component Object Model)는 특정 소프트웨어의 컴포넌트에 대해 프로그래밍 언어 독립성과 하위 호환성을 가능하게하는 기술이다. DirectX에서 이러한 COM 객체는 C++ 클래스로 제공되니 그냥 한 객체라고 생각하고 사용해도 무방하다. ​ DriectX에서 COM 객체들은 대문자 I로 시작하는 클래스로 제공되는데 (ex/ ID3D12GraphicsCommandList) 이러한 객체들은 Microsoft::WRL::COMPtr이라는 전용 스마트 포인터..

[Directx12][3장]기초 수학 - 변환 및 관련 라이브러리

기초 수학 1.선형 변환 변환 t가 t(u+v) = t(u) + t(v) t(ku) = kt(u) 이 두 성질을 만족할 때 t를 선형변환이라 부른다. 이러한 선형변환은 행렬의 곱셉으로 표현할 수 있다. ​ 2.아핀 변환 ★ 선형 변환 t에 이동 벡터 b를 추가로 더한 변환을 아핀변환이라고 한다. (아핀 변환을 a라 할 때) a(u) = t(u) + b 3차원에 대한 아핀변환은 4차원 행렬과 4차원 벡터의 곱셉으로 표현 할 수 있다. a = t t t 0 t t t 0 t t t 0 bbb1 ​ 이때 곱하는 벡터의 w요소가 1이면 점, 0이면 벡터를 나타낸다. 점일때는 선형변환 후 b가 더해져 이동까지 이루어 지지만 벡터일때는 선형변환만 발생하고 b는 더해지지 않는다. 점은 이동할 수 있지만 벡터는 이동하..