분류 전체보기 113

[OpenGL] Polygon Rasterization (Bilinear Interpolation)

프로그래머가 GPU로 넘겨주는 것은 버텍스에 관한 정보이지만, GPU가 만들어내는 최종 결과물은 각 픽셀에 대한 정보이다. 따라서 GPU의 임무는 서로 떨어져있는 버텍스들을 이어 도형(폴리곤)들을 만든 뒤, 그 폴리곤을 픽셀의 집합으로 만드는 것이다.픽셀의 집합으로 만든다는 것은, 곧 폴리곤을 픽셀로 채운다는 이야기이다. 이렇게 폴리곤을 픽셀의 집합으로 바꾸는 과정을 Polygon Rasterization이라고 한다.  여기에 사용되는 메커니즘이 바로 Bilinear Interpolation이다.한국어로 하면 이중 선형 보간인데, 말 그대로 선형 보간을 이중으로 하는 것이다.  위 이미지가 버텍스 3개로 이루어진 폴리곤이라 가정하고, vA, vB, vC 버텍스의 컬러가 각각 빨강, 초록, 파랑이라고 하자..

OpenGL/공부 2024.05.28

[OpenGL] Model Matrix (Translate, Rotate, Scale)

이번엔 지난 번에 만들었던 삼각형을 조작해볼 것이다.기본적으로 물체에 대한 조작은 선형 변환으로 이루어진다. 위키백과에 선형 변환을 검색하면 임의의 벡터에 대하여... 임의의 스칼라에 대하여... 이런 식으로 길게 설명이 되어있는데, 그냥 단순히 말하자면 앞에 행렬을 곱하는 것이다. 물체가 가지는 벡터(버텍스의 위치)에 행렬들을 곱해서, 그 벡터를 변화시키는 것이 선형 변환이라고 할 수 있다. 지금까지 삼각형을 그릴 때  vShader 내부에서 gl_Position = vec4(pos,  1.f); 를 사용하여 각 버텍스의 좌표를 그대로 넣어줬었다. 이번엔 이 vec4(pos,  1.f)의 앞에 적절한 행렬을 곱하여, 삼각형을 움직이고, 회전시키고, 크기를 조정해볼 것이다.그림으로 나타내면 다음과 같다...

OpenGL/공부 2024.05.28

[OpenGL] 쉐이더 사용, 삼각형 그리기 (+ VAO, VBO)

쉐이더를 사용하기에 앞서 렌더링 파이프라인에 대해 설명하자면,렌더링 파이프라인은 GPU 내부에서 화면을 렌더링하기 위해 돌아가는 시퀀스이다. GPU는 내부적으로 Vertex를 인풋으로 받아서, Pixel을 아웃풋으로 뱉어낸다.그 중간 과정에서 렌더링 파이프라인이 돌아가며, 핵심 과정은 다음과 같다. Vertex Processor: 버텍스를 인풋으로 받아, 버텍스 정보들을 처리한다. 주로 버텍스들의 위치 정보를 선형변환을 통해 Object-Space에서 Clip-Space로 변환한다.Primitive Assembler : 버텍스들을 이용해 폴리곤(primitive)들을 만든다.Rasterization : 폴리곤을 픽셀의 집합으로 만든다.Fragment Processor : 각 픽셀들의 최종 결과를 처리한다..

OpenGL/공부 2024.05.27

[OpenGL] OpenGL 시작, 개발 환경 세팅

이번 학기에 컴퓨터 그래픽스 수업을 수강하며 이론적인 내용은 많이 배웠지만, 아직 OpenGL 프로그램을 직접 짜기에는 지식이 부족하다고 느꼈다. 그래서 한동안 OpenGL을 공부해서 간단한 엔진 내지는 미니게임을 만들어보고, 최종적으로는 오픈소스 게임 엔진 프로젝트인 고도(Godot) 엔진에 기여하는 것을 목표로 하려고 한다.https://github.com/godotengine/godot GitHub - godotengine/godot: Godot Engine – Multi-platform 2D and 3D game engineGodot Engine – Multi-platform 2D and 3D game engine - godotengine/godotgithub.com  공부에는 Udemy 강의 C..

OpenGL/공부 2024.05.25

[언리얼 엔진 5] 싱글톤 패턴 (Subsystem)

