반응형

전체 글 307

[게임 엔진] 1. 렌더링 엔진(4) - 시각 효과와 오버레이

1) 파티클 효과 : 연기, 불꽃 등 일정한 형상이 없는 물체를 구현한 것입니다. 실제 게임 엔진에서는 특수화된 파티클 효과 애니메이션 및 렌더링 시스템을 사용해 파티클 효과를 구현합니다. 파티클 효과의 주요 특징은 다음과 같습니다. 상대적으로 단순한 기하 형상들이 여러개 모여 이뤄지며, 항상 카메라를 향합니다. 머티리얼이 거의 예외없이 반투명합니다. 다양한 방향으로 애니메이션합니다. 계속 스폰되었다가 없어집니다. 2) 데칼 : 기하 형상들의 표면에 씌우는 작은 기하 형상으로, 표면의 외양을 바꾸는데 쓰입니다. (ex) 총탄 흔적, 발자국, 긁힌 자국, 갈라진 흔적 데칼을 사각형 영역으로 모델링 -> 화면에 일직선으로 투영해서 3차원 공간에 직육면체 프리즘을 만듦 -> 프리즘이 가장 먼저 교차하는 표면에..

[게임 엔진] 1. 렌더링 엔진(3) - 가상 카메라

: 초점과 감광 표면으로 이루어져 있습니다. 감광 표면은 직사각형 형태의 가상의 감광 센서들이 격자 모양으로 이루고 있고, 각 센서는 픽셀 하나에 해당합니다. 이 센서들에 기록될 색과 빛의 강도를 결정하는 과정이 렌더링 입니다. 1) 뷰 공간 가상 카메라의 원점 = 뷰 공간의 원점이며, 카메라의 위치와 방향은 뷰-월드 행렬로 나타낼 수 있습니다. 삼각형 메시 렌더링 : 정점 -> 모델 공간에서 월드 공간으로 변환(모델-월드 행렬 사용) -> 월드 공간에서 뷰 공간으로 변환(월드-뷰 행렬로, 뷰-월드 행렬의 역행렬) 모델-월드 행렬 * 월드-뷰 행렬 = 모델-뷰 행렬 이렇게 모델-뷰 행렬을 미리 계산해서 정점을 모델 공간에서 뷰 공간으로 변환할 때 행렬 곱셈을 한 번만 해도 되게 합니다. 2) 투영 : 3..

[게임 엔진] 1. 렌더링 엔진(2) - 조명

1. 지역 조명과 전역 조명 모델 지역 조명 모델 : 한 물체에 대한 지역적인 빛의 효과만 고려하고, 서로의 외관에 영향을 주지 않습니다. 퐁 조명 모델 : 게임 렌더링 엔진이 가장 흔히 사용하는 지역 조명 모델로, 표면에서 반사되는 빛을 환경 + 난반사 + 정반사(+발산광(물체 스스로 내는 빛))의 합으로 표현합니다. 블린-퐁 모델 : 퐁 모델을 확장한 모델로, 속도가 더 빠르지만 정확도가 조금 떨어지는 단점이 있습니다. 전역 조명 모델 : 간접 조명을 고려하는 조명 모델로, 특정한 시각 현상을 흉내내는 데 목적이 있습니다. 간접 조명 : 여러 표면에 여러 번 반사해서 최종적으로 가상 카메라에 도달 2. 광원 모델링 정적 조명 조명 맵 : 픽셀 단위의 조명을 미리 계산한 후 텍스처 맵에 저장합니다. 조..

[연유와의 나들이] 리뉴얼 1. 구글 스프레드 시트에 저장한 데이터를 유니티로 로드(feat. Google Sheets To Unity)

가장 먼저 할 일은 테이블 데이터를 구글 스프레드 시트에 저장하고, 유니티에서 불러올 수 있게 세팅해주는 것입니다. 1. Google Sheets To Unity Asset 설치 2. 구글 시트와 유니티 연동 3. 구글 시트에 임의의 데이터를 입력하고, GoogleSheetsManager를 만들어서 데이터를 로드 1. 어셋스토어에서 Google Sheets To Unity 라는 Asset을 설치해줍니다. https://assetstore.unity.com/packages/tools/utilities/google-sheets-to-unity-73410 Google Sheets To Unity | 유틸리티 도구 | Unity Asset Store Use the Google Sheets To Unity fro..

[게임 엔진] 1. 렌더링 엔진(1) - 렌더링 기초

3차원 씬을 렌더링하는 과정을 대략적으로 살펴보면 다음과 같습니다. 가상의 씬이 있고, 상 표면이 붙어있는 가상의 카메라가 있습니다. 상 표면은 픽셀 단위의 빛 센서들이 모여있고, 렌더링 엔진이 렌더링 방정식을 통해 다양한 광원의 속성과 표면의 시각적인 속성으로 색과 강도를 계산해서 상 표면의 픽셀에 나타내줍니다. 게임 렌더링 엔진의 주된 작업은 표면을 렌더링하는 것입니다. 그 외의 일정한 형상이 없는 물체는 파티클을 써서 표현합니다. 렌더링을 배우기 앞서 기본적인 개념들을 배워봅시다. 1. 삼각형 메시 다음과 같은 이유로 실시간 렌더링에 주로 사용됩니다. 가장 단순한 다각형으로, 꼭지점이 3개여서 항상 평평할 수 밖에 없음 대부분의 변환을 거쳐도 삼각형(최악의 경우 선) 삼각형 하나는 세 정점을 나타내..

