C
語言的 OpenGL 數學 (glm) 高度最佳化的 2D|3D 數學函式庫,也稱為「C」的 OpenGL 數學 (glm) 。 cglm提供了很多 utils 來幫助數學運算快速且快速地編寫。它是社區友好的,請隨意提出您遇到的任何問題、錯誤。
幾乎所有函數(內聯版本)和參數都記錄在對應的標頭中。
完整文檔:http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copy
CGLM_FORCE_DEPTH_ZERO_TO_ONE
和CGLM_FORCE_LEFT_HANDED
來控制剪輯空間。現在您應該能夠將cglm與 Vulkan、DirectX 和 Metal 一起使用...請參閱 https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s 如果您還不知道原始的 GLM 庫,您可能還想看看:https://github.com/g-truc/glm
vec4
和mat4
變數必須對齊。 (後續會有未對齊的版本) cglm
不在堆上分配任何記憶體。所以它不提供任何分配器。如果您傳遞記憶體位置的指針,您也應該為輸出參數分配記憶體。不要忘記vec4 (也稱為 quat/ versor )和mat4必須對齊(16 位元組),因為cglm使用 SIMD 指令來優化大多數操作(如果可用)。
cglm支援ARRAY API和STRUCT API ,因此如果您使用 struct api ( glms_
),則可以傳回結構。
與其他一些圖形庫(尤其是 OpenGL)一樣,該庫使用列主佈局將矩陣保留在記憶體中。 將來,該庫可能支援使用行優先佈局的選項,目前如果您需要行優先佈局,則需要轉置它。 |
您有兩個選項來呼叫函數/操作:內聯或函式庫呼叫(連結) 幾乎所有函數都標記為內聯(always_inline),因此編譯器可能會內聯。要呼叫預編譯版本,只需使用glmc_
(c 代表“call”)而不是glm_
。
#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_mul 來取代 glm_mat4_mul 和 glm_inv_tr (ROT + TR) 來取代 glm_mat4_inv
/* 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 );
結構函數通常將其參數作為值並傳回其結果,而不是採用指標並寫入輸出參數。這意味著如果您願意的話,您的參數通常可以是const
。
使用的類型實際上是允許以多種方式存取相同資料的聯合。其中一種方法涉及匿名結構,自 C11 起可用。如果您啟用-fms-extensions
MSVC 還支援開箱即用的早期 C 版本,而 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"
-msimd128
添加到CMAKE_C_FLAGS
。
對於測試,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 文件,以便您可以使用pkg-config --cflags cglm
和pkg-config --libs cglm
來檢索編譯器和連結器標誌。
這些檔案將安裝到給定的前綴(通常在 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 是浮點數數組。 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 );
您可以以相同的方式將矩陣傳遞給其他 API,例如 Vulkan、DX...
待辦事項:
glm_umat4_mul
) 這個項目的存在要感謝所有做出貢獻的人。 [貢獻]。
感謝我們所有的支持者! [成為支持者]
成為贊助商來支持該計畫。您的徽標將顯示在此處,並帶有指向您網站的連結。 [成為贊助商]
麻省理工學院。檢查許可證文件