유니티에서 싱글톤을 구현하는 방법은 다음과 같다.using UnityEngine;public class Singleton : MonoBehaviour{ public static Singleton instance; private void Awake() { if (instance == null) instance = this; }}  그런데 언리얼 엔진 5에서 GameManager같은 것을 유니티에서와 같은 방식으로 싱글톤으로 만드려고 하면, 엔진의 시스템 상 차이때문에 쉽지 않다.  하지만 언리얼 엔진 5에서는 UGameInstanceSubsystem을 상속받은 클래스를 만듦으로써 손쉽게 싱글톤 클래스를 만들 수 있다.  https://dev.epicga..

[언리얼 엔진 5] 언리얼 엔진에서의 순수 가상함수 사용법

순수 가상함수는 부모클래스에서 당장은 구현을 제공하지 않고, 자식클래스에서 구현을 강제하는 문법이다. C++ 프로그래밍에서, 순수 가상함수는 다음과 같은 포맷을 사용한다. virtual void MyFunc() = 0; C++의 순수 가상함수는 C# / java에서의 추상 함수와 같다. 순수 가상함수는 자식클래스가 해당 함수를 무조건 오버라이딩하도록 함으로써, 동적 바인딩을 통한 확장성을 높여 프로그램의 디자인을 좋게 만든다. 그런데, 언리얼 엔진 5에서는 순수 가상함수의 문법이 조금 다르다. 상단의 네이티브 C++ 문법을 그대로 쓰면, 다음과 같은 컴파일 에러 메시지를 볼 수 있다. 'Only functions in the second interface class can be declared abstr..

[UE5] 블루아카이브 TPS게임 개발일지 (64) - 프로젝트 마무리

프로젝트를 오늘까지 끝내기로 마음먹고, 어제 밤을 샜다. 우선 대사가 겹쳐서 사라지는걸 막기 위해 큐를 이용해 대사들을 빠짐없이 보여주도록 하였다. Conversation.h/*생략*/UCLASS()class KANNATPS_API UConversation : public UUserWidget{ GENERATED_BODY()/*생략*/private: /*생략*/ TQueue> ConversationQueue; TQueue MessageQueue;}; Conversation.cpp// Fill out your copyright notice in the Description page of Project Settings./*생략*/void UConversation::SetConversation(){ // 큐에..

[UE5] 블루아카이브 TPS게임 개발일지 (63) - 맵 연결 (Level Streaming)

일전에 게임의 맵으로 쓸 3개의 층을 만들어놓았었다.https://ciel45.tistory.com/68 블루아카이브 TPS게임 개발일지 (50) - 맵 제작개인적으로 게임 제작 중 제일 어렵다고 느끼는 맵 제작을 슬슬 할 때가 왔다. 최근 약 1~2주 동안은 계속 레벨디자인 작업만 한 것 같다. 발키리 경찰학교를 구현하기 위해서, 블루아카이브의 키ciel45.tistory.com 이제 이 3개의 레벨을 연결해볼 것이다. 게임 상에 레벨 3개를 모두 로드해놓으면, 성능 하락이 발생할 수 있다.따라서 칸나가 현재 위치한 층만 로드되어있도록 할 것이다. 언리얼 엔진 5에서는 이것을 Level Streaming이라는 이름으로 이미 제공하고 있다. 들어가기에 앞서, Level Streaming을 쓸 때는 동적으..

[UE5] 블루아카이브 TPS게임 개발일지 (62) - 대사 기능 적용

대사가 나오는 경우는 두가지로 분류할 수 있다.칸나가 특정 구역에 들어가는 경우적 / 칸나가 특정 이벤트에 반응하는 경우 1번을 위해서, BP_ConversationTrigger를 만들었다.트리거에 칸나가 들어오면, OnComponentBeginOverlap 이벤트를 수행한다.ConversationManager의 Set Conversation을 호출한다. Speaker와 Content 두 변수 우측의 눈 표시를 눌러, 해당 변수가 인스턴스마다 지정될 수 있도록 할 수 있다.  결과적으로 특정 구역에서 칸나 / 적이 대사를 하게 하려면, 맵에 BP_ConversationTrigger를 배치한 뒤 디테일 패널에서 Speaker, Content에 원하는 문장을 넣어주면 된다.    2번을 위해서는, 해당 이벤..