일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Two Points
- MYSQL
- union find
- Stored Procedure
- DP
- 스토어드 프로시저
- Trie
- binary search
- 이진탐색
- 그래프
- SQL
- two pointer
- Dijkstra
- Brute Force
- String
- Hash
- 다익스트라
- Today
- Total
목록분류 전체보기 (418)
codingfarm
0. 개요 하나의 프레임 버퍼를 가지고 게임 화면을 표현하면 화면 깜빡임(Screen Flickering) 및 화면 찢어짐(Screen Tearing) 현상이 나타난다. 화면 깜빡임 : 버퍼를 지우고 그릴경우 발생 화면 찢어짐: 이미 그려진 화면 위에 덮어 쓸 경우 발생 화면 찢어짐 효과 0-1. 더블 버퍼링(Double Buffering) 화면 깜빡임 및 찢어짐 현상을 피하고자 사용되는 방법 후면 버퍼(Back Buffer)와 전면 버퍼(Front Buffer) 2개의 프레임 버퍼의 교환을 통해 프레임 전환을 구현하는 기술 전면 버퍼 : 화면을 표현 후면 버퍼 : 다음 화면이 될 장면을 미리 저장 후면버퍼는 텍스처 이므로 그 원소를 텍셀(texel)이라 부르지만 여기서는 그냥 픽셀(pixel)이라 부름..
정의 : 어떤 프로그램이나 시스템을 이루는 컴포넌트들이 상호 통신할 수 있도록 하는 메커니즘 COM을 이용하면 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 할 수 있다. COM을 통해 개발자는 GPU에 종속적이지 않게 프로그래밍 가능 Comptr Com객체를 담기 위한 일종의 스마트 포인터 ComPtr의 여러 메서드 중 이후 포스팅에서 사용하는 것은 다음 세가지이다. 1. Get : 바탕 COM 인터페이스를 가리키는 포인터를 돌려준다. 해당 COM 인터페이스 포인터 형식의 인수를 받는 함수를 호출할 때 쓰인다. 즉, read용으로 쓰인다 ComPtr mRootSignature; ... // SetGraphicsRootSignature는 ID3D12RootSignature* 형식의 인수..
자원과 서술자에 대해서 알고싶다면 크게 4가지 요소에 대해서 집중하여 살펴보면된다. 자원의 생성 서술자의 생성 데이터 업로드 바인딩 0. 자원 Rendering을 위해 GPU가 write/read 하는 대상 physical memory나 heap에 읽고 쓰기 위한 CPU와 GPU의 일반적인 ability를 encapsulated 한 것 종류 각종 buffer들, texture ... ID3D12Resource로 대표됨 DXGI_FORMAT 형식을 지님 별도의 heap 공간에 저장됨 상태를 지님 버퍼(buffer) GPU가 접근 가능한 GPU 자원(ID3D12Resource) 공간 응용 프로그램에서 정점 같은 자료 원소들의 배열을 GPU에 제공해야 할 때에는 항상 버퍼를 사용함 텍스처보다도 단순한 자원(다..
0. CPU/GPU 동기화 한 시스템에서 두 개의 처리 장치가 병렬로 실행되다 보니 여러 가지 동기화 문제가 발생한다. 대표적인 동기화 문제는 이전에 제시했듯이 CPU 측에서 ExecuteCommandList 메서드로 command list의 내용을 제출했을때, GPU가 command queue 내에서 아직 처리하지 않은 명령의 내용을 그대로 덮어쓰는 현상이 발생 할수도 있다. 이를 해결하기 위한 해결책중 하나는 Fence를 이용하는 것이다. Fence docs.microsoft.com/ko-kr/windows/win32/direct3d12/fence-based-resource-management GPU가 command queue의 명령들 중 특정 지점까지의 모든 명령을 다 방출(flust) 혹은 처리할..
df
https://developer-kua.tistory.com/21?category=422534 1. 다음 정점 구조체를 위한 D3D12_INPUT_ELEENT_DESC 배열을 작성하라 struct Vertex{ XMFLOAT3 Pos; XMFLOAT3 Tangent; XMFLOAT3 Normal; XMFLOAT2 Tex0; XMFLOAT2 Tex1; XMCOLOR Coor; }; proof) std::vector mInputLayout = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,..
ㅇ
1. 행위 UML 다이어그램을 만들때에는 행위(behavior)부터 시작하는것이 좋다. 즉, 간단한 시퀀스 다이어그램을 통해 프로그램의 흐름이 어떤식으로 이루어지는지 부터 도식화하자. 도식화의 순서는 주로 sequence diagram(프로그램 흐름 순서) class diagram(클래스간의 관계) 위 순서를 통해 그린 후, 개선이 이루어진다. 예 휴대전화를 제어하는 소프트웨어가 있다. 숫자버튼이 눌릴때마다 어떤 번호가 눌려젔는지를 다이얼에 전달하면(1*), 다이얼에서는 화면에 눌려진 번호의 정보를 띄우면서(1.1), 해당 버튼에 맞는 음을 출력할것이다(1.2). 그리고 전송버튼을 누르면(2) 무선 통신 모듈(radio)에 연결 요청을 보내며(2.1), 연결 여부에 대한 결과를 화면으로 출력할것이다.(A..
이번절의 내용은 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의 정점에 공간적 위치 이외의 추가적인..