2024/10 52

C++ 에서 가상 함수가 필요한 이유는 무엇인가?

C++에서 가상 함수란 무엇인가?C++의 가상 함수는 파생 클래스에서다형성을 달성하기 위해 재정의할 수 있는 기본 클래스 멤버 함수입니다.virtual 키워드를 사용하여 기본 클래스에서 함수를 선언할 수 있습니다.기본 클래스에서 함수를 선언하면포인터나 참조를 사용하여 가상 클래스를 호출하고파생 클래스에서 가상 버전을 실행할 수 있습니다.따라서 컴파일러에게 런타임 중에 객체의 유형을 결정하고함수 바인딩(늦은 바인딩 또는 동적 연결)을 생성하도록 요청합니다. C++의 가상 함수는 참조 또는 포인터를 통해 올바른 함수를 호출하는 데 도움이 됩니다. C++ 프로그래밍 언어에서는 단일 포인터만 사용하여 모든 파생 클래스 객체를 참조할 수 있습니다. 포인터는 모든 파생 객체를 참조하므로 이를 호출하면 기본 클래스에..

DX11 - 원근 투영(Perspective Projection)

원근 투영은 원근법에 대한 것으로,원근범에 대한 기본적인 방식은 먼 거리에 있는 물체가더 작게 보이게 2D 화면에 나타내는 방식이다.3D 투영 (또는 그래픽 투영)은 2차원 (2D) 표면에3차원 (3D) 객체를 표시하는 데 사용되는 디자인 기술이다. 원근법을 적용한 그림들의 공통점은 '소실점의 존재'이다.이 소실점을 기준으로 일정 각도만큼의 직선들을 나란히 그리게 되면실제로 소실점에 가까운 부분들은 멀어보이게 되는 시각적 효과를 가져온다. 하지만, 3D 컴퓨터 환경에서 원근법을 적용하기 위해선실제 그림에서 적용되는 방식과는 조금 다르다.결론은 3D Rendering 에서는 소실점 개념은 필요치 않다. 우선, 한가지 생각해볼 문제는 우리가 바라보는 위치즉, 3D 공간을 표현하기 위한 우리의 시계에서는'카메..

그래픽스/DX11 2024.10.23

[백준 실버 5] 1427 소트인사이드

https://www.acmicpc.net/problem/1427    string으로 받으면 cin.eof()로 안받아도 된다.띄어쓰기도 없는 걸 보니깐 string으로 받는 게 편한 거 같다.여기서 내림차순으로 수를 정렬을 하면 되는데사실 vector의 sort는 퀵소트라 빠르긴 하다.하지만, 직접 선택 정렬을 통해 구현할 수도 있다. 현재 범위에서 maxIdx를 찾고,최대값을 앞으로 보내는 식으로 정렬한다.#include #include #include #include #include #include #include #include #include #include using namespace std;int main(){ ios::sync_with_stdio(0); cin.tie(0); ..

DX11 - 쉐이더 개념 + 뒷면 제거

이번 강의에서는 렌더링 파이프라인의 각 화살표 단계에서 쉐이더가 무슨 일을 하는지, 왜 필요한지, 왜 이런 구조로 만들어 졌는지 알아보기 위해서 마치 쉐이더라는 것을 활용하는 것 처럼 짜본다. 쉐이더의 이름은 쉐이딩를 할 때 사용해서 쉐이더라는 이름이 붙기 시작했다. 입체감을 주기 위해서 음영처리를 하기 위해서 처리하는 단계이다. 가상 세계에서 정말로 3차원에 있는 것처럼 보이기 위해 빛과 물체의 표면의 상호작용을 고려해서 음영처리 하는 것을 시작으로 GPU안에서 작동하는 프로그램을 쉐이더라고 부르기 시작했다. 쉐이더에 공통적으로 들어가는 것은 스케일, 트랜스레이션, 로테이션 값이다. 같은 물체 안에 동일한 변환을 적용하는 것들은 따로 모아놓고 사용하셨다. 버텍스 쉐이더에서 가장 중요한 것은 어떠한 정보..

그래픽스/DX11 2024.10.21

