반응형

전체 글 305

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

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

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

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

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

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

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

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

[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

[Rust] match 연산자

: 흐름 제어 연산자로, 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지를 바탕으로 코드를 수행하게 해줍니다. match의 힘은 패턴의 표현성으로부터 오며, 컴파일러는 모든 가능한 경우가 다루어지는지를 검사합니다. 다음은 코인의 종류를 enum으로 표현하고, 코인을 센트로 변환해주는 함수입니다. match에서의 각각 나뉘는 갈래를 arm이라 합니다. enum Coin { Penny, Nickel, Dime, Quarter, None, } fn value_in_cents(coin: Coin) -> u32 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, Coin::None =>..

[Rust] 2023.08.15

[Rust] 컬렉션(Collection)

: 러스트 표준 라이브러리의 유용한 데이터 구조로, 다수의 값을 담을 수 있습니다. 배열이나 튜플과는 달리 힙에 저장되는데 이는 프로그램 실행 중에 데이터의 양이 늘거나 줄어들 수 있음을 의미합니다. 러스트 프로그램에서 자주 사용되는 컬렉션에는 다음 세가지가 있습니다. 벡터(vector) : 여러 개의 값을 서로 붙어서 저장될 수 있게 해줍니다. 문자열(string) : 문자(character)의 모음입니다. 해시맵(hash map) : 어떤 값을 특정 키와 연관지어 주도록 해줍니다. 1) 벡터(vector) - Vec 같은 타입의 값만 저장 가능하며, 모든 값을 메모리에서 연속적으로 배치합니다. - 새 벡터 만들기 : 비어있는 벡터를 만들기 위해서 Vec::new 함수를 호출합니다. 벡터에 어떤 값도 ..

[Rust] 2023.08.14
반응형