분류 전체보기 14

Depth 양은 알 수가 없어

ref. 아하렌 양은 알 수가 없어 한 3일동안 있었던 버그를 잡은 짧은 회고록입니다렌더링 과정에서 depth test가 이루어지지 않아 그리는 순서대로 위에 그려지는 현상이 있었습니다우선 view 혹은 projection의 matrix가 제대로 넘어가지지 않나 둘의 depth값을 확인해봤습니다depth색은 정상적으로 적용되었습니다(멀수록 어둡게)이때 알아낸 것은 현재 vector에 MeshRenderer를 담고 순차대로 draw를 진행하는데, 이 순차대고 먼저 그려진다는 사실입니다따라서 depth test 자체가 이루어지지 않고 있다는 것을 의심했습니다하지만 DepthStencilBuffer 생성도 통과하였고DepthStencilState도 정상적으로 생성되었습니다여기서 잠시 막히게 되었지만 결국 원인..

Let's Groove - TCP와 UDP

https://megayuchi.com/2025/10/07/tcp-vs-udp-latency-차이/ 제가 자주 보는 분의 글들을 읽다가 적어봅니다 흔히 속도는 UDP, 안정성은 TCP라고 머리에 박혀있습니다 다만 글의 내용을 보면 오히려 TCP가 빠른 결과가 나왔습니다 전제를 살펴보도록 하죠이미 연결되어 있다재전송이 일어나지 않는다 TCP의 연결은 3-way handshake로 진행됩니다 Clinet -> Server 연결 요첨 Server -> Client 연결 확인 + 연결 요청 Client -> Server 연결 확인 반면 UDP는 연결이랄게 따로 없습니다 그냥 존재하는지도 모르는 어딘가에게 계속 데이터를 보내는 거죠 그래서 TCP는 연결 처리 과정이 존재합니만 전제는 이미 연결되어 있기에 이는 무..

Spider-Man: Into the Spider-Verse - 멀티스레딩

오늘은 멀티스레딩에 대해 알아보자좀 더 정확히 표현하자면 C++에서 어떻게 다루는지 알아보자대충 알겠지만 멀티스레딩은 싱글스레딩만 해오던 나에게 굉장히 어려웠다그렇기에 개념을 잡는 시간이 걸렸으며 사실 다 잡힌건 아닌 것 같다따라서 앞으로도 개념정리는 계속 바뀌겠지만 현재까지 이해한 것을 바탕으로 써보겠다std::thread대입 연산자를 이용하여 함수를 실행하기 전까지는 빈 포인터 상태처럼 남아있다void Work(){ std::this_thread::sleep_for(std::chrono::seconds(1));}int main(){ std::thread t = std::thread(Work); t.join();}스레드는 생성과 동시에 실행된다그리고 이런 스레드에 대해 관리하는 방법은 2가지가 있다jo..

C++과 친해지기 2026.01.07

Little Mo' Betta - 구조체 데이터 최적화하기

struct Bonfire { bool bIsSleeping; int nMemberCount; bool bIsHappy; bool bCanJoinNow; };다음 구조체의 크기는 몇일까?우리가 알고 있는 지식으로는 bool이 1바이트, int는 4바이트이다따라서 bool x3 + int x1로 7바이트라고 생각할 수 있다그렇다면 돌려보자int main() { Bonfire fire; std::cout 이게 왠걸거의 2배인 12바이트가 할당되어버렸다왜 그럴까?첫번째로는 애초에 7바이트라는 사이즈만 할당할 수 없다CPU에서는 값을 읽을때 4바이트로 정렬되어있다면 값을 한번에 읽을 수 있다그렇기 때문에 컴파일러는 ABI(Application Binary Interface)라고 하는..

Fight Club - Rule of 0/3/5

C++을 공부하다 보면Rule of 5, Rule of 3, Rule of 0라는 뭔 규칙을 의미하는건가 싶은 것을 볼 수 있다오늘은 이 Rule of 0/3/5 에 대해 알아보자사실 Rule of 3와 5은 동일하다정확히하자면 기존의 Rule of 3에서 C++11 이후부턴 2가지의 규칙이 추가되어 5가 된것이다이 이야기는 살짝 미뤄두고 Rule of 0부터 확인해보겠다Rule of 0핵심만 읊자면 클래스가 직접 메모리,파일,핸들 등을 관리하지 않게 설계하라는 의미이다아니 그럼 데이터들을 어떻게 관리하냐? -> RAII를 사용하면 된다RAII는 Resource acquisition is initialization의 약자로, "자원 획득은 초기화"라는 의미이다RAII는 자원은 해당 객체가 살아있을 때만 ..

C++과 친해지기 2025.12.13

Nameless - 좋은 이름을 짓는 방법

언어별 예약어를 사용하지 말것 ex) int, float, for etc컴파일러 예약어도 사용하지 말것 ex) __언더바2개, _Muck언더바후대문자모두가 알고있는 약어만 사용할 것같은 내용을 반복하지 말것void saveEmployee(const Employee employee);보다는void save(const Employee employee);프로퍼티도 이름의 일부로서 사용bool bIsNotPlayer 처럼 논리형에 부정문 사용하지 않기 => bIsPlayer귀찮더라도 임시변수에 이름 지정 ex) for문의 i, iterator의 it, templete의 T어떻게 구현했지는지 생각하지 않기 pair GetPlayerLevelPairInt(const std::string name);보다는pair G..

