전체 글 35

씬그래프를 알아보도록 하자

씬그래프란?    장면(scene)을 표현하는 일반적인 데이터 구조.씬그래프의 노드들은 부모자식관계를 가진 트리구조다. obj, fbx, glft 등의 파일확장자는 이러한 형태의 자료를 저장한다. 각각의 노드들은 Transform 정보(위치, 회전, 스케일)를 가지고 있다.참조하는 오브젝트로는Material : Mesh의 색상을 계산하기 위한 정보Animation : 특정 시간의 transform 정보 Static Mesh란 뭘까.버텍스(정점)의 위치가 바뀌지 않는, 즉 애니메이션이 없는 Mesh다.원점기준으로 vertex가 위치한다.// 사용하면 버텍스를 읽을때 노드의 변환행렬을 적용한다???게임 데이터이므로 카메라는 필요없다.Mesh vertex와 material 설정만 해주면 된다. Assimp가 ..

D3D 2024.10.30

Normal Mapping

하나의 물체를 자세히 그려내기 위한 방법으로는 많은 버텍스를 사용하는게 있다. ( = HighPolygon )그러면 물론 쉐이더의 실행횟수가 늘어난다... 근데 꼼수가 있다.텍스처에다가 HighPolygon의 노말만 따로 저장해서 픽셀쉐이더에서 샘플링해갖고 픽셀의 노말로 사용해버리는 것이다...! 법선벡터를 노말 (= blue), 탄젠트(= red), 바이탄젠트(=green)로 부여해서  RGB값(0 ~ 1)으로 텍스처에 저장한다.샘플링을 해서 사용할때는 RGB값에 2.0을 곱하고 -1.0을 하는 변환을 거쳐서 -1 ~ 1 범위가 된다.

D3D 2024.10.28

코딩환경에서 쓰이는 포괄적인 단어들

대표적인 단어로 인터페이스가 있다.실제적인 코드상에서 배웠을때는 뭐랄까... 껍데기?라고 나만의 정의를 했었지만...좀더 넓은 범위로 인터페이스를 이해해보자면, '매개체'라고 할수도 있다.예를들어 인터페이스를 제공해준다고 했을때, 어떤 기능을 쓰기위한 '매개체'를 제공해준다. 란 식으로 치환하여 생각할 수가 있다.API도 비슷한 맥락으로 앱을 프로그래밍 하기위한 매개체를 제공해주는 것이라고 생각할수있다. 이처럼 한마디로 딱 정의하기 어려운 단어가 또 있었는데, 바로 바인드 라는 단어다.바인드를 명확하게 이해해보기위해 문장 하나를 제시해보겠다.- A에 B를 바인드하다.A는 주로 객체를 의미한다.B는 자원이나 흐름코드를 의미한다.- A에 B를 엮는다.

기타고찰 2024.10.22

스마트 포인터

스마트 포인터가 등장한 배경은 어쩌면 당연한 것이다.코드가 복잡해질수록 이 포인터 변수가 하나의 객체를 가르키는지, 배열을 가르키는지 알기 힘들게 되고 등등...메모리해제에 대한 대표적인 두가지의 문제를 얘기해보겠다.1. 위에 예시를 든 것처럼 delete를 하면 되는지, delete[] 를 해야하는지에 대한 문제다.2. 중복해제가 일어나기도 한다.// double free 버그 //        Data* data = new Data();         Date* data2 = data;         delete data;          // data 의 입장 : 사용 다 했으니 소멸시켜야지.         delete data2;         // data2 의 입장 : 나도 사용 다 했으니 소..

C++ 2024.10.22

블린퐁 ( Blinn Phong )

최종색상은 Ambient + diffuse(난반사) + specular 의 합으로 결정된다.  diffuse: 램버트 코사인법칙에 의한 색상 specular: 입사광의 반사벡터와 시야벡터 각도에 따른 빛 반사 색상1.Phong Light의 주변광(Ambient)란?전역 조명(Global Illumination)을 간단하게 표현한 방식.즉, 가장 어두울때도 기본적으로 나오는 색상을 의미.AmbientColor = LightAmbientColor * MaterialAmbientColor// LightAmbientColor: 모든 물체에 적용하는 바탕이 되는 색(강도)// MaterialAmbientColor: 물체가 Ambient를 조절하는 계수(색)           2.Phong Light의 정반사광(S..

D3D 2024.10.11

Direct3D11 렌더링 파이프 라인을 알아보자

전 게시글에서 살짝 알아본 렌더링은 렌더링 파이프 라인에서 제일 첫 단계에 해당하는 것이다. 1. Input - Assembler버텍스에 대한 데이터(버텍스 버퍼), 버텍스를 그리는 방법, 버텍스의 포맷을 설정하는 단계다.2. Vertex Shader모델 좌표 혹은 로컬 좌표계의 버텍스에 Matrix 곱셈을 해서 Model (Local)  Space      →       World Space      →      Camera Space      →       Projection ( Clip ) Space(x,y,z,w)                            (World Transform)          (View Transform)         (Projection Transform)  ..

