String Opinions, Weakly Held 견고한 의견, 하지만 집착하지 않는 태도 나는 졸업작품을 진행하며 팔로워십에 대한 정의를 세울 수 있었다. 리더였지만, 가장 가까운 곳에서 팀원들을 보며 그들 각각의 배울점이나 개선점을 생각하며 나 또한 성찰하는 계기가 되었기 때문. 나의 팔로워십은 어떤 방향으로 성장시켜야 할지 고민하다, 작년에 쓴 업무 습관에 대한 고찰이 떠올랐다. 그때는 간단히 짚고 넘어간 Strong Opinions, Weakly Held였는데... 리더의 자리를 한 번 겪고 난 후 저 태도는 팀원에, 또 프로젝트에 꼭 필요한 태도라는 생각이 들었다. 의견을 탄탄히 잘 준비하되, 의견 자체에 집착하지 말고 객관적으로 보자! 나의 언어대로 해석을 해보았다. 조금식 끊어서 고찰이 필..
학교에서 열리는 E스포츠 대회에서 전시를 위해 빌드본을 뽑아내며 느낀 것... 우리 게임 빌드본의 용량이 너무 크다는 것이다!! 앞만 보고 바쁘게 개발해서 최적화는 신경도 쓰지 못했는데... 거의 800mb가 되는 용량에 충격을 먹은 나머지... 최적화해야겠다는 생각을 했다... 텍스쳐 리사이징 가장 시급한 텍스쳐부터 최적화를 했다. 게임이 3D다 보니 노멀맵이나 AO 등등... 텍스쳐가 정말 많다. 개발에 급급해서 신경도 쓰지 않고 있던 텍스쳐 몇 백개를 리사이징 하려니 꽤 힘들었다. 미리 해놓을 걸... 2048로 되어있던 너무나도 큰 텍스쳐의 Max Size를 Albedo는 1024, Normal, AO, Height은 512로 리사이징을 해주었다. 에셋을 임포트 해놓고 안 쓰는 텍스쳐도 깔끔하게 ..
12931번: 두 배 더하기 모든 값이 0으로 채워져 있는 길이가 N인 배열 A가 있다. 영선이는 다음과 같은 두 연산을 수행할 수 있다. 배열에 있는 값 하나를 1 증가시킨다. 배열에 있는 모든 값을 두 배 시킨다. 배열 B가 주 www.acmicpc.net 거의 한 달만에 푸는 문제... 변명을 하자면 그간 졸업작품 때문에 정말 정말 정말 바빴다... 어제 학교에서 열리는 e스포츠 대회에 전시할 빌드본 버그를 새벽까지 고치고 주말에 시간이 조금 남아 뒹굴거리다... 언니랑 같이 공부하며 정말 오랜만에 풀어보았다. 오랜만에 푸는 거라 알고리즘을 구상하는데 적지 않은 시간이 걸렸지만... 오랜만에 문제 해결하는 고통과 즐거움을 다시 한 번 느꼈다!! 알고리즘 설계 처음에는 [0, 0, 0...]을 입력받..
오늘은~~ 알록달록 정육면체를 렌더링하는 날이었다. 처음으로 메쉬를 렌더링하는 날이니 세팅할 게 정말 많았다. 그래도 이론으로 배운 렌더링 파이프라인의 단계들을 하나 하나 구현한다는 마음으로 수업을 들으니 훨씬 감이 잘 왔다. 오늘은 정육면체를 그리기 위해 입력 조립기 단계, 정점 셰이더 단계, 래스터화기 단계, 픽셀 쎼이더 단계와 출력 병합기 단계를 거칠 것이다! 입력 배치 세팅 우선, 알록달록 정육면체를 그리려면 무엇이 필요할까? 각 정점의 위치와 색상이 필요하다. 위치와 색상을 담은 간단한 구조체 하나를 만들어주었다. struct Vertex { XMFLOAT3 pos; XMFLOAT4 color; }; 이 상태의 데이터를 GPU가 받는다면 각 성분이 어떤 용도인지, 무슨 자료형인지 등등... 하나..
이거 거짓말 같지... 진짜다... 사실 아무것도 안 한 건 아닌데, 정정하자면 졸업작품만 했는데 벌써 개학이다... ㅠㅠㅠㅠㅠㅠ 하고 싶은 게 많았는데... 언리얼도 조금 하고 싶었고 백준 플래도 찍고 싶었고 DirectX로 작은 프로젝트도 만들어보고 싶었는데... 아니 이거 너무 핑계잖아... 시간이 없다는 말은 모두 핑계다 정말... 사실 이것들을 모두 안 한 건 아니다... 10을 하고 싶었던 걸 5로 한 것일뿐... 난 왜 자꾸 나를 변호하는 거지... 언리얼도 딱 3일, 아주 간단한 기본 개념을 맛보기식으로 해봤고, 백준... 플래티넘은 아니더라도 골드 1 중간이나 왔다!! 스트릭 끊긴 건 좀 속상하긴 하다... 사실 속상하지 않은 척 했는데... 좀 많이 속상했다... 열심히 가꿔온 게 한 ..
Local Space => World Space 물체는 모두 자신만의 Local Space를 가지고 있다. 이를 월드상에 적절하게 배치하려면 자표 변경 변환을 수행해야 한다. 이것을 World Transform이라고 부르고 해당 변환 행렬을 World Matrix라고 부른다고 한다. 각 물체를 WorldSpace 기준으로 변환하고 나면, 모든 좌표가 동일한 좌표계를 기준으로 한다. 어떻게 로컬 좌표에서 월드 좌표로 변환할 수 있을까? 월드 좌표 정점 = 로컬 좌표 * 월드 변환 행렬 (Scale * Rotation * Transform) 변환 행렬을 곱해 월드 좌표로 변환할 수 있다. 1학기 때는 이 부분에서 머리를 싸매고 들어도 잘 모르겠어서... 선생님께서 이번엔 간소화해서 가르쳐주셨다. Scale ..
수업에서 사각뿔이나 정육면체를 출력하기 전, 렌더링 파이프라인의 각 단계에 대해서 이론적으로 간단히 배우고 코드로 넘어갔다. 이 포스팅에서는 수업에서 배운 렌더링 파이프라인의 각 단계에 대해서 자세히 알아볼 예정이다. 다음 포스팅에서는 오브젝트 그리고, 정육면체 묶어보고, 조명, 그림자맵, 애니메이션... 으악 할 게 너무 많아!!! 렌더링 파이프라인의 개요 렌더링 파이프라인은 카메라에 비친 3차원의 장면을 2차원의 이미지로 생성하는데 필요한 일련의 단계이다. 입력 조립기 단계부터 래스터라이저, 출력 병합기까지 거치면 3차원의 공간을 2차원의 이미지로 표현할 수 있게 된다. 여기서 헐 셰이더, 테셀레이터는 생략이 가능하다고 한다. 나는 렌더링할 때 정점 셰이더, 픽셀 셰이더를 만들어서 도형을 렌더링했다...
드디어 장치 초기화를 끝내고~~ 이제 알록달록... 은 무리라도 단색 화면을 출력할 수 있는 바로 직전 단계까지 왔다! 사실 오늘 포스팅의 궁극적인 목적은 단색 화면 렌더링이 아닌, 렌더링 세팅이다! 매 프레임마다 순서대로 호출되는 DrawBegin, Draw, DrawEnd 함수가 있다. 오늘은 Draw Begin과 Draw End에서 Command List의 명령들을 Queue로 보내고 초기화하며 렌더링할 것이다. 렌더링 전 (Draw Begin) mDirectCmdListAlloc->Reset(); mCommandList->Reset(mDirectCmdListAlloc.Get(), nullptr); 먼저, 할당자를 리셋해주는데 GPU가 할당된 명령을 모두 끝낸 경우에만 리셋할 수 있다. Comman..