C
용 OpenGL 수학(glm) 'C'의 경우 OpenGL Mathematics(glm) 라고도 알려진 고도로 최적화된 2D|3D 수학 라이브러리입니다. cglm은 수학 연산을 빠르고 빠르게 작성하는 데 도움이 되는 많은 유틸리티를 제공합니다. 커뮤니티 친화적이므로 직면한 문제나 버그를 언제든지 가져오세요.
거의 모든 기능(인라인 버전)과 매개변수는 해당 헤더 내에 문서화되어 있습니다.
전체 문서: http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copy
CGLM_FORCE_DEPTH_ZERO_TO_ONE
및 CGLM_FORCE_LEFT_HANDED
와 같은 대체 클립 공간 구성을 지원하여 클립 공간을 제어합니다. 이제 Vulkan, DirectX 및 Metal과 함께 cglm을 사용할 수 있습니다... https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s를 참조하세요. 원본 GLM 라이브러리를 아직 모르는 경우 https://github.com/g-truc/glm을 살펴보는 것도 좋습니다.
vec4
및 mat4
변수는 정렬되어야 합니다. (나중에 정렬되지 않은 버전이 있을 예정입니다) cglm
힙에 메모리를 할당하지 않습니다. 따라서 할당자를 제공하지 않습니다. 메모리 위치 포인터를 전달하는 경우 out 매개변수에도 메모리를 할당해야 합니다. cglm은 가능한 경우 대부분의 작업을 최적화하기 위해 SIMD 명령을 사용하기 때문에 vec4 (quat/ versor 라고도 함)와 mat4가 정렬되어야 함(16바이트)을 잊지 마십시오.
cglm은 ARRAY API 와 STRUCT API를 모두 지원하므로 struct api( glms_
)를 활용하면 구조체를 반환할 수 있습니다.
다른 그래픽 라이브러리(특히 OpenGL)와 마찬가지로 이 라이브러리는 메모리에 행렬을 유지하기 위해 Column-Major 레이아웃을 사용합니다. 앞으로 라이브러리는 행 주요 레이아웃을 사용하는 옵션을 지원할 수도 있습니다. 현재 행 주요 레이아웃이 필요한 경우 이를 전치해야 합니다. |
함수/작업을 호출하는 데는 두 가지 옵션이 있습니다: 인라인 또는 라이브러리 호출(링크) 거의 모든 함수는 인라인(always_inline)으로 표시되므로 컴파일러는 아마도 인라인일 것입니다. 미리 컴파일된 버전을 호출하려면 glm_
대신 glmc_
(c는 'call'을 나타냄)를 사용하세요.
#include /* for inline */
#include /* for library call (this also includes cglm.h) */
mat4 rot , trans , rt ;
/* ... */
glm_mul ( trans , rot , rt ); /* inline */
glmc_mul ( trans , rot , rt ); /* call from library */
가능한 경우 대부분의 수학 함수는 SSE2를 사용하여 수동으로 최적화됩니다. 그렇지 않은 경우에는 어떻게 될까요? 모든 작업에는 SSE가 아닌 버전이 있으므로 걱정하지 마세요.
주소를 가져오는 대신 행렬과 벡터를 배열로 함수에 전달할 수 있습니다.
mat4 m = {
1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 ,
0 , 0 , 1 , 0 ,
0 , 0 , 0 , 1
};
glm_translate ( m , ( vec3 ){ 1.0f , 0.0f , 0.0f });
라이브러리에는 범용 mat4 mul 및 역함수와 아핀 변환 행렬에 대한 이러한 함수의 일부 특수 형태(최적화된)가 포함되어 있습니다. 두 개의 아핀 변환 행렬을 곱하려면 glm_mat4_mul 대신 glm_mul을 사용하고 glm_mat4_inv 대신 glm_inv_tr(ROT + TR)을 사용할 수 있습니다.
/* multiplication */
mat4 modelMat ;
glm_mul ( T , R , modelMat );
/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr ( modelMat );
struct API는 다음과 같이 작동합니다. 유형의 접미사 s
, 함수의 glms_
접두사, 상수의 GLMS_
접두사에 유의하세요.
#include
mat4s mat = GLMS_MAT4_IDENTITY_INIT ;
mat4s inv = glms_mat4_inv ( mat );
구조체 함수는 일반적으로 포인터를 가져와 out 매개변수에 쓰는 대신 매개변수를 값 으로 사용하고 결과를 반환합니다 . 이는 당신이 그것에 관심이 있다면 일반적으로 매개변수가 const
일 수 있다는 것을 의미합니다.
사용된 유형은 실제로 동일한 데이터에 여러 방법으로 액세스할 수 있는 공용체입니다. 이러한 방법 중 하나는 C11부터 사용 가능한 익명 구조와 관련됩니다. MSVC는 또한 기본적으로 이전 C 버전에 대해 이를 지원하며 -fms-extensions
활성화하면 GCC/Clang이 이를 지원합니다. 이러한 익명 구조를 명시적으로 활성화하려면 #define CGLM_USE_ANONYMOUS_STRUCT
1
로, 비활성화하려면 0
으로 설정하세요. 이전 버전과의 호환성을 위해 #define CGLM_NO_ANONYMOUS_STRUCT
(값은 관련 없음)를 비활성화할 수도 있습니다. 명시적으로 지정하지 않으면 cglm은 사용 중인 컴파일러와 C 버전을 기반으로 최선의 추측을 수행합니다.
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
option (CGLM_SHARED "Shared build" ON )
option (CGLM_STATIC "Static build" OFF )
option (CGLM_USE_C99 "" OFF ) # C11
option (CGLM_USE_TEST "Enable Tests" OFF ) # for make check - make test
이를 위해서는 cglm을 구축하거나 설치할 필요가 없습니다.
cmake_minimum_required ( VERSION 3.8.2)
project (Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory (external/cglm/ EXCLUDE_FROM_ALL )
cmake_minimum_required ( VERSION 3.8.2)
project (Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory (external/cglm/)
# or you can use find_package to configure cglm
sinf
와 같은 수학 함수를 사용하므로 wasm32-unknown-unknown
대상으로 할 수 없으므로 wasi-sdk 또는 emscripten 중 하나를 사용해야 합니다.
WebAssembly에서는 공유 빌드가 아직 지원되지 않습니다.
simd128 지원을 위해서는 명령줄 -DCMAKE_C_FLAGS="-msimd128"
에서 CMAKE_C_FLAGS
에 -msimd128
추가하세요.
테스트의 경우 cmake 옵션 CGLM_USE_TEST
가 계속 작동하며 테스트를 실행하려면 wasi 런타임이 필요합니다. 자세한 예는 ci 구성 파일을 참조하세요.
$ cmake ..
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
여기서 /path/to/wasi-sdk-19.0/
추출된 wasi SDK의 경로입니다.
이 경우 기본적으로 정적 빌드를 만듭니다.
$ emcmake cmake ..
-DCMAKE_EXE_LINKER_FLAGS= " -s STANDALONE_WASM "
-DCGLM_STATIC=ON
여기서 emcmake
설치된 emsdk의 Emscripten용 cmake 래퍼입니다.
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
c_std = c11
buildtype = release
default_library = shared
build_tests = true # to run tests: ninja test
# Clone cglm or create a cglm.wrap under /subprojects
project ( ' name ' , ' c ' )
cglm_dep = dependency ( ' cglm ' , fallback : ' cglm ' , ' cglm_dep ' )
executable ( ' exe ' , ' src/main.c ' , dependencies : cglm_dep)
현재는 기본 빌드 옵션만 지원됩니다. 프로젝트에 cglm 종속성을 추가합니다.
...
Package (
...
dependencies : [
...
. package ( url : " https://github.com/recp/cglm " , . branch ( " master " ) ) ,
]
...
)
이제 대상에 대한 종속성으로 cgml을 추가하십시오. 제품 선택은 다음과 같습니다.
...
. target (
...
dependencies : [
...
. product ( name : " cglm " , package : " cglm " ) ,
]
...
)
...
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
그러면 pkg-config --cflags cglm
및 pkg-config --libs cglm
사용하여 컴파일러 및 링커 플래그를 검색할 수 있도록 pkg-config 파일도 설치됩니다.
파일은 지정된 접두사(일반적으로 Linux에서는 기본적으로 /usr/local
)에 설치되지만 pkg-config는 실제로 해당 접두사를 확인하도록 구성되지 않을 수 있습니다. pkg-config --variable pc_path pkg-config
실행하여 찾고 있는 위치를 파악하고 ./configure --with-pkgconfigdir=/your/path
통해 파일이 설치된 경로를 변경할 수 있습니다. 또는 PKG_CONFIG_PATH
환경 변수에 접두사 경로를 추가할 수 있습니다.
Windows 관련 빌드 파일과 프로젝트 파일은 win
폴더에 있습니다. cglm/win
폴더 안에 있는지 확인하세요. 코드 분석이 활성화되어 있으므로 빌드하는 데 시간이 걸릴 수 있습니다.
$ cd win
$ . build.bat
msbuild
작동하지 않으면(다중 버전 VS로 인해) devenv
로 빌드해 보세요.
$ devenv cglm.sln / Build Release
동일한 Visual Studio 솔루션 파일에서 테스트 프로젝트를 볼 수 있습니다. 테스트를 실행하려면 해당 프로젝트를 실행하는 것으로 충분합니다.
먼저 Sphinx를 설치해야 합니다: http://www.sphinx-doc.org/en/master/usage/installation.html 그런 다음:
$ cd docs
$ sphinx-build source build
문서를 빌드 폴더로 컴파일하면 해당 함수 내에서 index.html을 실행할 수 있습니다.
인라인 버전의 함수를 사용하려면 기본 헤더를 포함하십시오.
#include
헤더에는 모든 헤더가 포함됩니다. 그런 다음 원하는 기능을 호출합니다(예: 축별 벡터 회전).
glm_vec3_rotate ( v1 , glm_rad ( 45 ), ( vec3 ){ 1.0f , 0.0f , 0.0f });
일부 기능은 오버로드됩니다 :) 예를 들어 벡터를 정규화할 수 있습니다.
glm_vec3_normalize ( vec );
이는 vec를 정규화하고 정규화된 벡터를 vec
에 저장하지만 정규화된 벡터를 다른 벡터에 저장하려면 다음을 수행하십시오.
glm_vec3_normalize_to ( vec , result );
이 함수처럼 _to
postfix를 볼 수 있습니다. 이 함수는 결과를 다른 변수에 저장하고 임시 메모리를 저장합니다.
미리 컴파일된 버전을 호출하려면 c
접미사가 있는 헤더가 포함되어 있어야 합니다. c는 호출을 의미합니다. 미리 컴파일된 버전은 단지 래퍼일 뿐입니다.
#include
이 헤더에는 c 접미사가 있는 모든 헤더가 포함됩니다. c posfix를 사용하여 함수를 호출해야 합니다.
glmc_vec3_normalize ( vec );
함수 사용법과 매개변수는 관련 헤더 내에 문서화되어 있습니다. 다음과 같은 일부 예에서는 동일한 매개변수가 두 번 전달되는 것을 볼 수 있습니다.
glm_mat4_mul ( m1 , m2 , m1 );
/* or */
glm_mat4_mul ( m1 , m1 , m1 );
처음 두 매개변수는 [in] 이고 마지막 매개변수는 [out] 매개변수입니다. m1 과 m2를 곱한 후 결과는 m1 에 저장됩니다. 이것이 우리가 m1을 두 번 보내는 이유입니다. 결과를 다른 행렬에 저장할 수 있습니다. 이는 단지 예일 뿐입니다.
mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mul ( proj , view , viewProj );
glm_mat4_mul ( viewProj , model , mvp );
mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mulN (( mat4 * []){ & proj , & view , & model }, 3 , mvp );
mat4는 vec4의 배열이고 vec4는 float의 배열입니다. glUniformMatrix4fv
함수는 float*
value
(마지막 매개변수)으로 허용하므로 mat4를 float*로 캐스팅하거나 행렬의 첫 번째 열을 행렬 메모리의 시작 부분으로 전달할 수 있습니다.
옵션 1: 첫 번째 열 보내기
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ]);
/* array of matrices */
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ][ 0 ]);
옵션 2: 행렬을 포인터 유형으로 변환(다차원 배열에도 유효함)
glUniformMatrix4fv ( location , 1 , GL_FALSE , ( float * ) matrix );
Vulkan, DX 등의 다른 API에 동일한 방식으로 행렬을 전달할 수 있습니다.
할 일:
glm_umat4_mul
) 이 프로젝트는 기여하는 모든 사람들 덕분에 존재합니다. [기여하다].
모든 후원자분들께 감사드립니다! [후원자가 되세요]
후원자가 되어 이 프로젝트를 지원하세요. 귀하의 로고가 귀하의 웹사이트 링크와 함께 여기에 표시됩니다. [후원자가 되세요]
MIT. LICENSE 파일을 확인하세요