D3D11 - 2차원 애니메이션 + 깊이 버퍼

렌더를 할 때, CPU가 처리할 기하 정보와 GPU가 처리할 버퍼 정보는 서로 다르다. 정점의 정보와 정점과의 연결관계, 그리고 컬러의 값은 기하 정보이며, 그 정보 값을 토대로 처리할 버퍼를 따로 변수로 둬야한다. 이후 버퍼와 값을 한 함수에 묶어줘서 컴퓨터에게 넘겨주면 컴퓨터가 이를 처리하는 것으로 알고 있었는데, 홍랩에서는 버퍼로 현재 값을 복사하고 있었다. 실제로 DX를 사용하면 cpu에 있는 것을 gpu에 복사하고, 다시 그 값이 변경되고 그 다음에 렌더링이 생기는 과정을 거치는 것을 해당 수업을 통해서 알았다. 오늘날의 GPU CPU 값 전달 방식은, GPU가 데이터를 VRAM에 저장한 상태에서 CPU에서 그렇게하는 신호가 오면 VRAM에서 데이터를 가져와 연산하는 방식이다. 이는 그래픽 카드..

그래픽스/DX11 2024.10.20

2D 운석 피하기 게임 속 수학

운석에 6번 맞으면 플레이어 사망,레이저와 플레이어가 운석이 직접 충돌하는 것으로 운석 부술 수 있음 벡터와 물리 벡터는 방향 + 스칼라입니다. 벡터는 방향을 나타낼 수 있으므로 게임에서는 오브젝트의 방향을 표현하고자벡터를 종종 사용합니다. 오브젝트의 전방 벡터는 오브젝트가 나아가는 직선 방향을 나타내는 벡터입니다.예를 들어 x축을 따라 쭉 이동하는 오브젝트는 전방 벡터 을 가집니다. 개발자는 게임상에서 다양한 벡터 연산을 수행하여 기능 구현을 합니다.따라서 일반적으로 게임 프로그래머는 이런 다양한 벡터 연산을 수행하기 위해 라이브러리를 사용합니다.이로인해 벡터 관련 방정식을 기억하는 것 보다는,어떤 벡터 연산으로 어떤 문제를 해결할 수 있는지를 아는 것이 더 좋습니다.  2D 좌표 평면에서는 x,y축을..

그래픽스/OpenGL 2024.10.20

[Devlog-DX11] HOLLOW KNIGHT 모작 - Video - 블러 처리 시도

Blur 처리 박스 블러 코드는 적용했고,일단 돌아는 가는데 박스 블러 효과를 볼 순 없었다.그리고 무엇보다가장 큰 단점으로는pixel.size를 너무 크게 잡았기 때문인지,원래는 vector4 하나만 받아서 처리하다가pixel vector모든 부분에 대해서 동적 할당을 하다보니,4897408개의 픽셀을 계산하게 되어버벅거리는 현상이 짙다. 블러 이미지클래스를 만들어준 뒤다음과 같은 코드를 추가해주었다.결과적으로 렌더 함수는 돌고 있지만,뭔가 그려주는 함수가 잘 작동하지 않는 것 같았다. 나중에 쉐이더책 보고 dx에 대한 내공좀 쌓은 뒤 다시 도전해야겠다.     #include "framework.h"#include #include #include ID3D11Buffer* BlurImage::verte..

이득우의 게임 수학 3장 벡터(2차원 공간)

벡터로 원그리기반지름이 5인 원을 생성하기 위해,먼저 원을 둘러싼 사각형 영역을 생성하고,이로부터 원을 구성하는 벡터만 골라내는 방법을 시각화 할 것이다. 반지름의 크기가 5보다 작거나 같은 벡터를 묶으면 원의 형태가 만들어진다. #pragma oncenamespace CK{struct Vector2...FORCEINLINE float Vector2::Size() const{ return sqrtf(SizeSquared());} // x^2 + y^2의 값을 계산한 후 그 값을 반환한다.FORCEINLINE constexpr float Vector2::SizeSquared() const{ return X * X + Y * Y;}...  이 영역을 구하는 벡터의 크기는 벡터의 크기 수식을 사용해 계산..