D3D 2024.10.08

내 멋대로 3D 정리하기

그래픽스 관점으로 볼때, 3차원의 게임은 모델링 -> 리깅 -> 애니메이션 -> 렌더링 -> 후처리의 파이프라인 과정을 거친다. 각 단계의 결과값은 다음 단계의 입력값으로 사용된다. 1. 모델링의 단계에서는 게임 환경을 구성하는 지형이라던가, 나무 등을 만든다.게임같이 실시간으로 처리되는 물체들은 폴리곤 모델링 기법을 사용한다.폴리곤들로 구성된 하나의 객체를 폴리곤메쉬라고 한다. 폴리곤메쉬 표면에 그림을 입히는데, 그 그림을 텍스쳐라고 한다. 텍스쳐가 입혀지는 과정은 런타임에서 발생한다.  2. 리깅움직이는 폴리곤메쉬 안에다가는 골격을 삽입한다.골격과 함께 폴리곤이 따라 움직이도록 하는 작업을 리깅이라고 한다. 3. 애니메이션리깅의 작업을 거친 폴리곤메쉬의 움직임이 연속적으로 그려진 것을 애니메이션이라고..

D3D 2024.10.07

[게임수학] 선 그리기 알고리즘 (브레젠험)

정수로 이루어진 스크린 좌표계에서 선분을 효과적으로 그리기 위한 알고리즘 중 "브레젠험 알고리즘"을  알아보자.한 팔분면은 0도 ~ 45도 의 범위를 가지게되고, 영역에 존재하는 기울기의 최대값이 1로 일정해진다.이러한 성질때문에 팔분면을 지나는 선의 진행은 평행하게 한칸 움직이거나 한칸 아래로 내려가거나 하는 두가지 경우만 존재한다.두 가지 중 하나를 선택하기 위한 기준점으로 중간값을 사용한다.그리고 할일은 첫점과 끝점을 지나는 직선의 방정식을 구해서 점(x0 + 1,y0 + 0.5)와 무엇이 더 작고 큰지에 대한 비교를한다.그 수식 전개는 대충 책에 있는거 가져옴,,근데 이제 이러고 나서 두번째 칸을 선택을 할때는 두 가지경우에 따라 두가지의 식이 존재하게 되고... 아무튼 그래서 그 선택지들을 모두..

게임수학 2024.09.03

[게임수학] 아핀 공간 (feat.이득우의 게임수학)

그동안에 배웠던 변환은 2차원 평면에서의 크기조절,회전,밀기(전)에 대한 것이었다.이동에 대한 변환은 행렬 곱이 아닌 벡터의 덧셈으로 처리해왔다.아무래도 2차원 평면에서 2x2 행렬 곱셈으로는 "이동을 위한 행렬 덧셈"과 같은 값을 만족하는 행렬이 존재하지 않기때문인데...(ㅜㅜ최대한 풀어서 써봄) 근데 이걸 공간의 차원을 늘려서 극복시킴...ㄹㅈㄷ,,,솔직히 정확한 표현으로 설명은 못하겠는데 대충 한 차원을 확장시키고, 그 마지막 차원의 z값을 1로 고정시킨 전단변환을 이용하면 2차원 이동 변환이 가능해진다는거다.그래서 이를 이동 변환행렬이라고 하며, 이렇게 표현된다. 그러면 표현식으로만 봐도 마치 이동을 위해 벡터덧셈을 한것과 같은 형식의 행렬이 나오게된다. 이렇게 이동을 위해 마지막 차원값을 1로 ..

게임수학 2024.09.02

엔진공부 3일차 (ResourceManager 만들기)

어제 GameApp을 만들어서 게임엔진의 제일 기초를 다져보는 시간을 가져봤는데, 분리해낸 D2DRenderer에서 브러쉬를 이용해 그림을 그리면서,거기에 비트맵도 출력하는것이 렌더러의 볼륨감이 커지는 일인 것 같아 비트맵을 관리하는 클래스를 따로 생성해주기로 했다. 아 이미지가 좀 많이 하찮아진거 같지만 기분탓인가보다 하고 넘어가면 된다.크게 리소스매니저로 개념을 잡긴했지만 세부적으로 리소스 중에서도 이미지, 애니메이션만 일단 다룰 예정이라, 클래스 이름을 이미지매니저로 명명했다.랜더러에서 따로 빼낸 비트맵을 다루는 클래스의 생성자로 비트맵의 정보가 이미지매니저에 로드되는 형태로 만들었다. 로드한 이미지를 불러내기 위해 unordered_map 을 사용했다.void D2DRenderer::BitmapD..

D2D와 게임엔진 2024.08.08