프로그래밍 452

D3D11 조명 관련 노멀 벡터 변환

CPU에서 GPU로 데이터를 전송할 때는 비교적 속도가 느리니,최대한 단순하게 계산해서 접근할 수 있도록 하는 것이 좋다. 이러한 이론을 실제 코드로 구현하는 방법은여러 개의 변환을 순서만 잘 정리하면 하나의 변환 행렬로 만들 수 있다.따라서 결과적으로 GPU에게 회전과 이동을 한 하나의 변환 행렬만 보내면 된다. 이러한 변환에는Model Matrix, View Matrix, Projection Matrix가 같이 사용된다.위 3 가지는 나중에 추후 따로 더 자세하게 정리해보겠다. 이번 포스팅에서는 Model Matrix와 Invertranspose 두 가지를 사용해서쉐이더의 코드를 작성해볼 것이다.  노멀 벡터 노멀 벡터를 회전을 시킬 때는다른 방식을 사용해야 한다.물체를 회전을 시킨다면, 물체의 표면..

그래픽스/DX11 2025.02.03

C/C++ 스마트 포인터 간단 정리

스마트 포인터 C++ 프로그램에서 동적할당 된 메모리는, 반드시 delete를 통해서 메모리 해제가 이루어져야 합니다.C++에서 메모리 누수로부터 프로그램의 안정적으로 관리할 수 있도록스마트 포인터를 제공하고 있습니다.이 스마트 포인터는 RAII의 개념을 기반으로 제작되었으며,클래스 템플릿으로 구현되어 있습니다.포인터 처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해주고,Dangling 포인터, 할당 실패 등의 버그를 방지하도록 제작되었습니다. 이러한 스마트 포인터의 사용 이유는,스마트 포인터를 사용함으로써,new, delete와 같은 키워드를 사용하는 추가적인 코드를 줄일 수 있으며,RAII 개념을 기반으로 제작되었기 때문에,제작의도에 맞게 사용자가 메모리 관리를 할 때 좀 더 안..

그래서 다형성이 뭐라고요?

간단히 말하자면하나의 개체나 메소드가 여러 가지 형태를 가지는 것이다. 여러 가지 형태를 가지는 것이니,오버로딩과 오버라이딩을 써서 여러 형태를 가지는 기능들을한데 묶어 분류해 놓은 것이다. 다형성은 굉장히 중요하다.그 이유는, 실제 유용성이 굉장히 많다.예를 들어 게임이라고 하면,몬스터의 종류가 많을 것이다.이런 몬스터의 부모 클래스가 되는 BaseMonster 클래스가 있을 것이고,이 클래스에 파생되는 애들도 있을 것이다.그럼 몬스터 종류가 약 20개쯤 된다고 가정해보자. 이 다른 타입들을 배열에 저장하기에는 좀 부담스럽다.귀찮고 번거로운 일이기 때문에. BaseMonster 클래스 내부에virtual 반환형 Move()  함수를 제작한다.이후 monster* 배열을 제작한 후, 이 배열 내부에 있는..

인라인 함수

함수를 호출할 때 필요 조건함수는 메모리 안에 "할당"되어 있다.함수를 호출하기 위해 필요한 단계들변수들을 스택에 push함수 주소로 점프함수를 실행호출자 함수로 다시 점프1번 단계에서 넣어뒀던 변수들을 "pop"함수 주소로 이동되서 써야하니까 변수를 스택에 넣어두고스택에서 가리키는 포인터를 확 뒤돌리는 것 만으로도충분히 그 값을 쓸 수 있다.하나하나 빼서 쓰지는 않다. 여기서 실제 컴퓨터 아키텍처에 따라4,5번은 순서가 뒤바뀔 수 있다. 함수의 단점뭔가 여러 단계를 거치므로 생기는 단점이 있을 것 같지 않은가? 여러 단계를 거치다보니 좀 더 느리다는 단점있다.CPU 캐시에 최적이 아닐 수도 있으면 더 느리다.모던 cpu 아키텍처에서는 더 느리다. 특히나 캐시 최적화나 이런 점 때문에 느린 속도를 가진다..

그래프 순회 - BFS

