일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SQL
- MYSQL
- Trie
- Stored Procedure
- Two Points
- two pointer
- DP
- String
- Dijkstra
- 스토어드 프로시저
- Hash
- 그래프
- Brute Force
- union find
- 이진탐색
- binary search
- 다익스트라
- Today
- Total
목록분류 전체보기 (418)
codingfarm
렌더링 파이프라인에는 텍스처를 묶을(bind) 수 있는 단계(stage)들이 여럿 있다. 흔한 용도는 텍스처를 렌더 대상으로 묶는것(Direct3D가 텍스처에 렌더링 하는경우)과 셰이더 자원으로서 묶는 것(셰이더 안에서 텍스처를 추출하는 경우)이다. 이 두 가지 용도의 텍스처를 생성할 때에는 다음과 같이 텍스처를 묶을 두 파이프라인 단계를 지정한 결속 플래그(bind flag)를 사용한다. D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE 그런데 사실 텍스처 자원이 파이프라인의 단계에 직접 묶이는 것은 아니다. 실제로는 텍스처가 연관된 자원 뷰를 파이프라인 단계에 묶는다. 어떤 용도이든 Direct3D에서 텍스처를 사용하려면 텍스처의 초기화 시점에서 그 텍스..
렌더링 과정에서 GPU는 자원들에 자료를 기록하거나(후면 버퍼나 깊이, 스텐실 버퍼 등) 자원들에서 자료를 읽어들인다.(표면의 모습을 서술하는 텍스처나 장면안의 기하구조의 3차원 위치들을 담은 버퍼 등) 그리기 명령을 제출하기 전에, 먼저 해당 그리기 호출이 참조할 자원들을 렌더링 파이프라인에 묶어야(bind)한다. 이를 가리켜 자원을 파이프라인에 "연결(Link)한다" 또는 "바인딩(Binding)한다" 라고 말하기도 한다. 그리기 호출마다 달라지는 자원도 있으며, 필요에 따라 그리기 호출마다 그런 자원들의 바인딩을 갱신해 주어야 한다. 그런데 GPU 자원들이 파이프라인에 직접 묶이는것은 아니다. 실제로 파이프라인에 묶이는것은 해당 자원을 참조하는 서술자(Descriptor) 객체이다. 서술자 객체는 ..
깊이 버퍼(Depth Buffer)는 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0.0에서 1.0 까지의 값으로, 0.0은 관찰자와 최대한 가까운 픽셀에 해당하고 1.0은 최대한 먼 픽셀에 해당한다. 깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대응된다. 즉, 깊이 버퍼와 후면버퍼는 같은 해상도를 지닌다. 아래 그림처럼 몇몇 물체가 다른 물체들을 가리고 있다고 해보자 한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정 하기 위해 Direct3D는 깊이 버퍼링 또는 z-버퍼링이라는 기법을 사용한다.깊이 버퍼링을 이용하면 물체들을 그리는 순서에 상관없이 물체들이 제대로 가려진다. 깊이 문제를 해결하는 방법은 장면의 물체를 먼것에서 가까운것..
모니터에 하나의 프레임 버퍼를 가지고 게임화면을 표현한다면, 매 프레임마다 버퍼를 지우고 그리거나 이미 그려진 버퍼에 덮어쓸것이다 전자의 경우에는 버퍼가 지워지는 찰나의 순간이 화면에 표시되면 화면 깜빡임(Screen Flickering)현상이 나타나며, 후자의 경우에는 화면이 그려지는 도중에 이전 화면가 현재화면이 겹처지면서 화면 찢어짐(Screen Tearing)현상이 생길것이다. 결국 이는 보는이에게 불편함을 끼치게 된다. 이러한 현상을 피하고자 사용하는 방법이 2개의 프레임 버퍼를 이용하는것이다. 각각의 프레임 버퍼는 각 화면 바깥의 텍스처인 후면 버퍼(Back Buffer)와 전면 버퍼(Front Buffer)을 뜻한다. 전면버퍼를 이용해 현재 화면을 표현하면서, 다음 화면이 될 장면을 후면 버..
2차원 텍스처는 자료 원소들의 행렬(2차원 배열)이다. 2차원 텍스처의 용도 중 하나는 2차원 이미지 자료를 저장하는 것인데, 이때 텍스처의 각 원소는 픽셀 하나의 색상을 담는다. 하지만 텍스처가 꼭 이미지 자료의 저장만을 위해 사용되는 것은 아니며 훨씬 범용적으로 사용된다. 예를 들면 법선 매핑 같은 경우 텍스처에 각 원소의 색상이 아닌 3차원 벡터를 담는다. 텍스처에는 아무 자료나 담을 수 있는 것은 아니다. 텍스처에는 특정 형식(format)의 자료 원소들만 담을 수 있는데, 구체적인 형식은 DXGI_FORMAT이라는 열거형으로 지정한다. 자료 원소 형식들을 나열하면 다음과 같다. docs.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiforma..
COM(Component Object Model)은 어떤 프로그램이나 시스템을 이루는 컴포넌트들이 상호 통신할 수 있도록 하는 메커니즘이라고 할 수 있다. 그렇기 때문에 COM을 이용하면 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 할 수 있다. COM 객체는 흔히 인터페이스라 부르지만, C++클래스로 간주해도 무방하므로 흔히 COM 객체라고 부른다. C++로 DirectX 응용프로그램을 프로그래밍 할때 COM의 세부사항 대부분은 프로그래머에게 드러나지 않는다. 프로그래머가 알아야 할 것은 필요한 COM 인터페이스를 가리키는 포인터를 특별한 함수들을 이용해서, 또는 다른 COM 인터페이스의 메서드를 이용해서 얻는 방법 뿐이다. COM 인터페이스를 new나 delete를 이용하여 색성,..
Direct3D는 응용 프로그램이 3차원 그래픽 가속기능을 이용해서 3차원 세계를 렌더링할 수 있게 하는 저수준 API(Application Programing Interface)이다. 그래픽 하드웨어를 제어할 수 있는 소프트웨어 인터페이스를 제공한다. 응용프로그램과 그래픽 하드웨어 사이에 간접층로써 응용프로그램 개발자는 하드웨어의 구체적인 세부사항을 걱정할 필요가 없다. 이를 위해서는 GPU 제조사들이 Direct3D 팀과의 협업으로 Direct3D를 준수하는 드라이버를 제공해야 한다. 과거에는 GPU 장치가 Direct3D 9 능력 집합의 일부만 지원해도 되었다. 그래서 Direct3D 9의 어떤 특정 기능을 사용하고자 하는 응용 프로그램은 반드시 현재 하드웨어가 그 기능을 지원하는지를 먼저 점검해야..
메시지 박스 : 조그만 별도의 윈도우를 열어서 사용자에게 정보를 전달하거나 질문을 하는 장치 MessageBox 함수 호출 한번으로 비교적 간단하게 만들 수 있다. int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); 매개변수 기능 hWnd $\bullet$ 메시지 박스의 오너(Owner) 윈도우 $\bullet$ 메시지 박스가 떠 있는동안 오너 윈도우는 사용할 수 없는 상태가 된다. lpText 메시지 박스에 출력할 문자열 lpCaption 메시지 박스의 타이틀 바에 나타날 제목 문자열 uType 메시지 박스에 어떤 종류의 버튼이 나타날 것인가를 지정하는 여러가지 플래그들 uType에 심을 수 있는 값은 아래와 같다. 값..
비례 행렬 생성 XMMATRIX XM_CALLCONV XMMatrixScaling( float ScaleX, float ScaleY, float ScaleZ ); 벡터의 성분들로 비례 행렬 성생 XMMATRIX XM_CALLCONV XMMatrixScalingFromVector( FXMVECTOR Scale ); $x,y,z$ 축에 대한 회전행렬 $R_x,R_y,R_z$ 생성 XMMATRIX XM_CALLCONV XMMatrixRotationX( float Angle ); XMMATRIX XM_CALLCONV XMMatrixRotationY( float Angle ); XMMATRIX XM_CALLCONV XMMatrixRotationZ( float Angle ); 임의의 축에 대한 회전행렬 $R_n$ ..
한 기준계의 점 또는 벡터의 상대적인 좌표를 다른 기준계에 상대적인 좌표로 변환하는 것을 좌표 변경 변환이라 한다. 위그림에서 $i$축과 $j$축에 대해 존재하던 상대 좌표 $p$가 있다. 축 $i$와 $j$가 변형될경우, $\tau(i)$와 $\tau(j)$에 대해 점 $p$도 변형되어 $\tau(p)$에 위치하게 된다. 3차원 컴퓨터 그래픽에서는 여러개의 좌표계를 사용하는 경우가 많으므로, 한 좌표계에서 다른 좌표계로의 변환 방법에 익숙할 필요가 있다. 위치는 벡터가 아니라 점의 속성이며, 점에 대한 좌표계변환과 벡터에 대한 좌표계 변환은 서로 다르다. $\blacksquare$ 벡터 두 좌표계 $A$와 $B$, 그리고 벡터 $p$가 있다. 좌표계 $A$에 상대적인 $p$의 좌표가 $p_A=(x,y)..
함수 $\tau$에 대하여 아래와 같은 성질이 성립하면, 그리고 오직 그럴때에만 $\tau$를 가리켜 선형변환(linear transformation)이라 부른다 $$\tau (u + v) = \tau (u) + \tau (v)$$ $$\tau(ku) = k \tau(u)$$ 여기서 $u$와 $v$는 벡터이고, $k$는 스칼라이다. 비례(scaling) 물체의 크기를 바꾸는 효과를 내는 선형변환이다. 비례변환은 다음과 같이 정의된다. $$S(x,y,z) = (s_xx, s_yy, s_zz)$$ 이는 현재 좌표계를 기준으로, 벡터를 $x$축으로 $s_x$ 단위, $y$축으로 $s_y$단위, $z$축으로 $s_z$단위 만큼 비례한다. 선형 변환에 대한 표준행렬 S는 아래와 같다. $$S = \begin{bm..
3차원 컴퓨터 그래픽에서 행렬(matrix)의 사용 목적은 주로 아래와 같다. 1. 비례나 회전, 이동 같은 기하학적 변환을 간결하게 서술 2. 점이나 벡터의 좌표를 한 기준계에서 다른 기준계로 변환 8. DirectXMath의 행렬 3차원 그래픽에서 점과 벡터를 변환할 때에는 $1 \times 4$ 행벡터와 $4 \times 4$ 행렬을 사용한다. DirectXMath 라이브러리로 $4 \times 4$ 행렬을 표현할 때에는 XMMATRIX라는 형식을 사용한다. struct XMMATRIX { union { XMVECTOR r[4]; struct { float _11; float _12; float _13; float _14; float _21; float _22; float _23; float _24..
#pragma는 define이나 include같은 전처리구문(precomplier)의 하나이다. 컴파일러에게 #pragma 뒤에 오는 내용에 따라 어떤일을 하라는 전처리 명령이다. 주로 쓰이는 사용법은 아래와 같다. #pragma once 한번 컴파일 되면 더이상 컴파일 하지 않는다는 뜻이다. 여러개이 cpp 파일이 있을때, 하나의 cpp 파일이 수정되면, 그 파일만 컴파일하고 나머지는 하지말아란 뜻이다. #pragma comment(lib, "ws2_32") 컴파일시 ws2_32.lib 파일을 링크하라는 명령이다. 보통 visual studio 같은 IDE 개발환경에서는 프로젝트 셋팅에서, 리눅스 터미널등의 cmd 환경에서는 gcc를 이용한 컴파일시에 세팅해주는 방법을 코드냉서 가능하게 해준다. #pr..
그래픽 출력도 문자열 출력과 방법은 크게 다르지 않다 아래와 같은 함수들을 사용한다. COLORREF SetPixel(hdc, nXPos, nYPos, clrref) DWORD MoveToEx(hdc, x, y, lpPoint) BOOL LineTo(hdc, xEnd, yEnd) BOOL Rectangle(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect) BOOL Ellipse(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect) 모든 GDI 함수의 첫번째 인수는 항상 DC의 핸들인 hdc이다. SetPixel COLORREF SetPixel( HDC hdc, int x, int y, COLORREF color ); 화면에 점..
1. TextOut 콘솔의 printf와 대응하는 함수라 볼 수 있다. BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString); docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-textouta 매개변수 매개 변수 기능 hdc DC의 핸들 nXStart 문자열이 출력될 좌표 nYStart lpString 출력할 문자열 cbString 출력할 문자열의 길이 문자열을 출력하기 위한 여러 복잡한 정보들(정렬 등)을 DC에 지정하고 TextOut의 인자로 전달함에 주목할것 TextOut 함수는 널 종료 문자열을 인식하지 않으므로 출력할 문자열의 길이를 인수로 반드시 밝..
1. DC(Device Context)의 필요성 윈도우즈는 세가지 DLL(동적 연결 라이브러리)로 구성되어 있다. KERNEL : 메모리를 관리하고 프로그램을 실행한다. USER : 유저 인터페이스와 윈도우를 관리한다. GDI : 화면 처리와 그래픽을 담당한다.(Graphic Device Interface) 윈도우즈 API 함수의 대부분은 이 세가지 DLL에 의해 제공된다. 출력을 위해선 이 중 GDI에 관심을 가져야 한다. 결론부터 말하면 DC는 GDI를 활용해 화면을 그림에 있어서 부수적인 부분을 최소화 하여 개발자들이 당장 필요로 하는 정보에만 집중하게끔 해주는 역할을 담당한다. 이 DC의 역할을 되새기며 화면 출력에 DC가 필요한 이유를 위한 예를 상황과 함께 들어본다. 상황1 화면에 선을 긋는 ..
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE g_hInst; LPCTSTR lpszClass = TEXT("First"); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpszCmdParam, int nCmdShow) { HWND hWnd; MSG Message; WNDCLASS WndClass; g_..
대부분 키보드로 명령을 입력하면 실행결과는 화면에 출력되는 방식으로 시스템을 사용해왔다. 입룩과 출력으로 사용하는 장치를 바꾸면 입력을 파일에서 읽어오거나 실행결과를 파일로 저장하는 것들이 가능하다. 표준 입출력 장치 리눅스에서는 표준입력장치와 표준출력장치를 아래처럼 정의한다. 표준 입력 장치 : 셸이 작업을 수행하는데 필요한 정보를 받아들이는 장치 표준 출력 장치 : 실행 결과를 내보내는 장치 표준 오류 장치 : 표준 출력과 별도로 오류 메시지를 내보내는 장치 기본적으로 표준 입력장치는 키보드로 설정되어있고, 표준 출력 및 오류 장치는 화면(모니터)로 설정된다. 리눅스는 모든걸 파일로 관리하며 이는 장치도 마찬가지다. 파일 디스크립터(file descriptor) : 셸이 작업에 필요한 파일을 관리하기..
Top_Bar Bottom_bar A B Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt >ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non p..
1. 객체란? JS는 객체 기반의 프로그래밍 언어이며, JS를 구성하는 거의 모든것이 객체이다. 원시값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다. 원시타입 : 하나의 값만 나타낸다. 객체타입 : 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조다. 원시 타입의 값, 즉 원시값은 변경 불가능하지만, 객체는 변경 가능한 값(mutable value) 이다. 이는 추후 자세히 살펴볼것 객체는 0개 이상의 프로퍼티로 구성된 집합이다. 프로퍼티는 키와 값으로 구성된다. var person = { name: 'Lee', age: 20 }; name : 'Lee'와 age: 20 각각의 문장들은 프로퍼티로 분류된다. name과 age는 프로퍼티 키, 'Lee'와 20은 프로퍼티 값이..