C++

면접에 나올 수 있는 주요 내용을 한번 테마별로 정리해보겠다. 벡터와 행렬과 같은 내용은 중요는 하지만 면접에 나올만 내용은 아니다. 이를 모르면 렌더링이라는 것에대해 설명할 수 없기 때문에 아예 기초 수준으로 깔고 가기 때문이다.더보기ne*** 에서는 행렬의 교환 법칙과 결합 법칙을 물어본 적이 있다고 한다. 1. SwapChain을 사용하는 이유? 더블 버퍼링이란? 후면 버퍼와 정면 버퍼의 역할?더보기SwapChain은 전면 버퍼와 후면 버퍼 간의 교체를 관리하기 위해 사용합니다. 이를 활용해 더블 버퍼링은 하나의 버퍼만 사용했을 때, 렌더링 중 화면 깜빡임이 발생하는 것을 방지하고 성능을 향상시키기 위해 두 개의 버퍼를 사용하는 것을 의미합니다. 여기서 후면 버퍼는 현재 GPU가 그리고 있는 버퍼이..
Terrain물방울 책에 있는 Terrain 예제는 엄청난 기술들의 집합이다.이렇게 큰 terrain을 관리할 때, 여기에 사용된 주된 기술은 다음과 같다.지형의 높이를 관리하기 위해 Height map 이라는 텍스처를 이용한다. 이때 이 텍스처는 일정 텀마다의 높이를 저장하고 있다. (HeightMap을 통한 지형 높이 지정)Smooth하게 높이를 만들기 위해 쉐이더에서 위치를 Height map을 이용해 지정하기 직전 주변 픽셀 8개를 분석해 평균 값으로 높이를 지정한다.(주변 높이와 평균 값을 맞춰 Smooth)두번째 사진과 같이 Tessellation을 이용해 LOD를 적용했다. 이때 사용된 것은 Terrain이 워낙 넓기 때문에 이를 몇개의 그리드로 잘라서 해당 그리드가 카메라와 멀어지면 삼각형..
Picking카메라에 화면을 클릭해 어떤 물체에 대한 반응을 일으키는 것을 Picking이라고 할 수 있는데화면에 물체가 보여지기 위해선 로컬 좌표계 - 월드 좌표계 - 카메라 좌표계 - 투영 좌표계 - 스크린 좌표계로 변환해야한다.반대로 카메라의 화면을 클릭해서 클릭된 위치의 물체를 알기 위해선 위의 순서를 반대로 진행하면 된다. 여기서 생각해봐야하는 점이 있다. Picking을 진행하는 건 CPU인가 GPU인가? 당연히 CPU이다.Picking은 렌더링 파이프라인이랑 전혀 상관이 없다. 그렇다면 어느 좌표계에서 Picking을 진행하면 좋을까?가령 내가 화면을 선택했을 때, 선택된 좌표는 스크린 좌표계일 거고 이를 역순으로 좌표계를 변환 할 것이다. 그리고 내가 선택하고자 하는 물체는 로컬좌표계에 있..
Tessellation렌더링 파이프라인에서 Geometry Shader보다 더 빨리 실행 되는 부분이 있다. VS 다음 Hul Shader, Tessellator, Domain Shader 단계 총 3가지를 합쳐서 Tessellation 이라고 한다. 그렇다면 Tessellation이란 뭘까?기하 구조를 더 작은 삼각형으로 분할하고 새로 생긴 정점들의 위치를 적절한 방법으로 조절하는 것으로 정의할 수 있다.말만 들으면 되게 와닿지 않는다. 그럼 사용하는 때를 생각해보면 Tessellation은 Terrain에서 가장 많이 사용한다. GPU에 lod 연산이 필요할 때, 효율적인 물리 애니메이션을 계산할 때, 메모리 전략으로 low 폴리곤 버전으로 전달해 준 객체를 high 폴리곤 버전으로 변환할 때 등 에..
Geometry Shader아주 멀리있는 오브젝트나 반복되는 물체는 Billboard를 통해서 작업하게 된다. 그전에 작업했던 방식을 떠올려보면 하나의 vertex buffer에 정점을 하나의 위치에 4개를 전부 다 배치한 다음 쉐이더에 넘겨주고, 쉐이더 측에서 정점을 옮겨 위치를 잡아주는 형식을 사용했다. 하지만 이보다 조금 더 우월한 방식을 사용해보자. 렌더링 파이프라인에서 VS와 RS 단계 사이에 Geometry Shader 단계가 있다. 이 친구가 하는 역할은 입력 받은 정점의 개수를 임의로 늘렸다 줄였다 할 수 있게 해준다. 즉, 정점을 맘대로 늘릴 수 있기 때문에 입력된 오브젝트를 복사 아닌 복사가 가능하다.나무를 빌보드를 이용해 만들 것인데, GeometryShader를 이용한다.코드를 살펴..
조명물방울책에서 제공하는 조명 예제의 완성본은 다음과 같다.스포트라이트와 가운데 포인트라이트 그리고 나머지는 웨이브 오브젝트에 텍스처를 입혀 구현했다.주목해야하는 점은 조명이다.스포트라이트와 포인트라이트는 일반 빛 조명과 크게 다르지 않다. 단지 여러 세부 옵션이 추가된 것이다.#pragma oncestruct DirectionalLight{ DirectionalLight() { ZeroMemory(this, sizeof(this)); } XMFLOAT4 Ambient; XMFLOAT4 Diffuse; XMFLOAT4 Specular; XMFLOAT3 Direction; float Pad; // Pad the last float so we can set an array of lights if we wan..
물방울 책이라고 하는 DX11 책에 나오는 내용을 집중적으로 부분부분 알아보자.물방울 책은 오래전엔 나올 책이기에, 그 책에 나와있는 코드를 그대로 사용할 경우 100% 에러가 날 것이다. 그렇기 때문에 스스로 수정을 해야만한다.Direct3D의 초기화4장 첫번째 챕터인 초기화하는 부분 코드를 분석해보자.일단 코드 자체를 실행하면 다음과 같다.빈 화면과 함께 프레임, ms초가 나온다.#include "pch.h"#include "01. InitDemo.h"InitDemo::InitDemo(HINSTANCE hInstance) : App(hInstance){}InitDemo::~InitDemo(){}bool InitDemo::Init(){ if (!App::Init()) return false; retu..
ViewPort우리가 유니티를 사용하던 어느 특정 엔진을 사용하던 공통적으로 제공되는 기술이 하나 있다. 바로 화면을 클릭했을 때, 특정 물체가 픽킹되거나 좌표가 픽킹되는 것이다.가령 우리가 롤 이라는 게임을 즐길 때도 마우스 우클릭으로 땅바닥을 클릭하면 그 좌표로 캐릭터가 움직이는 것을 볼 수 있다.이는 쉬운 작업이 아니다. 왜냐하면 캐릭터가 존재하는 세상은 3D 세상이고 유저 입장에서는 화면이 2D이기 때문이다. 우리는 캐릭터가 카메라를 넘어 스크린화면 까지 넘어오기 위해 다음과 같은 작업을 했다.wolrd 변환 -> camera 변환 -> projcetion 변환 -> 좌표 정규화 -> screen 변환  이런 과정을 온전히 거쳤을 때야 어떤 오브젝트가 카메라를 기준으로 그려지게 된다. 그렇다면 2..
이번 챕터에서 주된 공부할 내용은 CPU에서 하던 일을 GPU에게 떠넘기는 것이다.CPU는 할일이 많은 반면(우리가 짠 코드 이외에도 여러 일을 담당) GPU는 할 일이 많이 없는 경우가 생긴다. 그래서 우리의 목표는 CPU도 바쁘게 GPU도 더 많은 일을 할당 받아 바쁘게 돌아가게 하는 것이다.GPU한테 어떻게 일을 분산 시킬 것인가? 에 대한 대답은 자연스레 알게 될 것이다.RawBufferRawBuffer는 Byte Address Buffer인데 주소에 대한 직접적인 연산해서 접근하는 Buffer로, C++로 따지면 Byte형 포인터를 다루는 것과 동일하다. RawBuffer라는 이름이 붙은 이유는 정말 날것을 취급하기 때문이다.이 친구도 결국 Buffer이기 때문에 Rescource가 필요하다. ..
드로우 콜게임을 개발하다보면 "드로우 콜을 줄이줘요" 라는 얘기를 많이 듣는다고 한다.그렇다면 드로우 콜은 무엇인가? 우리가 지금까지 물체를 그리는 방법은 Mesh의 vertex에 대한 정보를 세팅하고 어떻게 그릴 것인지, 쉐이더는 어떻게 세팅하고 머티리얼 등등을 렌더링 파이프라인에 전부 세팅한 후에 마지막에 Draw... 함수 계열을 딱 호출하면 렌더링 파이프라인을 따라서 IA -> VS -> RS -> PS... 순으로 흘러가며 화면에 보여주게된다. 이때 Draw 함수 계열을 말 그대로 드로우 콜 이라고 부른다. 지금 포스팅 한대로 코딩을 했다면 물체가 100만개가 있다면 매 프레임마다 100만번의 드로우 콜을 해야할 것이고 이는 엄청난 과부화를 유발할 수 있다. 유니티를 기준으로 보면 stat을 확..
Mintriever
'C++' 카테고리의 글 목록