[OpenGL] glPointSize()의 값 지정
문제 상황pointSize_를 어떻게 지정하던간에, 시각화되는 포인트의 크기가 1.0~1.4이라도 시각적으로 동일하게 보이고, 1.5~2.4도 동일해 보인다. 셰이더 안에서 point 크기를 다루어도 동일한 현상이 발생한다. glPointSize(pointSize_);glDrawArrays(GL_POINTS, 0, points.size()); 공식 설명glPointSize함수는 점의 래스터화 된 지름을 정한다고 한다. point size 모드가 비활성화된 경우 (`GL_PROGRAM_POINT_SIZE`를 사용하는 `glEnable` 참조) 이 값이 점을 래스터화 하는데 사용된다. 그렇지 않으면`glEnable(GL_PROGRAM_POINT_SIZE)` 인 경우, 셰이딩 언어 내장 변수 `gl_Point..
2025.12.30
[C++] 전역 변수, 내부 연결, 외부 연결, 헤더 include 주의점
전역 변수, 내부 연결, 외부 연결전역 변수전역 변수는 가급적 사용하지 않는 것이 좋지만, 부득이하게 사용해야 하는 경우가 발생하는데 그때 그때 상황이 다르다. 결국 어떻게, 사용해야할지는 프로그래머 본인들이 결정해야 한다. 전역 변수의 name hiding전역 변수와 똑같은 이름으로 선언된 지역 변수가 있으면 name hiding이 수행되어, 지역 변수가 우선적으로 사용된다. 만약 전역 변수의 값에 대해 접근하고 싶으면 `::` global scope operator를 통해 전역 변수에 접근할 수 있ㄷㅇ아.#include using namespace std;// name hiding int value = 123;int main(){ cout Linkage지역 변수의 경우 linkage가 없다..
2025.12.20
[C++] 함수 내의 static 변수 선언
staticstatic 의미를 이해할 때, C언어를 만든 사람입장(컴퓨터 구조, 어셈블러)에서 보면 이해하는게 조금 쉽다. static 변수는 os로부터 받은 "메모리"가 정적으로 선언된다는 것이 static이라는 것이다. 동적할당에 대비하여 생각하면 더 와닿을 것이다. 함수 내의 static 변수 선언static으로 함수 내의 변수가 선언되면 해당 함수 영역에서 변수가 선언될 때 같은 메모리를 쓰고, 초기화를 한 번 밖에 안한다.void doSomething(){ static int a = 1; ++a; cout doSomething()함수를 몇 번 호출하고 VS의 디버거를 통해 함수 내의 선언된 변수 a를 살펴보면, 함수 스코프에서 나와도 조사식에 값이 남아있는 것을 볼 수 있다. (F11이 아닌..
2025.11.30
[C++] int8_t, int_least8_t and int_fast8_t 차이
int8_t, int_least8_t and int_fast8_t 차이해당 차이점은 Carl Norum이 인용한 C99 표준의 섹션에 정의되어있다. 하지만 예제를 통해 이해하는 것이 도움이 될 수 있다. 우리가 36-bit system에 대한 C컴파일러를 가지고 있다고 가정해보자. `char` = 9bits, `short`=18bits, `int`=36bits, `long` = 72 bits 라면,`int8_t`는 존재하지 않는다. 이는 패딩없이 정확히 8bit를 가진다는 제약을 만족시키지 못하기 때문이다.`int_least8_t`는 `char`의 typedef이다. `short`나 `int`가 아니다. 표준은 최소 8bit를 가지면서 가장 작은 타입을 요구하기 때문이다.`int_fast8_t`는 무엇이..
2025.10.05
[C++] 변수 초기화 방식
Copy Initializationint a = 123; Direct Initializationint a(123); Unifrom Initializationint b {123}; direct와 unifrom 초기화는 사용자 정의 데이터 타입을 초기화 할 때 많이 사용한다. 최근에는 uniform 초기화를 권장한다는 소리가 있다. 이는 uniform 초기화 방식이 더 엄격하기 때문이다. 예를 들어, Direct 초기화 방식을 사용하면,#include using namespace std;int main(){ int a(3.14); return 0;} 에러가 아닌 warning 메시지만 띄운다. 출력 또한 3으로 잘된다. 이는 Copy 초기화 방식도 동일하다. 하지만, unifrom으로 초기..
2025.09.25
[C++] 데이터 타입의 크기 지정 방식과 ABI
데이터 타입의 크기C++에서 기본 데이터 타입의 크기는 언어 표준에서 최소 크기만 보장하고, 실제 몇 바이트를 사용할지는 컴파일러와 CPU 아키텍처가 결정한다. 이 표를 자세히 보면 `char`을 제외하고는 기본 유형 준 표준 크기가 지정된 유형이 없다. 이는 타입의 크기가 결정되지 않은 것은 아니고, 모든 컴파일러와 머신에 걸쳐 표준 크기가 존재하지 않다는 것을 의미한다. 그래서 컴파일러가 타입의 크기를 결정한다. 보통 16bit CPU면 `int`는 2byte이고, 32bit CPU이면 `int`는 4byte이다. 다만 64bit CPU라고 `int`가 8byte가 되진 않는데, 이처럼 컴파일러 개발자가 적절하다 싶은 데이터 크기를 지정하여 구현한다(물론 ABI는 맞추어야 함). 이런 타입 크기 지..
2025.09.24
[C++] 전처리기, 매크로
#include using namespace std;#define MY_NUMBER "Hello, World!"#define MAX(a, b) ((a>b) ? a : b)int main(){ cout 여기서 MAX(a, b) 꼴은 함수처럼 보이지만 (a, b)가 함수의 파라미터처럼 취급되는건 아니다. 그저 치환당할 대상의 자리를 표시하는 정도이고, 문자열 치환으로 취급한다. 그래서 실제 함수 호출처럼 스택에 값 복사, 타입 검사 등이 발생하지 않고 그냥 코드를 복사해서 붙여 넣는 것이다. 예전에는 속도가 빠를 수 있다는 이유로 매크로 함수를 사용하는 경우가 많았지만, 요즘은 사용하지 않는 추세라고 한다. 이러한 `#define`, `#ifdef`와 같은 것들을 전처리기 지시문이라고 한다. 그리 매..
2025.09.21
[C++] 네임스페이스
네임스페이스 사용법#include namespace MySpace1{ int doSomething(int a, int b) { return a + b; }}int doSomething(int a, int b){ return a * b;}using namespace std;int main(){ cout namespace는 중첩해서 선언 및 사용할 수 있다.#include namespace MySpace1{ namespace test { int doSomething(int a, int b) { return a + b; } }}int doSomething(int a, int b){ retu..
2025.09.13
[C++] 전방 선언과 헤더 파일에 대한 고찰
전방 선언헤더 파일을 만들지 않고, include를 하지 않더라도 다음과 같이 전방 선언해서 다른 cpp 파일의 함수를 사용할 수 있다. 컴파일러는 main.cpp를 컴파일 할 때, 전방 선언된 함수를 보고 어딘가에 `add(int a, int b)` 함수의 정의가 존재할거라고 믿고 컴파일에 문제가 생기지 않는다. 컴파일러는 컴파일만하고, 그 뒤의 작업인 실행할 때 링킹해서 알아서 사용하라는 개념이다. main.cpp#include using namespace std;int add(int a, int b);int main(){ cout 그리고 사실, `int add(int a, int b)` 앞에 생략되어 있는 키워드가 하나 있다. 바로 `extern`이다. 즉, 원래는 ` extern int add..
2025.09.10
[CMake] install
Install CMake의 install 명령어는 배포할 바이너리나 헤더들을 특정 디렉토리에 모으기 위해 사용된다. 즉 설치(install)이라는 키워드가 가지는 의미는 "빌드 산출물을 잘 정리해서 원하는 디렉토리에 배치하는 것"이다. 기본적으로 다음과 같은 명령어를 따라서 configure 및 build를 수행하게 되면 빌드 디렉토리 안에 모든 결과물들이 존재하게 된다.cmake -S . -B buildcmake --build build isntall() 커맨드를 사용할 수 있도록 세팅하였다면, `cmake --instal build` 한 번만 실행파면 실행 파일이 `bin/`에, 라이브러리가 `lib/`에, 헤더가 `include/`에 정리되어 들어올 수 있도록 할 수 있다. 즉, 설치된 프로그램처..
2025.09.05
no image
[Network] TCP/IP와 OSI 7 Layer의 간단한 정리 및 Application Layer
이 글에는 OSI 7 Layer의 각 계층에서 어떤 일이 벌어지는지 자세히 기술하지 않는다. 예전에 그런 것을 공부해보았지만, 오히려 큰 그림을 제대로 설명하는 포스팅이 없다고 느꼈고, 네트워크 지식이 필요하게 된 상황이라 조금 더 큰 맥락으로 글을 작성하게 되었다. TCP/IP와 OSI 7 Layer이 Application Layer라는 것은, 논리적인 모델인 OSI 7 계층 또는 TCP/IP 계층의 최상단에서 확인할 수 있다. OSI 7 Layer는 Basic Referecne Model로 특정 기술에 국한된 것이 아니라 모든 네트워크에 관한 모델에 대해 설명할 수 있는 범용적인 모델이다. 하지만 TCP/IP 모델은 이름에서 알 수 있듯이 인터넷 계층에서는 IP(IPv4, IPv6)를 전송 계층에서는..
2025.08.27
[Qt] CMakePresets.json, CMakeUserPresets.json
Qt프로젝트 중 CMakeUserPreset.json을 QtCreator에서 적용하는데 어려움을 겪어서, 해당 과정을 남긴다. CMakePresets.json, CMakeUserPresets.jsonCMake를 사용할 때 일반적으로 프로젝트 configure에 대한 설정을 공유할 때 문제가 생긴다. 그렇기에 CMake에서 3.19 버전부터 일반적인 configure 옵션을 지정하고, 다른 사용자와 공유할 수 있는 파일인 `CMakePresets.json`과 `CMakeUserPresets.json`를 지원한다. `CMakePresets.json`과 `CMakeUserPresets.json`은 프로젝트의 root 디렉토리에 위치해야 하며, 포맷자체는 둘 다 똑같으며, 둘 다 필수가 아닌 사용자가 필요하에..
2025.08.20
QT