MLX42는 지정된 운영 체제의 기본 창 프레임워크를 직접 사용하지 않고도 그래픽 응용 프로그램을 만들 수 있는 성능이 뛰어나고 사용하기 쉬운 크로스 플랫폼, 최소 창 창 그래픽 라이브러리입니다.
창에 텍스처를 그릴 뿐만 아니라 창에 표시될 때 런타임에 텍스처를 수정하는 기본 도구도 제공합니다.
중요한
때로는 오랫동안 업데이트가 이루어지지 않은 것처럼 보일 수도 있습니다. 이는 예상된 현상이며 프로젝트/lib는 완료된 것으로 간주되며 최소한의 업데이트가 필요합니다. 버그 수정은 여전히 보장되며 프로젝트는 여전히 적극적으로 유지관리되고 있습니다.
MLX42에는 실제로 번거로움이 아닌 즐거움을 선사하는 다양한 기능이 포함되어 있습니다.
할머니의 WindowsXP, 삼촌의 데비안 또는 힙스터의 MacOS에서 실행해보세요! 플랫폼에 관계없이 MLX42가 이를 기반으로 구축할 수 있다면 기본 윈도우 시스템에서 실행됩니다.
이를 통해 어떤 컴퓨터에 있든 프로젝트 작업을 할 수 있습니다.
MLX42는 좋은 문서화에 관심을 갖고 있으며, 모든 기능, 사용법, 심지어 일부 내부 작업까지 문서화되어 있습니다! 더 이상 어떤 기능이 어떻게 작동하는지, 작동하는지 추측하거나 검색할 필요가 없습니다.
OpenGL을 기반으로 구축되었으며 배치 렌더링을 사용하여 다른 라이브러리에 비해 렌더링 프로세스 속도를 높입니다.
이 프로젝트는 Codam과 42 Network의 학생들이 적극적으로 유지 관리하고 있습니다. 이를 통해 학생들은 라이브러리 자체에 대해 더 많이 배우고 잠재적인 버그를 단순히 받아들이는 대신 수정할 수 있는 직접적인 기회를 얻을 수 있습니다.
MLX42는 Emscripten과의 호환성을 도입하여 MLX42가 WebAssembly를 통해 웹 브라우저에서 실행될 수 있도록 합니다. 이 수정은 @PepeLevi 덕분에 가능했으며 그의 포크와 기여에 대한 공로를 인정합니다.
이 프로젝트의 전반적인 구성은 모든 시스템에 대해 다음과 같습니다. CMake가 이해할 수 있는 한 말이죠.
시스템에 glfw가 설치되어 있지 않은 경우 cmake가 이를 감지하여 다운로드합니다. 그런 다음 glfw의 _deps
디렉터리에서 sudo make install
실행할 수 있습니다. 42 컴퓨터(MacOS, Linux)를 사용하는 경우 선호하는 시스템 관리자에게 설치를 요청하세요. CMake 또는 시스템에 필요할 수 있는 기타 종속 항목에도 마찬가지입니다.
그러나 둘 중 하나를 수행할 수 없는 경우에도 CMake는 여전히 GLFW를 가져와서 빌드할 수 있습니다. 그런 다음 _deps
폴더에서 정적으로 링크할 수 있습니다.
메모
Codam의 경우 Mac에는 GLFW가 이미 설치되어 있습니다.
메모
연결 단계에서 GLFW를 연결하는 플래그는 시스템에 따라 -lglfw3 또는 -lglfw일 수 있습니다.
라이브러리를 사용하여 프로그램을 컴파일하십시오.
이익!
라이브러리를 완전히 빌드하고 시스템에 설치하려면 다음 명령을 실행하십시오.
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
기본적으로 Windows에서는 설치된 lib를 C:Program Files (x86)mlx42
에 배치하고 MacOS/Linux의 경우 각각 /usr/local/lib
및 /usr/local/include
에 배치합니다.
MLX42에는 라이브러리의 무결성을 확인하기 위한 몇 가지 단위 테스트가 함께 제공됩니다. 이를 빌드하려면 다음 명령을 실행하세요.
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
그런 다음 다음을 사용하여 간단히 실행하십시오.
ctest --output-on-failure --test-dir build
git clone https://github.com/codam-coding-college/MLX42.git
cd MLX42
cmake -B build # build here refers to the outputfolder.
cmake --build build -j4 # or do make -C build -j4
출력 라이브러리 파일은 libmlx42.a
라고 하며 지정한 build
폴더에 있습니다.
cmake에 빌드 옵션을 전달할 수 있습니다(예: cmake -DDEBUG=1 -DGLFW_FETCH=0...
. 예를 들어 DEBUG 모드에서 빌드하거나 빌드 시 모든 종류의 동작을 변경할 수 있습니다.
여기 문서에서 예제 makefile을 찾을 수 있습니다.
시스템에 GLFW나 CMake가 없으면 Brew를 사용하여 누락된 종속성을 설치하는 것이 좋습니다.
42개 캠퍼스의 경우 다음을 사용할 수 있습니다: 42Homebrew
그렇지 않으면 홈브류를 사용하는 경우:
brew install glfw
brew install cmake
Apple Silicon(M1 칩 이상)을 사용하는 경우 Homebrew 설치 경로가 다르다는 점에 유의하세요. 쉘 구성 파일을 업데이트할 수 있습니다. Zsh 사용자의 경우(최신 macOS 버전의 기본 셸):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
변경 사항을 적용하려면 셸 세션을 다시 시작하거나 터미널을 다시 시작하세요.
MacOS의 경우 프로그램을 올바른 프레임워크와 연결하려면 다음 플래그를 사용하여 프로그램을 라이브러리로 컴파일해야 합니다.
-framework Cocoa -framework OpenGL -framework IOKit
일반적으로 소스에서 glfw
간단히 설치/빌드했거나 이미 설치한 경우 컴파일은 다음과 같아야 합니다.
gcc main.c ... libmlx42.a -Iinclude -lglfw
# Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /opt/homebrew/Cellar/glfw/3.3.8/lib/ "
# 42Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /Users/ $( USER ) /.brew/opt/glfw/lib/ "
MacOS에서 프로그램을 실행하면 불평이 나올 수 있습니다. 왜냐하면 Mac에서는 다르게 생각해야 하기 때문입니다. 보안 경고가 표시되거나 MacOS에서 작성자/개발자를 확인할 수 없다는 메시지가 표시되는 경우 Settings > Security & Privacy
로 이동하세요.
하단에 애플리케이션이 실행을 시도했다는 팝업이 표시되면 옵션을 클릭하여 실행되도록 하세요.
(Ubuntu, Mint, Pop OS...) 같은 Debian의 경우:
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
Arch-linux(Manjaro, Endeavour, Garuda)의 경우:
sudo pacman -S glfw-x11
또는 (sway/wlroots 합성기 또는 기타 wayland 합성기를 사용하는 경우)
sudo pacman -S glfw-wayland
MLX42 다운로드 및 빌드
라이브러리를 사용하여 프로그램을 컴파일하십시오.
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
중요한
이 모든 단계를 시작하기 전에 다음 내용을 읽어보세요.
.zshrc
또는 .bashrc
에서 다음 변수를 설정하세요. export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(DISPLAY 내보내기 명령이 실패하는 경우 대안은 이 StackOverflow 게시물을 참조하세요.)
확장 구성(XMing은 적합하지 않음)으로 XServer 애플리케이션을 다운로드하고 설치합니다. VcXsrv 작동: https://sourceforge.net/projects/vcxsrv/
Windows Defender 방화벽을 열고 다음 단계를 따르세요.
Native opengl
옵션Disable access control
중요한
이를 위해서는 Visual Studio(2022)가 필요합니다. Windows에서 개발하는 것은 다소 실망스러울 수 있습니다.
이 작업을 최대한 쉽게 수행하려면 WSL2를 사용하는 것이 좋습니다. 그러나 기본적으로 Windows용 빌드를 고집하는 경우 종속성 측면에서 필요한 것은 다음과 같습니다.
모든 종속성이 올바르게 설치되면 CMake
Visual Studio 프로젝트 파일을 생성합니다. 간단히 빌드하고 .lib
파일이 있으면 다른 라이브러리와 마찬가지로 실제 프로젝트로 이동하고 설치하세요.
혹시 이 작업을 수행하는 방법을 보여주는 비디오가 있습니다. 편리하게도 이 비디오에서는 glfw
연결하는 방법도 다루고 있습니다.
물론 당신이 작성한 코드가 이식 가능한지 확인하는 것은 당신에게 달려 있습니다. Unix
에 존재하는 것이 반드시 Win32
에 존재하는 것은 아닙니다.
// -----------------------------------------------------------------------------
// Codam Coding College, Amsterdam @ 2022-2023 by W2Wizard.
// See README in the root project for more information.
// -----------------------------------------------------------------------------
#include
#include
#include
#include
#define WIDTH 512
#define HEIGHT 512
static mlx_image_t * image ;
// -----------------------------------------------------------------------------
int32_t ft_pixel ( int32_t r , int32_t g , int32_t b , int32_t a )
{
return ( r << 24 | g << 16 | b << 8 | a );
}
void ft_randomize ( void * param )
{
( void ) param ;
for ( uint32_t i = 0 ; i < image -> width ; ++ i )
{
for ( uint32_t y = 0 ; y < image -> height ; ++ y )
{
uint32_t color = ft_pixel (
rand () % 0xFF , // R
rand () % 0xFF , // G
rand () % 0xFF , // B
rand () % 0xFF // A
);
mlx_put_pixel ( image , i , y , color );
}
}
}
void ft_hook ( void * param )
{
mlx_t * mlx = param ;
if ( mlx_is_key_down ( mlx , MLX_KEY_ESCAPE ))
mlx_close_window ( mlx );
if ( mlx_is_key_down ( mlx , MLX_KEY_UP ))
image -> instances [ 0 ]. y -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_DOWN ))
image -> instances [ 0 ]. y += 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_LEFT ))
image -> instances [ 0 ]. x -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_RIGHT ))
image -> instances [ 0 ]. x += 5 ;
}
// -----------------------------------------------------------------------------
int32_t main ( void )
{
mlx_t * mlx ;
// Gotta error check this stuff
if (!( mlx = mlx_init ( WIDTH , HEIGHT , "MLX42" , true)))
{
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if (!( image = mlx_new_image ( mlx , 128 , 128 )))
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if ( mlx_image_to_window ( mlx , image , 0 , 0 ) == -1 )
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
mlx_loop_hook ( mlx , ft_randomize , mlx );
mlx_loop_hook ( mlx , ft_hook , mlx );
mlx_loop ( mlx );
mlx_terminate ( mlx );
return ( EXIT_SUCCESS );
}