일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이진탐색
- MYSQL
- 스토어드 프로시저
- union find
- String
- 그래프
- SQL
- Trie
- DP
- Stored Procedure
- Two Points
- Hash
- 다익스트라
- Dijkstra
- two pointer
- Brute Force
- binary search
- Today
- Total
목록computer graphics (74)
codingfarm
이번절의 내용은 Direct3D에서 공식적으로 제공해주는 기능이 아니다. 기하 구조 보조 구조체 정의 : 하나의 기하 그룹을 정의하는 vertex buffer와 index buffer를 한데 엮는 보조 구조체 vertex 및 index data를 system memory에 유지해서 CPU가 그 자료를 언제라도 읽을 수 있게 한다. 선택(picking)이나 충돌 검출을 위해서는 CPU가 기하구조 자료에 접근 해야 한다. 버퍼 형식이나 보폭(stride) 같은 정점 버퍼와 색인 버퍼의 주요 속성들을 담아둔다. 버퍼에 대한 view를 도려주는 메서드를 제공 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32..
지금까지 input layout description 구조체를 만드는 방법과 vertex shader 및 pixel shader를 만드는 방법 그리고 rasterrizer state 그룹을 구성하는 방법 등 여러가지 렌더링 준비 과정을 살펴보았다. 이제 이런 객체들을 실제로 쓰기 위해 rendering pipeline에 binding 하는 방법을 알아보자. 파이프라인 상태 객체(pipeline state object, PSO) rendering pipeline의 상태를 제어하는 대부분의 객체를 지정하는데 사용함 ID3D12PipelineState로 대표됨 PSO의 생성 과정 pipeline state를 서술하는 D3D12_GRAPHICS_PIPELINE_STATE_DESC 구조체의 인스턴스를 채운다. I..
래스터화 단계 프로그래밍 불가, 구성만 가능 rendering pipeline의 많은 부분이 프로그래밍이 가능하지만, 일부는 구성(설정)만 가능하며, 래스터화 단계그 가 중 하나다. 래스터화기 상태(rasterizer state)를 통해서 구성 D3D12_RASTERIZER_DESC 구조체로 상태를 대표 1 2 3 4 5 6 7 8 9 10 11 12 13 typedef struct D3D12_RASTERIZER_DESC { D3D12_FILL_MODE FillMode; D3D12_CULL_MODE CullMode; BOOL FrontCounterClockwise; INT DepthBias; FLOAT DepthBiasClamp; FLOAT SlopeScaledDepthBias; BOOL DepthCli..
Direct3D에서 shader program이 컴파일되는 단계는 다음과 같다. 이식성 있는 byte code로 컴파일 그래픽 드라이버가 byte code를 시스템의 GPU에 맞게 최적의 네이티브 명령들로 컴파일 Shader를 컴파일 하는 타이밍은 2가지로 나뉜다. 런타임 컴파일 오프라인 컴파일 1. 런타임 컴파일 런타임시 D3DCompileFromFile 함수를 통해 shader를 컴파일 할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 HRESULT D3DCompileFromFile( LPCWSTR pFileName, const D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, LPCSTR pEntrypoint, LPCSTR pTarget, UINT F..
장치 초기화 : GPU에게 명령을 넘기기 위한 사전 작업 오늘은 방대한 양의 API가 나올건데 한번에 다 익히려 하지 말것 우선 이전시간까지 비어있던 Engine 프로젝트에 Engine 폴더에 아래와같은 클래스 파일들을 추가해준다. 각 기능들을 파일 단위로 분리하는것이 플젝의 관리에 용이하다 이제 EnginePch에 출력 윈도우 창의 핸들과 너비, 높이 및 전체창 여부를 저장하는 값들을 추가해준다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // EnginePch.h // 이전 내용들... //----------------------- enum { SWAP_CHAIN_BUFFER_COUNT = 2 }; str..
버퍼 : shader 프로그램에서 참조하는 자료를 담는 GPU 자원(ID3D12Resource)의 예 버퍼의 종류 : 텍스처, 기타 버퍼 자원등 0. 상수버퍼 정의 장면의 물체마다 달라지는 상수 데이터를 담기 위한 저장공간 vertex buffer나 index buffer와 달리 constant buffer는 CPU가 프레임당 한번 갱신하는것이 일반적이다. 가령 카메라가 매 프레임 이동한다면, 프레임마다 상수 버퍼를 새 시야 행렬로 갱신해야 한다. 크기가 반드시 최소 하드웨어 할당 크기(256 바이트)의 배수 여야 한다. 가령 이전에 배운 vertex shader에서 아래와 같은 코드를 본적 있을것이다. 1 2 3 cbuffer cbPerObject : register(b0) { float4x4 gWor..
픽셀 셰이더 vertex shader(또는 기하 셰이더)가 출력한 정점 특성들은 래스터화 단계에서 삼각형의 픽셀들을 따라 보간되며, 보간된 결과는 pixel shader에 입력된다. 아래 코드는 기하 셰이더가 없는 경우에서 vertex 자료가 pixel shader에 도달하는 경로를 나타낸다. 정점 셰이더와 마찬가지로 픽셸 셰이더도 본질적으로 하나의 함수이나, 정점 셰이더와 달리 하나의 픽셀 단편(pixel fragment)마다 실행된다. 역할 : 주어진 입력으로부터 pixel fragment의 색상을 계산한다 후면버퍼의 한 픽셀에는 최종적으로 그 픽셀이 될 수 있는 '후보'로서의 pixel fragment들이 여러개 존재할 수 있다. 대부분의 pixel들은 pipeline의 pixel shader이후 ..
HLSL(high level shading language) 정의 : 셰이더를 작성하기 위한 고수준 셰이딩 언어 텍스트 파일로 작성, 확장자 .hlsl로 저장 HLSL에서 함수는 항상 인라인화 됨 다음은 간단한 정점 셰이더의 구현이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cbuffer cbPerObject : register(b0) { float4x4 gWorldViewProj; }; void VS(float3 iPosL : POSITION, float4 iColor : COLOR, out float4 oPosH : SV_POSITION, out float4 oColor : COLOR) { // 동차 절단 공간으로 변환 oPosH = mul(float4(iPosL, 1.0f)..
앞서 버퍼는 GPU가 접근 가능한 GPU 자원(ID3D12Resource) 공간으로 저장했다. 이 버퍼를 통해 GPU는 vertex 정보 접근할 수 있으며, GPU가 색인(index)들의 배열에 접근할 수 있으려면 색인들의 버퍼 GPU자원(ID3D12Resource)에 넣어 두어야 한다. index를 담는 버퍼를 index buffer라 부른다. Index Buffer 앞서 우리는 vertex buffer를 이용하여 화면에 삼각형 mesh를 출력하는 방법을 배웠다. 하지만 이전 코드를 보면 동일한 vertex가 여러번 선언되는것을 볼 수 있으며, 이는 프로그램의 효율을 떨어뜨린다. 그러므로 필요한 vertex의 목록을 만든뒤, 필요할때마다 해당 vertex의 index를 이용해 간접 참조하는 방식으로 효..
버퍼 GPU가 접근 가능한 GPU 자원(ID3D12Resource) 공간 응용 프로그램에서 정점 같은 자료 원소들의 배열을 GPU에 제공해야 할 때에는 항상 버퍼를 사용함 텍스처보다도 단순한 자원(다차원이 아님) mipmap이나 filter, 다중 표본화 기능이 없음 1. 정점 버퍼(vertex buffer) GPU가 정점들의 배열에 접근가능하도록 정점들을 저장하는 버퍼 정점 버퍼 생성 앞서 배웠던 리소스의 생성과정과 동일함 D3D12_RESOURCE_DESC를 채운다 ID3D12Device::CreateCommittedResource 메서드를 호출해 ID3D12Resource 객체를 생성함 Diret3D 12는 편의용 생성자들가 메서드들을 추가한 C++ 래퍼 클래스 CD3DX12_RESOURCE_DES..
5장에서 배운 렌더링 파이프라인의 개념적, 수학적 개념을 6장에서는 실제 코드를 통해 렌더링 파이프라인을 구성하고, 정점 셰이더와 픽셀 셰이더를 정의하고, 기하구조를 렌더링 파이프라인에 제출해서 3차원 물체를 그리는 데 필요한 Direct3D API 의 여러 인터페이스와 메서드를 중점적으로 살펴본다. 목표 기하 자료의 정의와 저장, 그리기(drawing)를 위한 Direct3D의 여러 인터페이스와 메서드를 파악함 기본적인 정점, 픽셸 셰이더를 작성하는 방법을 배운다. 파이프라인 상태 객체들을 이용해서 렌더링 파이프라인을 구성하는 방법을 파악함 상수 버퍼 자료를 생성해서 파이프라인에 묶는 방법을 배우고, 루트 서명에 익숙해진다. 6.1 정점과 입력 배치 Direct3D의 정점에 공간적 위치 이외의 추가적인..
https://www.3dgep.com/learning-directx-12-1/
Enumerating Adapters docs.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi Adapter 정의 : 컴퓨터의 HW와 SW이 기능을 추상화 한것 machine에는 수많은 adapter가 존재 일부는 HW로, 일부는 SW로 구현 HW : 비디오 카드... SW : Direct3D reference rasterizer 역할 : graphic application에 의해 사용되는 기능을 구현 현재 시스템에 있는 어댑터와 출력장치에 대해 출력하는 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30..
docs.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi#enumerating-adapters DXGI(DirectX Graphics Infrastructure) Overview 차세대 그래픽스 구성요소(Components)를 위한 공통 프레임워크를 제공 탄생 배경 : 여러 그래픽 API들에 공통적으로 쓰이는 그래픽 관련 작업들을 한데 묶기 위해 DirectX10, 11, 12와 함께 사용 됨 역할 : swap chain, 페이지 전환, 감마 조절 그래픽 어댑터 열거, 디스플레이 모드 열거, 버퍼 포맷 선택, 프로세스간 자원 공유, 윈도우 혹은 모니터로 display하기 위한 렌더링된 프레임 prese..
이 책의 예제 프로그램들은 d3dUtil.h, d3dUtil.cpp, d3dApp.h, d3dApp.cpp 파일의 코드를 사용한다. d3dUtil 파일 : 유용한 편의용 코드가 포함됨 d3dApp 파일 : direct3D 예제 응용 프로그램을 캡슐화 하는데 스이는 핵심 Direct3D 응용 프로그램 클래스 코드가 들어 있다. Win32 프로그래밍 지식은 이미 있다고 가정한다. 이 프레임워크는 창 생성 코드와 Direct3D 초기화 코드를 숨기는것이 목적이다. 개요 본격적으로 분석하기에 앞서 프로젝트의 class diagram과 sequence diagram을 통해 클래스 관계와 실행 흐름에 대해 살펴보겠다. 1. Sequence Diagram InitDirect3D와 D3DApp의 관계를 눈여겨 볼만하다..
정확한 애니메이션의 수행을 위해선 인접한 두 프레임 사이에 흐른 시간의 양을 측정할 수 있어야 한다. 프레임률이 높은 경우 프레임간 경과 시간이 상당히 짧으므로, 정밀도가 높은 타이머를 사용할 필요가 있다. 1. 성능타이머 이 책의 예제들은 Windows가 제공하는 성능 타이머(performance timer)를 사용한다. 이를 성능 카운터(performance counter) 라고도 부른다. 성능 타이머를 조회하는 Win32 함수를 사용하려면 반드시 Windows.h를 포함시켜야 한다. 성능 타이머의 시간 측정 단위는 '지나간 클릭 틱(tick)들의 갯수(count)' 즉, 틱수 이다. 성능 타이머로부터 틱 수 단위의 현재 시간을 얻을 때에는 QueryPerformanceCounter 함수를 사용한다...
이제 Direct3D를 초기화하는 구체적인 방법을 살펴본다. Direct3D의 초기화 과정은 꽤 길지만, 응용 프로그램 실행시 한 번만 해 주면 된다. 이 포스팅에서 다루는 Direct3D 초기화 과정은 다음과 같은 단계들로 구성된다. 1. Device 생성 2. Fence 객체 생성, 서술자들의 크기 확보 3. 4X MSAA 품질 수준 지원 여부 점검 4. command queue와 command allocator 그리고 command list를 생성한다. 5. 교환사슬을 서술하고 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰를 생성한다. 8. 깊이$\cdot$스텐실 버퍼를 생성하고, 그와 연관된 깊이$\cdot$스텐..
Direct3D 12는 다중 스레드를 효율적으로 활용할 수 있도록 설계되었다. Command List의 설계는 Direct3D가 multi thread 적용의 장점을 취하는 한 방법이다. 물체가 많은 큰 장면을 다룰 때, 장면 전체를 하나의 명령 목록으로 그리려 한다면 Command list를 구축하는 데 시간(CPU 시간)이 오래 걸린다. 이에 대한 자명한 해결책은 여러 개의 command list을 병렬로 구축하는 것이다. 가령 thread 네개를 띄워서 각자 하나의 command list를 구축하데 하면, 전체적인 시간이 기존의 25%로 줄어든다. 다음은 Command list 구축에 다중 스레드를 적용할 때 주의해야 할 점 몇가지이다. 1. Command list는 자유 스레드(free-threa..
https://ssinyoung.tistory.com/40 자원 상태 전이 자원 위험 상황(resource hazard) GPU가 자원에 자료를 다 기록하지 않거나 기록을 시작하지 않은 상태에서 자원의 자료를 읽으려 하는 상황 ex) 한 단계에서 GPU가 자원 $R$에 data를 기록하고, 이후의 한 단계에서 그 자원 $R$의 자료를 읽어서 사용하려는데, 읽기전에 자원 $R$에 다른 data를 기록하려 할 경우 이를 해결하기 위해 Direct3D는 자원들에 상태를 부여함 어떤 리소스에 대해 특정 상태가 되기 전까진, 해당 리소스를 실행할 수 없게 만듬 자원 상태 모든 리소스는 하나의 상태(state)를 꼭 가저야 함 어떤 그래픽 명령이 특정 리소스를 사용해서 실행되기 위해선, 그 명령에 필요한 상태로 리..
그래픽 프로그래밍에는 CPU와 GPU 2개의 장치(프로세서)가 작동한다. CPU : 로직제어 GPU : 화면표시 이들은 병렬로 작동하지만 동기화를 할 필요가 있다. 하지만 최적의 성능을 얻으려면 1. 최대한 둘다 바쁘게 돌아가야한다. 2. 동기화를 최소화 해야한다. 2가지 조건을 만족해야한다. 동기화는 한 처리 장치가 작업을 마칠 때까지 다른 한 처리 장치가 놀고 있어야 함을 의미하며, 따라서 성능에 바람직하지 않다. 즉, 동기화는 병렬성을 망친다. 1. 명령 대기열(Command Queue)과 명령 목록(Command List) GPU에는 명령 대기열(Command Queue)가 있고, CPU에는 명령 목록(Command List)가 있다. CPU는 그리기 명령들이 담긴 Command List를 Dir..