분류 전체보기 115

[OpenGL] ModelView Matrix (glm::lookAt)

카메라에 대한 포스팅을 적기 전, 이 두가지 행렬에 대한 글을 적고자 한다. ModelView Matrix는 물체의 버텍스의 좌표를 Object Space에서 View Space로 바꿔준다.이는 물체 자체를 중심으로 하는 좌표계에서, 카메라를 원점으로하는 좌표계로 바꿔준다는 의미이다. 앞선 포스팅에서 T * R * S 로 Model Matrix를 만들어, 이를 통해 물체를 움직인 바가 있었다.https://ciel45.tistory.com/89 [OpenGL] Model Matrix를 통한 물체 조작(Translate, Rotate, Scale)이번엔 지난 번에 만들었던 삼각형을 조작해볼 것이다.기본적으로 물체에 대한 조작은 선형 변환으로 이루어진다. 위키백과에 선형 변환을 검색하면 임의의 벡터에 대하여..

OpenGL/공부 2024.06.01

[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..

[언리얼 엔진 5] Retriggerable Delay 사용법 (FLatentActionInfo)

게임 로직을 구성할 때, 특정 조건으로 인해 이벤트가 트리거되고, 일정 시간 동안 해당 조건이 발생하지 않아야 이벤트가 종료되어야 하는 상황이 있을 수 있다. 예를 들자면, FPS / TPS 게임에서 적에게 피격당했을 시 데미지 방향 표시기가 나타나는데, 일정 시간 동안 추가적인 공격을 받지 않아야 표시기가 페이드 아웃되어 사라지고, 그 전에 추가 공격을 받을 시 표시기가 업데이트된다. 아래는 프로젝트 내에서 해당 로직을 사용한 상황이다. https://ciel45.tistory.com/62 블루아카이브 TPS게임 개발일지 (45) - 피격 방향 표시기 구현 2 이제 이 표시기가 피격 시 화면에 떠야 한다. 맞을 때마다 일일히 화면에 띄워주고, 없애주기 귀찮아 약간의 꼼수를 썼다. 사실은 항상 화면에 떠..

[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(){ // 큐에..