그래픽스 42

D3D11 Resize Viewport

뷰 포트를 윈도우 전체가 아니라,원하는 영역만 뷰포트를 사용하도록 하는 예제를 짜볼 것이다. 그 전에 RTV에 대한 정의를 해보자.RTV(Render Target View)란?RTV(Render Target View)는 GPU가 픽셀을 출력할 수 있는 대상(Render Target)을 가리키는 Direct3D 11의 뷰(View) 객체이다. 흔히 백 버퍼(back buffer)나 오프스크린 텍스처와 연결된다.RTV를 OMSetRenderTargets()를 통해 파이프라인에 바인딩하면, 렌더링 결과가 해당 리소스에 출력된다.뷰포트 설정 시, 이 RTV가 참조하는 텍스처의 크기를 기준으로 자동 조절 가능하다. 전체 코드: RTV 기준 자동 뷰포트 설정#include #include // Microsof..

그래픽스/DX11 2025.06.10

HLSL 개요

옛날 버전의 DX에서는 기본적인 쉐이더를 제공해주었지만, 이제는 그렇지 않다.따라서 DX를 난생 처음 본다 하더라도 VertexShader와 PixelShader는 짤 줄 알아야 DX를 쓸 수 있다. VertexShader와 PixelShader는 다른 프로그램이다.VS가 쫙 실행이 되고, PS가 실행이 된다.따라서 각각의 main이 있어야 한다. HLSL은 얼핏보면 C++과 비슷하지만 분명한 차이가 있다.근래에는 Shader Programming이 점점 복잡해지기 때문에 쉐이더를 파일로 넣어준다. AppBase::CreateVertexShaderAndInputLayout( L"ColorVertexShader.hlsl", inputElements, m_colorVertexShader,..

그래픽스/DX11 2025.06.03

MVP (Model, View, Projection)

MVP (Model, View, Projection) 매 프레임 당 한 번씩 호출되는 Update 함수 안에서 모델 변환을 의미하는 모델 행렬, 어떤 각도에서 어떻게 보는지 의미하는 시점 변환을 결정하는 뷰 행렬그것을 화면에 어떻게 프로젝션 시켜줄지 결정하는 프로젝션 행렬 이 행렬들을 합쳐서 MVP 라고 부른다. 이 세가지 행렬이 어떤 의미가 있는지 직관적으로 이해하고,관련 행렬을 통해서 DX에서 MVP를 구현해보자. 앞서 시점 변환에서 말했듯 어떤 방향에서 어떻게 보이는지를 알려면위치와 방향을 알아야한다.따라서 m_viewEyePos, m_viewEyeDir을 사용하는 것이다.viewUp도 내가 보고 있는 위 방향이 어디냐? 라는 것이다. 물체가 왼쪽으로 이동하던 보고있는 카메라(나)가 오..

그래픽스/DX11 2025.05.15

D3D11 조명 관련 노멀 벡터 변환

CPU에서 GPU로 데이터를 전송할 때는 비교적 속도가 느리니,최대한 단순하게 계산해서 접근할 수 있도록 하는 것이 좋다. 이러한 이론을 실제 코드로 구현하는 방법은여러 개의 변환을 순서만 잘 정리하면 하나의 변환 행렬로 만들 수 있다.따라서 결과적으로 GPU에게 회전과 이동을 한 하나의 변환 행렬만 보내면 된다. 이러한 변환에는Model Matrix, View Matrix, Projection Matrix가 같이 사용된다.위 3 가지는 나중에 추후 따로 더 자세하게 정리해보겠다. 이번 포스팅에서는 Model Matrix와 Invertranspose 두 가지를 사용해서쉐이더의 코드를 작성해볼 것이다.  노멀 벡터 노멀 벡터를 회전을 시킬 때는다른 방식을 사용해야 한다.물체를 회전을 시킨다면, 물체의 표면..

그래픽스/DX11 2025.02.03

D3D11 애파인 변환(=아핀 변환)

이동은 선형변환이 아니다.하지만 그래픽스에서 이동과 선형 변환을 동시에표현하고 싶을 때 사용하는 것이 애파인 변환이다. 즉, 애파인 변환이란선형 변환과 이동을 하나의 행렬로 표현한 것이다. Homogeneous Coordinates란?선형 변환하고 선형 변환이 아닌 이동을 합치기 위해서 새롭게 추가가 된 개념이다.벡터 : (x,y,z,0) 포인트 : (x,y,z,1)포인트 - 포인트 = 벡터포인트 + 벡터 = 포인트변환 전 직선은 변환 후에도 직선이다.이 식을 행렬 식으로 표현하면 다음과 같다.이러한 개념을 수학적으로 간단히 나타내면 애파인의 a를 따고,선형변환을 Tau라고 했다. 애파인 변환을 식으로 나타내면 다음과 같다.이런 식으로 애파인 트랜스폼을 사용할 수 있으므로,3차원에서는 4x4 행렬을 사용..

그래픽스/DX11 2024.12.16

D3D11 회전축에 대한 벡터의 회전

회전축에 대한 벡터의 회전 회전도 행렬로 표현할 수 있다.회전을 하려면 먼저 회전축을 결정해야한다.어떠한 축에 대해서 회전해야할지, 그 다음은 몇 도만큼 돌아가야할지를 결정한다. 회전은 비교적 3차원 공간보단2차원 공간에서 구현하기 쉽다. (3차원 회전을 다룰 때는 사원수(Quaternion)를 사용하게 된다.숫자 4개를 사용해서 회전을 표현하는 것이다.) 회전을 시키고자 한다면, 2차원 평면에서의 회전을 생각하면 좀더 쉽다.2D 평면에서 회전을 생각해보자.서로 다른 벡터가 필요하다는 것을 금방 알 수 있다. 회전 과정 1. 먼저 회전축 벡터(n)와 회전하고 싶은 벡터(v)를 외적 (Cross Product)를 한다. 2. 외적 값은 회전축 벡터(n)와 회전하고 싶은 벡터(v) 두 벡터에 모두에 해서 수..

그래픽스/DX11 2024.12.13

D3D11 선형 변환(Linear Transformation) - 동차성과 가법성

선형 변환에서 변환은 그래픽스에서 뭘까? 뭐가 될 수 있을까?변환이란 어떠한 함수라고 생각해보자. 그렇게 되면 위와 같은 식이 전개가 된다.그럼 이 Tau가 어떤 함수인가에 따라,Scaling이 되기도 하고, Rotation이 되기도 한다. 이 두 가지 사례를 만족하는 것이 선형 변환이다.그렇다면 선형 변환이 아닌 경우는 뭘까? 이처럼 동차성과 가법성을 만족해야만 하는 것이 선형 변환이다. 선형 변환이 아닌 경우 예를 들어 tau라는 변환이 x,y,z를 넣었을 때,x,y,z를 x^2, y^2, z^2인 경우 왜 선형 변환이 아닐까?~이 아닌 경우를 찾을 때는 그에 대한 반례를 찾으면 된다. k가 2라고 하고, 해당 식을 전개하면 다음과 같은 결과값이 나온다.1,2,3에다가 2를 각각 곱하면2,4,..

그래픽스/DX11 2024.12.12

D3D11 그래픽스 - 변환

어떤 점을 원점에 대해서 회전시키는 경우어떤 점을 원점에 대해서 회전시키는 경우에어떠한 점 (= 임의의 점) xy를 하나의 미지수 (x,y)로 표현할 수 있고,그 임의의 점을 원점(여기서 원점은(0,0)이 아닐 수도 있다.)을 기준으로 θ만큼 회전 시킨 지점을 (x',y')로 표현할 수 있다.그러한 (x',y') 지점을 구하는 식은 아래와 같다. 그럼 열벡터(Column Vector) 형태의 회전 변환을행벡터(Row Vector)형태의 회전 변환 할까?방법은 간단하다. 좌변에도 전치(Transpose)를 해주고,우변에도 전치(Transpose)를 해준다. 이 식의 전개를 글로 풀어보면 다음과 같다.좌변에 Transpose를 해주고,우변에도 통째로 Transpose를 해준다. 이 Column vector는..

그래픽스/DX11 2024.12.11

인공지능 - 길찾기 BFS

길 찾기 알고리즘은 두 지점의 경로상에 있는 장애물을 피해서 길을 찾는다.이 길 찾기의 복잡성은 두 점 사이에는 여러 다양한 경로 집합이 존재할 수 있다는 사실에 있다.하지만 이러한 경로 중 아주 적은 수의 경로만이 최단 경로이다.장애물의 표면을 따라 이동하는 AI는 지능적으로 보이지 않는다.그래서 최단 경로를 찾기 위해서 모든 가능한 경로를 효율적으로 탐색하기 위한 방법이 필요하다. 그래프 길 찾기 문제를 풀기 전에 먼저 AI가 통과할 수 있는 게임 세계의 부분을 표현하는 방법이 필요하다.일반적으로는 그래프 데이터 구조를 많이 선택한다.그래프는 일련의 노드를 포함한다. 이 노드는 에지를 통해서 서로 연결된다. 이 에지는 방향성이 없는 경우가 있는데방향성이 없다는 것은 양방향으로 이동할 수 있다는 걸 의..

그래픽스/OpenGL 2024.10.30