[연유와의 나들이] 리뉴얼!

오랜만에 돌아온 연유와의 나들이..! 라이펙트 센터 대표님께 연락이 와서 앱이 스토어에서 내려갔다는 이야기를 들었습니다. 아마 앱을 올린 후 오랫동안 관리하지 않으니 구글 플레이스토어 정책에 뭔가 맞지 않아 내려간 것 같습니다. 그런데 오랜만에 프로젝트를 다운받아서 켜보니 프로젝트 구조가 너무 마음에 들지 않아서 전체적인 리뉴얼을 하려합니다. 오랫동안 버려두었던 코드들 전부 개선해서 뜯어고치는 것도 재밌을 것 같기도 하고, 배운걸 써먹어보기에 괜찮겠다 싶습니다. 프로젝트에서 마음에 들지 않는 부분들은 다음과 같습니다. 1. 모든 리소스를 빌드에 담다보니 용량이 너무 커졌습니다. 어셋번들에 나눠서 리소스를 담고, 처음 타이틀화면에서 다운로드 받는 방법을 사용해보겠습니다. 2. 패널, 컷씬이 하드코딩되어 있..

[Rust] 라이프타임(lifetime)

: 어떤 참조자가 필요한 기간 동안 유효함을 보장합니다. 러스트의 모든 참조자는 라이프타임 범위를 가지며, 라이프타임은 암묵적으로 추론됩니다. 이 라이프타임을 명시해야 하는 경우에 대해 알아보겠습니다. - 라이프 타임으로 댕글링 참조 방지 라이프타임의 주목적은 댕글링 참조(dangling reference) 방지입니다. 러스트 컴파일러는 대여 검사기(borrow checker)를 스코프로 비교해서 대여의 유효성을 판단합니다. 'b(참조 대상)가 'a(참조자)보다 짧기 때문에 이 코드는 컴파일되지 않습니다. fn main() { let r; // ---------+-- 'a //r의 라이프타임 // | { // | let x = 5; // -+-- 'b | // x의 라이프타임 r = &x; // | | ..

[Rust] 2023.08.19

[Rust] 트레이트(trait)

: 타입들이 공통적으로 갖는 동작을 추상적으로 정의한 것입니다. trait bound를 이용하면 어떤 제네릭 타입 자리에 특정한 동작의 타입이 오도록 명시할 수 있습니다. - 트레이트 구현 trait를 정의하고, 어떤 구조체(NewArticle)가 trait를 구현하도록 지정한 예시 코드입니다. trait의 메서드는 선언부만 정의할수도, 구현체까지 정의할 수도 있으며, 기본 동작을 유지할지 override할지 선택할 수 있습니다. 예시 코드에서는 트레이트에서 summarize() 함수의 선언부만 정의한 후, NewArticle에서 오버라이드했습니다. // 신문 기사를 요약해주는 trait 구현 trait Summary { // 선언부만 정의 fn summarize(&self) -> String; } //..

[Rust] 2023.08.18

[Rust] 제네릭 타입

: 중복되는 개념을 효율적으로 처리하기 위한 도구입니다. 제네릭은 구체(concrete) 타입 또는 기타 속성에 추상화된 대역입니다. Option, Vec, HashMap, Result 등등이 모두 제네릭을 사용한 것입니다(T). 제네릭을 사용해서 함수, 구조체, 열거형, 메서드를 각각 정의하는 방법을 알아보겠습니다. 1) 제네릭 함수 슬라이스에서 가장 큰 값을 참조하는 함수입니다. fn largest(list: &[T]) -> &T { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest } * 트레이트 : 타입들이 공통적으로 갖는 동작을 추상화해줍니다. 트레이트에 대해서는 다음 챕터에서..

[Rust] 2023.08.17

[Rust] 에러 처리

러스트는 에러를 복구 가능한 에러, 복구 불가능한 에러 두 범주로 나눕니다. 대부분의 언어는 예외처리 메커니즘을 쓰는데 러스트에는 이 기능이 없는 대신, 복구 가능한 에러를 위한 Result 타입이 있고 복구 불가능한 에러가 발생하면 프로그램을 종료하는 panic! 매크로가 있습니다. 1) panic! 으로 복구 불가능한 에러 처리 패닉을 일으키는 방법에는 패닉을 일으킬 동작을 하는 것과 panic! 매크로를 명시적으로 호출하는 방법이 있습니다. 패닉은 실패 메시지를 출력하고, 되감고(unwind), 스택을 청소하고, 종료합니다. 패닉이 발생하면 근원을 쉽게 추적하기 위해 환경 변수를 통해 러스트가 호출 스택을 보여주도록 할 수 있습니다. * unwinding : panic!이 발생했을 때 러스트가 패닉..

[Rust] 2023.08.16
반응형