그래프 구조를 이용해 문제를 해결하기 위해필요한 기본적이고 대표적인 그래프 알고리즘에서BFS,DFS를 빼놓고 논하기는 쉽지 않을 것이다.일단, 그래프 알고리즘을 말하기 전에 그래프에 대해서 말해보자. 그래프란? 그래프는 정점의 집합과 정점들을 서로 잇는 에지의 집합으로 구성된다.수학적으로 표현하면 그래프 G = 형태로 표현하고,여기서 V는 정점의 집합, E는 에지의 집합을 나타낸다. 그래프에는 크게 방향 그래프, 무방향 그래프, 가중 그래프, 비가중 그래프가 있다. 만약 에지가 특정 정점에서 다른 정점으로 향하는 방향있다면 방향 그래프라고 한다.특정 방향을 가리키지 않으면 무방향 그래프라고 한다.에지에 가중치가 있으면 가중 그래프,가중치가 없으면 비가중 그래프라고 한다. (추가적으로 그래프를 다룰 때 ..

DFS 구현 (재귀와 스택) 과 BFS(큐)

DFS 구현 재귀 호출 코드#include #include using namespace std;const int MAX_N = 10;int N, E;int Graph[MAX_N][MAX_N];bool Visited[MAX_N];void dfs(int node) { Visited[node] = true; cout > N >> E; // 배열 초기화 memset(Visited, 0, sizeof(Visited)); memset(Graph, 0, sizeof(Graph)); for (int i = 0; i > u >> v; Graph[u][v] = Graph[v][u] = 1; } dfs(0); return 0;}  스택 코드#include #include #include using namespace st..

백준 실버4 1920 수 찾기

https://www.acmicpc.net/problem/1920  이 문제는 다음과 같이 풀 수 있다.1. 배열의 길이를 입력 받는다.2. 해당 배열에 들어갈 원소들을 순차적으로 입력 받는다3. 비교할 배열의 길이를 입력 받는다   (굳이 배열에 담지 아니해도 된다, 설명 편의상 배열이라고 가정하였다.)4. 먼저 생성된 배열과 비교할 배열의 원소와 일치한다면 1을, 아니라면 0을 출력한다. 해당은 문제는 탐색을 통해 풀 수 있다.필자는 이진 탐색으로 풀었다.using namespace std;int main(void){ ios::sync_with_stdio(false); cin.tie(NULL); std::cout.tie(NULL); int n; cin >> n; vec..

프로그래머스 LV.2 전화번호 목록

https://school.programmers.co.kr/learn/courses/30/lessons/42577 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 해당 문제는 전화번호가 접두어인가? 를 판별하면 된다.접두어이면 FASLE, 아니면 TRUE를 반환한다. 제한 사항폰북의 길이가 1 ~ 1000000이다.각 전화번호의 길이는 1 ~ 20 사이이다.같은 전화번호는 중복해서 들어가 있지 않다 해당 문제의 접근법은 3가지가 있다. 1. 반복문을 활용 - 시간이 너무 오래 걸린다. 폰북의 길이가 너무 길다. - 이중 루프를 돌게된다.(양방향 비교) 2. 정렬과 반복문을 활용 - 이중 루프..

2025년을 일주일정도 앞두고

25년에는 언리얼 기본기부터 다시 쌓자.구조부터 기본기 전부 다시 천천히 꼼꼼히 훑어보자.25년에는 적어도 언리얼에 대한 기본기는 탄탄하게 가져가자언리얼 공부는 타 상용엔진 이해에도 도움이 될 뿐만 아니라,간접적으로 아키텍처 공부도 된다.따라서 언리얼에 대한 기본기를 잘 숙지하는 것은굉장한 이점이 된다.이를 위한 지식 함양을 고려하여25년 공부 우선 순위를 정하였다.1. C++ (+자료구조)2. 네트워크3. 그래픽스4. 언리얼5. OSCS6. 중국어 영어 자격증 취득7. CUDA8. 아키텍처1. C++ 목표effective C++effective modern C++ㅡ전문가를 위한 C++2. 네트워크혼자 공부하는 네트워크열혈 TCP/IP 3. 그래픽스홍랩 그래픽스 강의 2~4PART4. UE언리얼 기본기 ..

카테고리 없음 2024.12.24