Still Alive - RAII에 대하여

"Resource Acquisition Is Initialization"번역하자면,"객체와 자원의 라이프 사이클을 일치시킨다"의 의미를 가지고 있는 원칙이다이 원칙의 핵심은 프로그래머가 직접 자원을 관리하는 것이 아닌, 생성, 파괴 및 관리의 모든 것을 객체가 하도록 만드는 것이다왜 그래야하지?이유는 간단하다.프로젝트가 커지고 여러 데이터들이 생명주기를 직접 관리해야한다면 인간인 이상 놓치는 부분이 생기기 때문이다또한 놓치지 않더라도 이 데이터를 누가 참조하는 지에 대한 것도 불명확하기에 이를 방지하고자 지향해야한다class Player{ public: Player() { m_inventory = new Inventory; } ~Player(); ..

OpenGL 공부하기 #4 - 행렬과 변환

1. glm 라이브러리 기본GLM (OpenGL Mathematics)은 GLSL과 유사한 문법을 사용하는 수학 라이브러리#include #include 2. Transformations의 종류Translation (이동)glm::mat4 model = glm::mat4(1.0f);model = glm::translate(model, glm::vec3(x, y, z));객체를 x, y, z 방향으로 이동시킴보통 model 행렬에서 사용Scaling (크기 조절)model = glm::scale(model, glm::vec3(sx, sy, sz));비율로 객체를 확대/축소균일 스케일: glm::vec3(s, s, s)Rotation (회전)model = glm::rotate(model, glm::radi..

OpenGL 2025.07.14

OpenGL 개발하기 - Sierpinski Triangle

재귀함수를 이용해 시에르핀스키 삼각형을 그리는 코드원래 효율적으로 그리기 위해서는 재귀함수에 glDrawElements를 하지 않고 vector타입을 이용해 vertices에 정점을 더해가며 재귀가 마친 후에 VBO에 한번에 넣는 방식이다하지만 그려보는 것이 목적이었기에 단순한 방식을 채택했다#include #include #include #include #include #include #include "Shader.h"#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"float vertices[] = {// positions // colors // texture coords1.0f, 1.0f, 0.0f, 1.0f, 0..

OpenGL 2025.07.14

OpenGL 공부하기 #3 - VAO, VBO, EBO

VAO (Vertex Array Object)정점의 속성 구조를 저장하는 객체임버텍스를 어떻게 해석할지 정의함 ex. 첫 3개 float은 xyz, 4번째부터 3개 flaot은 색상값 등glGenVertexArrays()로 생성함glBindVertexArray()로 바인딩 후 설정 저장 및 사용 가능여러 VAO 생성하여 각각 다른 설정 가능VBO (Vertex Buffer Object)실제 정점 데이터를 GPU에 저장함glGenBuffers()로 생성함glBindBuffer(GL_ARRAY_BUFFER, id)로 바인딩함glBufferData()로 버텍스 데이터 전송함 (데이터 복사 후 삽입)GL_STATIC_DRAW → 자주 바뀌지 않는 데이터에 사용함float vertices[] = { x, y..

OpenGL 2025.07.05