본문 바로가기

IT78

게임 프로그래밍 패턴 11장 ~ 13장 (22. 06. 09) 5주차 (22. 06. 09) 행동 패턴 게임 내 개체들이 해야 할 일을 알려주는 대본에 해당하는 행동behavior. Chapter11. 바이트 코드 가상 머신 명령어를 인코딩한 데이터로 행동을 표현할 수 있는 유연함을 제공. 성능과 안정성을 위해 C++ 같은 중량 언어heavyweight language를 사용. ⇒ 하드웨어 성능을 최대한 끌어낼 수 있는 저수준 표현과 버그를 막거나 적어도 가둬두기 위한 풍부한 타입 시스템을 함께 제공. 게임 출시 이후에도 업데이트를 통해서 버그를 고치거나 콘텐츠를 추가할 수 있어야 함. 전부 하드코딩되어있다면 변경사항이 있을 때마다 게임 실행 파일을 패치해야 한다. 심지어 모드mod를 지원해야 한다면? 유저가 게임에서 커스텀을 하고 싶다면? 게임을 빌드하기 위해 컴.. 2023. 6. 25.
Metal 스터디 8주차 (23.02.02) Interaction 게임의 실패 시나리오는 Player가 Paddle에서 공을 놓치고 공이 보드 뒤쪽이나 Paddle 뒤에서 튀는 경우이다. 또한 Player에게 3번의 기회를 준다. 먼저 lives 속성을 설정한다. var lives = 3 bounceBall에서는 공이 테두리의 상단과 하단에 대해 튕기는지 확인한다. func bounceBall() { ... if abs(ball.position.z) > gameArea.height / 2 { ballVelocity.z = -ballVelocity.z lives -= 1 if lives < 0 { print("GAME OVER - YOU LOST") } else { print("Lives: ", lives) } } ... } 볼 위치 Z를 확인한다... 2023. 4. 16.
Metal 스터디 7주차 (23.01.26) Introduction 게임 엔진에 대한 Metal Rendering 이후, 게임을 작성하는 방법에 대해 알아보자. Breakout* 게임을 따라 Raybreak라는 프로젝트를 만들어볼 것이다. Breakout (비디오 게임)은 1976년 아타리가 개발한 아케이드 게임. 간단한 게임이지만 대부분의 게임에서 사용하는 많은 원칙이 포함되어 있다. 새로운 Model이 있는 새로운 Scene을 만든다. 게임 경기장의 크기를 결정하고 모든 Model의 시작 위치를 계산한다. 그런 다음 Models bounding Box를 사용하여 2D에서 간단한 충돌 검사를 수행한다. (=모든 방향에서 모델의 높이와 너비를 알 수 있다.) 효과음과 음악을 게임에 추가하고 게임을 마무리하기 위해 승패 여부를 보여주는 두 번째 Sc.. 2023. 2. 11.
Metal 스터디 6주차 (23.01.19) Function Specialization 두 가지 다른 대안을 처리해야 하는 Fragment Shader에 문제가 있다. Model의 Texture에 UV 좌표가 있는 경우 Rendering에 Texture 색상을 사용한다. 그렇지 않은 경우 Material 색상을 사용한다. 예시는 단순한 상황이고, 대부분의 Model에는 Bump Map, Ambiens Occlusion 및 Spercularity에 대해 4개 또는 5개의 서로 다른 Texutre가 존재하기도 한다. Model은 사용 가능한 Texture 중 일부를 사용할 수 있지만 모든 Texture가 동일한 Texture를 사용하지는 않는다. 조건 분기와 GPU Shader 함수는 비용이 크므로 배제한다면, 함수 전문화Function Special.. 2023. 2. 6.
Metal 스터디 5주차 (23.01.12) Introduction Surface에 대해 배울 예정. 하드 코딩된 색상 배열 대신에 기존 Meterials의 색상으로 모델을 렌더링한 다음 alternative look으로 기차에 대한 Texture를 추가한다. 또한 성능 저하가 거의 없이 100개의 기차를 렌더링하는 방법과 성능에 대해 배운다. Materials Model I/O를 사용하여 Model을 읽는다. Index drawing을 위해 MDL mesh와 submesh를 MetalKit mesh와 submesh로 변환한다. submesh는 material도 갖고 있다. material 속성들은 mesh group의 surface를 보여준다. 각 모델 I/O submesh에는 material 관련 속성(base color, specular in.. 2023. 1. 15.
Metal 스터디 4주차 (23.01.06) Normals Scene이 원근감과 깊이를 갖고 있지만, 약간의 음영Shading이 있을 때까지는 완전한 3D가 아니다. 우리는 빛의 방향을 설정할 수 있으며 빛에서 멀어지는 Vertex는 빛을 바라보는 Vertex보다 어둡다. 그래서 꼭짓점들이 어느 방향을 바라보고 있는지를 알아야 한다. 표면 법선Surface Normal을 사용하여 이를 알아낸다. Surface Normal은 직각으로 가리키는 Vector로, 표면에 직각이다. Blender가 OBG 파일을 내보낼 때 파일에 Surface Normal이 포함된다. Surface Normal을 사용하여 표면의 기울기와 방향을 알 수 있다. Normal의 방향을 빛과 음영의 방향과 적절하게 비교할 수 있다. OBG 파일에서 Normal을 읽도록 코드를 변.. 2023. 1. 15.
Forward Rendering vs Deferred Rendering Forward Rendering과 Deferred Rendering의 차이는 무엇일까? ...를 알아보기 전에, 먼저 Rendering의 개념부터 간단히 정리해보자. Rendering이란? 렌더링 또는 이미지 합성(rendering 또는 image synthesis)은 컴퓨터 프로그램을 사용하여 모델 또는 이들을 모아놓은 장면인 씬 파일(scene file)로부터 영상을 만들어내는 과정을 말한다. 출처 : https://ko.wikipedia.org/wiki/렌더링 Rendering 기술은 3D 작업에서 Graphics Pipeline을 따라 수치값들을 이용하여 3D 물체를 2D로 연출한다. Rendering 의 기본 요소는 [형태, 음영, 색상, 공간, 재질]이 있다. 또한, Rendering 에는 다.. 2022. 12. 29.
Metal 스터디 3주차 (22.12.22) Introduction 3D 공간과 3D 공간에서 정점을 이동하는 방법. 장면에서 멀리 떨어져 있는 요소가 더 작게 표시되도록 원근감 있게 렌더링한다. 원근감 있는 모델을 렌더링할 수 있게 되면 모델에 조명을 비출 수 있으며 이것이 얼마나 큰 차이를 만드는지 알 수 있다. Position your model 우리는 x, y, z 축이 있는 좌표 공간에서 작업한 다. 이 축의 중심에 원점이 있다. 모든 방향에서 위치가 0이고 위쪽 축은 y축이 된다. (Blender와 같은 일부 앱은 위쪽 축에서 z을 사용한다) 모델의 각 정점은 일반적으로 -1과 1 사이의 위치를 가진다. 모델은 종종 이 범위 밖의 정점 위치를 갖지만 지금은 -1과 1 사이에서 작업할 것이다. (NDC) 행렬을 사용하면 이러한 정점을 쉽게.. 2022. 12. 28.
Metal 스터디 2주차 (22.12.15) Metal Buffers GPU의 Shader 파일에서 위치 및 색상 배열을 하드 코딩하는 대신 CPU에서 하드 코딩하고 vertexBuffer에서 GPU로 보낸다. 이것은 큰 차이가 아닌 것처럼 보이지만 하드 코딩된 정점 배열을 파일에서 가져온 3D 모델로 대체하게 만든다. 이와 같이 삼각형을 그릴 때 Swift에서는 세 개의 정점 위치로 배열을 만든다. GPU가 이 배열을 읽을 수 있도록 MTLBuffer 개체에 복사한다. 적절한 길이의 이 버퍼를 생성하도록 GPU 장치에 요청한다. 인수 테이블(Arugment Table)을 사용하여 MTLBuffer를 Shader에 Madpping한다. Metal에는 Buffer, Texture 등 다양한 유형의 리소스가 있으며 각 리소스 유형에는 고유한 인수 테이.. 2022. 12. 28.
GPGPU (General Purpose GPU) GPGPU란? General-Purpose computing on Graphics Processing Units의 머릿글자로, 직역하면 'GPU의 범용 연산'. CPU가 맡았던 연산을 GPU에도 사용해 연산 속도를 향상 시키는 기술이다. 흔히 '하드웨어 가속'이라고 하면 GPU를 가리키는 경우가 많다. CPU에는 대부분의 앱 처리를 수행하는 몇 개의 강력한 코어가 있지만 GPU에는 복잡한 병렬 계산을 수행할 수 있는 수백 또는 수천 개의 빠르고 효율적인 코어가 있다. 즉, CPU는 여러 스레드에서 하나의 작업을 정말 잘 수행하고 GPU는 동시에 작은 작업을 모두 수행할 수 있다는 것을 말한다. (둘의 차이점은 위의 영상에서 잘 볼 수 있다.) 그래픽카드가 GPU가 된 이유 초기의 그래픽 API들과 그것을.. 2022. 12. 13.