[QT] QOpenGLShaderProgram의 addShaderFromSourceCode 메서드
QOpenGLShaderProgram이 클래스는 GLSL과 GLSL/ES로 작성된 셰이더 프로그램을 지원한다. QOpenGLShader와 QOpenGLShaderProgram은 vertex shader와 fragment shader를 컴파일하고 링킹하는 세부 작업들로부터 프로그래머를 보호해준다. 다음 예제는 제공된 셰이더 소스코드를 사용하여 버텍스 셰이더 프로그램을 생성하는 것이다. 컴파일 및 링크가 완료되면 셰이더 프로그램은 QOpenGLShaderProgram::bind():를 호출하여 현재 QOpenGLContext에서 활성화된다.QOpenGLShader shader(QOpenGLShader::Vertex);shader.compileSourceCode(code);QOpenGLShaderProgram..
2025.05.18
QT
no image
[OS] 프로세스와 메모리 레이아웃
프로세스프로세스 개념운영 체제에 대해 이야기 할 때 제기되는 질문중 하나는 CPU가 수행하는 모든 활동을 무엇이라고 부를 것인가이다. 초기 컴퓨터는 job을 실행하는 일괄 처리(batch) 시스템이었지만, 이후 user program, 또는 task를 실행하는 시분할 시스템이 등장했다. 오늘날 단일 사용자 시스템에서도 사용자는 워드 프로세서, 웹 브라우저, 이메일 패키지 등 여러 프로그램을 동시에 실행할 수 있다. 멀티태스킹을 지원하지 않는 임베디드 장치처럼 컴퓨터가 한 번에 하나의 프로그램만 실행할 수 있더라도, 운영 체제는 메모리 관리와 같은 자체적인 내부 프로그래밍 활동을 지원해야 할 수 있다. 많은 측면에서 이러한 모든 활동은 유사하므로, 이 모든 활동을 프로세스(process)라고 부른다. 조금..
2025.05.09
[C++] std::array
std::arrayC++ 11에 추가된 std::array는 에 정의되어 있다. C 스타일의 배열과 다른 점은 배열의 이름이 `T*`로 자동 형변환 되지 않는다. C 스타일의 배열을 사용하게 되면 함수 매개변수에 집어넣었을 때, 포인터로 강제 변환되어 배열의 크기가 날라가는 불편한 점도 초래한다. 배열 크기가 소멸되는 이유는 `int arr[]`처럼 함수의 매개변수를 설정하더라도, 함수 내부에서 `int* arr`와 동일하게 해석한다. (sizeof() 연산하면, 그냥 포인터 크기만 계산됨.) 이 떄문에 배열의 크기를 같이 함수 매개변수에 넘겨주어야 하는 과정이 생긴다. 또한 반복자(iterator), 대입 연산자 등을 사용할 수 있다. 이 덕분에 에 정의된 함수를 std::array에 사용할 수 있는..
2025.05.03
[C++] Data Types, Type Modifier
Data Types 카테고리종류설명예시 데이터 타입Built-in간단한 값을 저장하는 데 사용되는 기본 데이터 타입. Built-in 또는 primitive 타입이라고 불린다.int, float, double, char, bool, voidDerived Data TypesBuilt-in 타입을 기반으로 더 복잡하게 만들어진 타입이다. 예를 들어, int*, int&, int[10], int()는 모두 int에서 파생된 타입Functions, Arrays, Pointers, ReferenceUser Defined Data Types프로그래머가 필요에 따라 만든 사용자 지정 데이터 타입class, struct, union, typedef, using Data Type Modifiertype modifier..
2025.05.03
no image
[QT] QWidget 기본 개념 정리
QWidget기본 개념QWidget 모든 위젯의 기반 클래스이다. QWidget은 가장 기본적인 Draw와 이벤트 처리 기능만 제공하기에 이를 상속받아 필요한 추가 기능들을 구현해놓은 클래스들이 존재한다. 보편적으로는 데스크톱 프로그램을 제작할 때 메인 프레임은 QWidget을 상속받은 QMainWindow를 기본으로 사용하고, 실제 UI 컨텐츠를 표시하기 위해서 QWidget을 central widget으로 사용한다. 그리고 QDialog는 팝업창처럼 사용되며 이는 수락, 거부 등의 버튼과 잘 작동하도록 하는 기능이 존재한다. 또한 QWidget이 직접적인 기능을 제공 하지 않은 추가적인 예는 QWidget에 글꼴 속성이 존재하지만, 직접 사용하지 않고 QLabel, QPushButton, QTabWi..
2025.05.02
[QT] QApplication
QApplicationQApplication은 signal-slot을 작동시키는 이벤트 루프를 실행한다. 실행중인 이벤트 루프가 없으면 GUI 컴포넌트에서 발생하는 이벤트는 전혀 전파되지 않으므로 UI는 아무일도 하지 않게 된다. 해당 메인 이벤트 루프는 다음과 같은 것들을 처리한다:사용자 데스크톱 설정 초기화 (예: 폰트, 팔레트, 더블 클릭 간격) 이벤트 마우스, 키보드, 새로고침기존 창 시스템에서 이벤트를 수신하여 관련 위젯으로 전송하는 이벤트 처리sendEvent(), postEvent()를 사용하여 자체 이벤트를 위젯에 전달 가능커맨드 라인 매개변수 처리스타일 관리. QStyle 객체에 캡슐화되며 런타임에 setStyle()을 사용하여 변경 가능translate()를 통해 문자열 현지화clipb..
2025.05.02
QT
no image
[QT] CMake로 환경 설정
환경 설정기존에는 QT 설치 경로를 CMAKE_PREFIX_PATH에 설정한 뒤, find_pacakge를 사용했지만 QT6_ROOT라는 변수를 지정하는 방법도 가능하다고 한다,https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html 이를 살펴보면, find_package() 커맨드는 CMAKE_PREFIX_PATH도 참고하지만, _ROOT CMake 변수에 지정된 prefix도 검색한다. CMake 3.27 버전부터 추가됐다고 한다.크로스 컴파일하거나 vanila cmake를 사용할 때는 QT6_ROOT 또는 CMAKE_PREFIX_PATH 같은 검색 경로 대신 CMAKE_TOOLCHAIN_FILE을 설정 QT 소스 importing모던 C..
2025.04.30
QT
no image
[CMake] ExternalProject_Add() 사용 연습
ExternalProject_Add()를 사용해서 SPDLOG를 다운받고, 그 과정에서 오류 해결을 하는 과정을 기록한다. ExternalProject_Add()공식 문서에서 ExternalProject_Add()의 옵션에 대해 확인할 수 있다. ExternalProject_Add 커맨드는 외부 프로젝트의 download, update, patch, configure, build, install 그리고 test를 구동하는 커스텀 타겟을 생성한다.ExternalProject_Add( [...]) SPDLOG 다운 받기1.4.2 구버전을 다운 받으면, MSVC 2022와 호환이 안되서 컴파일 에러가 많이 터지는 것 같길래, 해당 버전 설치는 포기하였다. dependency.cmakeinclude(Exter..
2025.04.24
[CMake] .cmake 파일의 사용
.cmake 파일의 사용include 커맨드로 .cmake 파일을 include 할 수 있다. .cmake 파일은 함수 정의, 매크로를 포함할 수 있으며 여러 CMakeLists.txt에서 재사용할 수 있다. 사실은 모든 파일을 include 할 수 있지만, 일반적으로 확장자는 .cmake가 사용된다.// CMakeLists.txtcmake_minimum_required(VERSION 3.17)project(cmake-practice)set(CMAKE_CXX_STANDARD 17)add_executable( ${PROJECT_NAME} src/main.cpp)include(dependency.cmake)// dependency.cmakemessage("include dependency.cmake!..
2025.04.23
[OpenGL, SPDLOG] SPDLOG의 'formatting of non-void pointers is disallowed'
SPDLOG의 'formatting of non-void pointers is disallowed'발생한 에러 메시지: error C2338: static_assert failed: 'formatting of non-void pointers is disallowed' 에러 발생 코드SPDLOG_INFO 함수 호출을 통해 glVersion을 출력하는 과정에서 에러가 발생하였다.if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ SPDLOG_ERROR("failed to initialize glad"); glfwTerminate(); return -1;}auto glVersion = glGetString(GL_VERSION);SPDLOG_I..
2025.04.22
[CMake] target_link_directories(), target_link_libraries()
target_link_directories(), target_link_libraries()타겟을 링킹할 때 링커가 라이브러리를 검색할 경로를 지정한다. 즉, 외부라이브러리의 lib 파일 디렉토리를 지정할 때 사용된다. 각 항목은 절대 경로 또는 상대 경로일 수 있으며, 후자는 현재 소스 디렉토리에 대한 상대 경로로 해석된다. 주의할 점은 `target_link_directories()`만 단독으로 쓰는 것은 권장되지 않는 것 같다. 단독으로 사용하게 되면 링커가 타겟에 필요한 라이브러리를 알아서 찾도록 동작하기에 링크할 대상 파일이 무엇인지 명확하지 않다. 그래서 `target_link_libraries()`와 같이 사용하게 된다. 예시target_link_directories(${PROJECT_NAME..
2025.04.22
[CMake] target_include_directories
target_include_directories타겟을 컴파일 할 때 사용할 헤더 파일(include directories)을 찾기 위한 컴파일러의 검색 경로를 지정하는 커맨드이다. 즉, 빌드 대상 타겟이 헤더 파일을 찾기 위해 참조할 include 경로를 정의한다. 이를 통해 컴파일러가 `#include "파일명"` 또는 `#include ` 구문을 만났을 때, 어디를 탐색할 지 알 수 있다. include directories는 절대 경로와 상대 경로 모두 지정 가능하다. 상대 경로는 현재 소스 디렉토리를 기준(CMAKE_CURRENT_SOURCE_DIR)으로 해석되고, 연관된 타겟 프로퍼티에 저장되기 전에 절대 경로로 변환된다. 그리고 target_include_directories()의 파라미터는..
2025.04.22