GPUALU가 많아 독립적 계산에 특화된 장치렌더링 파이프라인Input-Assembler stage정점 정보 전달 단계Vertex shader stage : 필수적전달 받은 정점들에 대해 변환을 계산하는 단계Tessellation stagesDirectX11에서 추가된
비주얼 스튜디오에서 윈도우 어플리케이션으로 프로젝트 생성프로그램은 wWinMain 함수를 메인으로하여 돌아간다.프로그램이 꺼지지 않고 해당 함수를 계속하여 반복GetMessage 함수는 블락킹 함수로 키보드나 마우스 같은 이벤트가 발생하지 않으면해당 함수에 멈춰있음=>
EngineAdjustWindowRect => 윈도우창의 크기 조절SetWindowPos => 윈도우창의 위치 조절 (100, 100에 위치하도록):: => 글로벌 스페이스 함수를 명시적으로 표현그려질 화면 크기를 설정엔진 사총사Device디바이스 삼총사debug, D
Root SignatureGPU내의 램을 사용할 수 있도록 함INPUT_ASSEMBLER_INPUT 모드로 root signature 생성추후 다른 기능이 필요할 때 모드를 추가Mesh정점 정보들과 버퍼를 관리하는 클래스정점은 위치와 색 정보로 이루어져 있음GPU 메모
쉐이더에서 함수에 매개변수를 넣고 다양한 행동을 하기 위해서는인자는 GPU의 레지스터가 특정 값을 로드하도록 요청하여해당 레지스터를 변수처럼 사용=>root signature를 통하여 레지스터 사용을 예약해야 함API bind slot은 API의 번호이며 순서대로 매겨
root signature의 슬롯 메모리 한계로 인하여 테이블을 사용해야할 경우table은 포인터처럼 사용되어 마치 사용할 레지스터 배열의 시작점을 알려주는 것과 비슷함Constant buffer들을 가리키는 Decriptor heap(CBV)를 만들고 이를 복사하여
vertex buffer만 사용하는 경우메쉬가 이어지는 부분에 정점이 중첩되게 됨=>사각형을 만들면 vertex 2개가 낭비되며 비효율적임vertex + index buffervertex buffer 정점들의 데이터 (중첩되는 부분은 제거)index buffer 삼각형
정점들의 색상 정보를 이미지를 통하여 건네주는 방법UV좌표정점과 맵핑하기 위한 이미지의 좌표계상단 좌측 모서리 (0,0) 우측 모서리 (1,0)하단 좌측 모서리 (0,1) 우측 모서리 (1,1)0 ~ 1 사이의 값을 가지게 됨랜더링 파이프라인에서 rasterizer 단
Depth stencil view3d 물체를 표현하기 위한 뷰깊이 값을 통하여 투영 시 비율을 설정하고다른 픽셀에 의해 가려질 시 그리지 않는 등 추적랜더링 파이프라인에서 Rasterizer 단계일 때, 투영 좌표계를 벗어날 경우 clipping하여 표현하고 있었음(-
카메라나 객체를 이동시키기 위하여 유저의 입력을 받는 Input시간과 프레임 간의 시간차를 알기 위한 TimerVK\_ 접두사가 붙은 변수는 윈도우에서 정의된 변수임 (WinUser.h)Input 클래스를 생성 시 윈도우 핸들을 받아 현재 게임 창이 활성화 되었을 때의
Mesh, Shader, Texture를 하나로 통합하여 관리 => Material 해당 리소스들은 어떤 물체를 나타낼 때 사용되는데 해당 물체가 여러 개 표현되어야할 때도 하나만 있으면 됨 => 재사용 (normal map: 빛 반사 텍스쳐로 음영 및 질감 표현
객체에 특정 기능을 하는 컴포넌트들을 조립하여 기능들을 사용할 수 있도록 구현=>컴포넌트 패턴GameObejct 클래스게임에서 생성되는 모든 객체를 나타내는 클래스컴포넌트들을 조립하여 사용shared_from_this() 함수를 사용하기 위해 enable_shared_
게임 객체들을 관리하는 하나의 클래스프레임마다 모든 객체들을 순회하며 업데이트 시킴여기서는 하나의 vector로 구현하였지만, 유니티에서는 레이어마다 vector를 만들어검색을 보다 빠르게 할 수 있도록 함SceneManagerScene들을 관리하며 객체들이 적절한 때
Law of cosines (코사인 법칙) $c^2=a^2+b^2﹣2abcosγ$ => 피타고라스의 증명: $γ = 90\degree$ 코사인 덧셈 정리 이미지 출처 [증명](https://nous-temperature.tistory.com/573
내적$a \\cdot b = |a||b|cos\\theta$$= a_xb_x + a_yb_y$cos 함수가 상대적으로 느리기 때문에 곱을 사용하여 구하는 것이 좋음$cos\\theta$가 핵심좌우 판별, 투영Dot 함수외적$a \\times b = |a||b|sin\\
직교 행렬행벡터와 열벡터가 유클리드 공간의 정규 직교 기저를 이루는 실수 행렬$M=\\left \\begin{matrix}0&0&1\\1&0&0\\0&1&0\\\\end{matrix} \\right$행벡터 간 혹은 열벡터 간 내적의 값이 모두 0인걸 알 수 있음$M \
월드 공간을 카메라 기준으로 보여주기 위해 객체들의 위치를 카메라 좌표계를 기준으로 계산아핀 공간점과 벡터의 차이벡터는 크기와 방향으로 시작점이 필요 없음 => 기하 벡터=> (x, y, z, 0)점은 원점을 기준으로 위치를 나타내며 시작점이 필요=> 위치 벡터=> (
(local, model) space => world space => (view, camera, eye) space => clip space (원근 or 직교 투영) => (view port, window, screen) space (모니터)(local, model)
view space => (clip, projection) space이미지 출처카메라로부터 z축으로 1만큼 떨어지고 원점 (0,0)에서 상하좌우 크기가 1인 평면으로 투영(x, y, z ,1)=>원근 투영z 축값에 따라 비율이 달라짐$\\left( \\frac{x}{z
SimpleMath.cpp, .h, .inlGit으로 공유 중인 DirectXTK12 내에서 제공하는 수학 관련 클래스계산 최적화 및 행렬의 전치, 역행렬, up vector, right vector 등을 쉽게 구할 수 있도록 도와주고행렬 변환 시 필요한 것들을 만들
Cube높이가 h, 깊이가 d, 넓이가 w일 때 육면체의 중앙이 원점에 있을 때 꼭지점의 좌표들을 계산할 수 있음=>육면체 정면 좌표(-w, h, -d) / (w, h, -d)(-w, -h, -d) / (w, -h, -d)위와 같이 뒷면 좌표들도 구하면 된다Spher
종류directinal : 먼 곳에서 일정한 방향으로 균일하게 쏘는 빛point : 특정한 곳에서 일정 반경까지 쏘는 빛 (멀수록 약해짐)spot : 일정한 부분만 비추는 빛특정한 점에 접하는 평면에 수직하는 방향 벡터를 normal 벡터라 한다평면에 속하는 벡터는 t
light 클래스빛의 3가지 타입 정의빛의 3 속성을 담는 데이터 정의쉐이더에서 계산시 필요한 정보들을 모두 담고있는 데이터lightType이 uint8이 아니라 int32인 이유는 쉐이더 데이터 패딩 때문padding 또한 데이터를 16바이트 배수로 만들기 위한 값쉐
Normal mapping (bump mapping)rasterizer 단계에서 정점과 정점 사이를 보간할 때 텍스쳐가 밋밋하게 보이는 단점이 있음이를 방지하려면 정점 개수를 늘리면 되지만, 그렇게 되면 성능이 크게 떨어질 수 있음color 텍스쳐의 uv 좌표에 해당하
플레이어를 둘러싸는 큐브 또는 구를 만들고 물체 표면에 하늘 텍스쳐를 입힘=>밖에서는 어디든 하늘을 볼 수 있음skybox에 의해 skybox 뒤에 있는 다른 물체들이 안보일 수 있음카메라가 이동해도 항상 멀어보이도록 해야 함1 => view space에서 항상 dep
카메라의 절두체 영역 밖 물체들을 그릴 필요가 없기 때문에 CPU 단계에서 필터링하는 최적화 기술평면평면의 방정식ax + by + cz + d = 0normalize(a,b,c) = 노멀 벡터평면 위의 점 $A(x,y,z), B(x', y',z')$$AB 벡터 = (x
오일러 각의 회전에 문제가 있음 => 짐벌락 현상유니티 엔진에서는 z축, x축, y축 순으로 회전을 계산함z축의 회전에 따라 x,y 축이 영향을 받고 x축에 따라 y축이 영향을 받음문제는 2번째 계산되는 축이 회전했을 때 1, 3번째 축이 겹치면서 발생=>2개의 회전축
직교 투영투영 시 깊이 값에 따라 물체의 비율이 정해지지 않고,고정된 비율을 가지고 투영시키는 것2d 게임이나, 3d 게임의 2d UI로 사용 시 필요windowheight: hwidth: wzfar: fnear: n=>x: 2x / wy: 2y / hz: (z - n
forward shader결과물인 render target view를 제외한 중간 계산 결과들이 휘발성으로 없어짐UI를 그릴 때 보통 사용<=>deferred shader카메라의 결과물을 텍스쳐에 저장하여 해당 텍스쳐를 활용할 수 있음=>렌더링의 중간 결과값(de
position + normal + diffuse(color) + diffuse light + specular light5개의 텍스쳐를 저장 후 한번에 계산물체를 그릴 때 모든 빛을 검사하여 영향을 받는 광원을 찾아서 그리는게 아닌빛을 그릴 때 물체를 찾아서 그림 =>
GPGPU일반적인 연산 용도로 GPU를 사용이펙트나 애니메이션 등 계산 시 유용CPU와 GPU 통신 속도에 제한이 있기 때문에CPU 부담이 큰 일을 처리할 때만 사용compute 쉐이더 파일u 레지스터는 일반적인 그래픽 연산에 사용하는 레지스터가 아님이미지출처 numt
특수한 효과를 내기 위하여 작은 입자들을 사용할 시 수백, 수천개가 필요할 수 있고,이를 이전과 마찬가지로 렌더링할 시 부하가 매우 큼=>instancing 기술 사용input assembler로 한번 전달 받은 정보를 정한 회수만큼 반복=>reduce draw cal
버텍스, 인덱스, 머티리얼 등이 동일한 물체가 여러 개로 존재한다면,해당 정보들을 계속해서 받는 것이 아니라 한번 받은 정보를 재사용하여그려주도록 함인풋 어셈블러에 정점 정보들과 해당 정점들을 사용하는 물체들의 position 값을 같이 넘겨주어instancing 할
광원 기준으로 깊이값을 텍스쳐로 저장렌더 시에 카메라 기준 좌표계를 광원 기준 좌표계로 변환 후변환된 uv 좌표와 깊이 텍스쳐를 통하여 그림자 필요 유무를 판별한다.shadow 쉐이더 파일버텍스 쉐이더의 system value position은 픽셀 쉐이더로 넘어갈 시
tessellation stageshull shadertessellator (자동 단계)domain shaderLOD거리에 따른 메쉬를 만들어두어 멀어질 수록 버텍스가 적은 메쉬를 가지도록 교체동적 LOD렌더링 단계에서 버텍스를 조절지형 또한 적용 가능control p
지형을 항상 만드는건 아님 (메쉬를 지형으로 사용하는 경우)삼각형 메쉬를 바닥면에 일정한 간격으로 생성하여 사각형을 만듬이 후 높이를 조절 후 높이 값만 저장해두고 사용 height mapterrain 쉐이더 파일constant hull shader에서는카메라와 삼각형
레이캐스팅보이지 않는 광선을 쏘고 광선이 collider와 충돌하여 물체를 판별=>유저의 입력을 받아서 계산하는 경우 픽셀 좌표(스크린 공간)를 이용하여 역변환screen -> clip -> view -> world -> local광선과 판별할 물체들을 view ~ l
FBX SDK모델 파일을 읽어 들일 때 사용하는 라이브러리FBX 파일에는 정점, 머테리얼, 애니메이션 등의 정보가 담겨 있음FBX loader 클래스 구현FBX 파일을 읽어 우리가 사용할 구조에 맞게 로드하는 클래스 구현mesh data 클래스 구현FBX에서 읽어온 데
모델의 관절이나 중요점들에 뼈대를 만들어 두고 텍스쳐가 뼈대의 움직임을 따라 움직이도록 함이 때 뼈대는 트리 구조를 가지고 상위 노드가 움직일 시 하위 노드들이 따라 움직이게 됨기본적으로 모델은 전체 모델의 로컬 좌표계 기준으로 되어 있고 이를 뼈대 기준으로 변환을 한