FindOpenGL¶
尋找 OpenGL 和 OpenGL 實用程式庫 (GLU) 的 FindModule。
變更於版本 3.2:在 Unix/Linux 系統上,不再將 X11 作為依賴項加入。
新增於版本 3.10:在 Linux 上支援 GLVND。請參閱下方的Linux 專用章節。
可選的 COMPONENTS¶
新增於版本 3.10。
此模組支援數個可選的 COMPONENTS
EGL
OpenGL、OpenGL ES 和底層視窗系統之間的 EGL 介面。
GLX
將 OpenGL、OpenGL ES 與 X 視窗系統介接的 X 擴充。
OpenGL
用於 3D 圖形的跨平台 API。
GLES2
新增於版本 3.27。
適用於功能有限的嵌入式系統的 OpenGL API 子集。
GLES3
新增於版本 3.27。
適用於功能較強的嵌入式系統的 OpenGL API 子集。
匯入的目標¶
新增於版本 3.8。
此模組定義了 IMPORTED
目標
OpenGL::GL
如果系統有 OpenGL,則定義為平台特定的 OpenGL 程式庫。
OpenGL::GLU
如果系統有 OpenGL 實用程式庫 (GLU),則進行定義。
新增於版本 3.10:此外,還定義了下列 GLVND 特有的程式庫目標
OpenGL::OpenGL
如果系統是基於 GLVND 的系統,則定義為 libOpenGL。
OpenGL::GLX
如果系統有 OpenGL 到 X 視窗系統的擴充 (GLX),則進行定義。
OpenGL::EGL
如果系統有 EGL,則進行定義。
OpenGL::GLES2
新增於版本 3.27。
如果系統有 GLES2,則進行定義。
OpenGL::GLES3
新增於版本 3.27。
如果系統有 GLES3,則進行定義。
結果變數¶
此模組設定下列變數
OPENGL_FOUND
如果系統有 OpenGL 且找到所有組件,則為 True。
OPENGL_XMESA_FOUND
如果系統有 XMESA,則為 True。
OPENGL_GLU_FOUND
如果系統有 GLU,則為 True。
OpenGL_OpenGL_FOUND
如果系統有 OpenGL 程式庫,則為 True。
OpenGL_GLX_FOUND
如果系統有 GLX,則為 True。
OpenGL_EGL_FOUND
如果系統有 EGL,則為 True。
OpenGL::GLES2
如果系統有 GLES2,則進行定義。
OpenGL::GLES3
如果系統有 GLES3,則進行定義。
OPENGL_INCLUDE_DIR
OpenGL include 目錄的路徑。建議使用
OPENGL_INCLUDE_DIRS
變數。OPENGL_EGL_INCLUDE_DIRS
EGL include 目錄的路徑。
OPENGL_LIBRARIES
OpenGL 程式庫、視窗系統程式庫和 GLU 程式庫的路徑。在 Linux 上,這假設為 GLX,且對於基於 EGL 的目標而言永遠不正確。建議客戶端改用
OpenGL::*
匯入目標。OPENGL_INCLUDE_DIRS
新增於版本 3.29。
OpenGL include 目錄的路徑。
新增於版本 3.10:用於 GLVND 特有程式庫 OpenGL
、EGL
和 GLX
的變數。
快取變數¶
也可以設定下列快取變數
OPENGL_egl_LIBRARY
EGL 程式庫的路徑。
OPENGL_glu_LIBRARY
GLU 程式庫的路徑。
OPENGL_glx_LIBRARY
GLVND 'GLX' 程式庫的路徑。
OPENGL_opengl_LIBRARY
GLVND 'OpenGL' 程式庫的路徑
OPENGL_gl_LIBRARY
OpenGL 程式庫的路徑。新程式碼應該優先使用
OpenGL::*
匯入目標。OPENGL_gles2_LIBRARY
新增於版本 3.27。
OpenGL GLES2 程式庫的路徑。
OPENGL_gles3_LIBRARY
新增於版本 3.27。
OpenGL GLES3 程式庫的路徑。
OPENGL_GLU_INCLUDE_DIR
新增於版本 3.29。
OpenGL GLU include 目錄的路徑。
新增於版本 3.10:用於 GLVND 特有程式庫 OpenGL
、EGL
和 GLX
的變數。
Linux 專用¶
某些 Linux 系統利用 GLVND 作為 OpenGL 的新 ABI。GLVND 將內容程式庫與 OpenGL 本身分開;OpenGL 位於「libOpenGL」中,而內容則定義於「libGLX」或「libEGL」中。GLVND 目前是透過 EGL 以可在供應商之間移植的方式取得 OpenGL 3+ 功能的唯一方法。專案可以明確使用 GLVND 以及目標 OpenGL::OpenGL
和 OpenGL::GLX
或 OpenGL::EGL
。
專案可以使用 OpenGL::GL
目標(或 OPENGL_LIBRARIES
變數)來使用舊版 GL 介面。這些會使用 OPENGL_gl_LIBRARY
所定位的舊版 GL 程式庫(如果可用)。如果 OPENGL_gl_LIBRARY
為空或找不到,且 GLVND 可用,則 OpenGL::GL
目標會使用 GLVND OpenGL::OpenGL
和 OpenGL::GLX
(且 OPENGL_LIBRARIES
變數會使用對應的程式庫)。因此,對於非基於 EGL 的 Linux 目標,OpenGL::GL
目標是最可移植的。
可以設定 OpenGL_GL_PREFERENCE
變數,以在有多個選項可用的情況下,指定提供舊版 GL 介面的慣用方式。該值可以是以下其中之一
GLVND
如果 GLVND OpenGL 和 GLX 程式庫可用,則優先使用它們。這會強制
OPENGL_gl_LIBRARY
為空。變更於版本 3.11:除非原則
CMP0072
設定為OLD
且未要求任何組件(因為組件對應於 GLVND 程式庫),否則這是預設值。LEGACY
優先使用舊版 libGL 程式庫(如果可用)。
對於 EGL 目標,客戶端必須依賴使用者系統上的 GLVND 支援。連結應該使用 OpenGL::OpenGL OpenGL::EGL
目標。理論上,可以使用 GLES* 程式庫來取代 OpenGL::OpenGL
,但此模組目前不支援該用法;歡迎提供貢獻。
在 GLVND 的情況下會定義 OPENGL_egl_LIBRARY
和 OPENGL_EGL_INCLUDE_DIRS
。對於非 GLVND Linux 和其他系統,這些將保持未定義。
macOS 專用¶
在 macOS 上,此模組預設使用 macOS 原生的 OpenGL framework 版本。若要使用 macOS 上的 X11 版本 OpenGL,可以停用 framework 的搜尋。例如
find_package(X11)
if(APPLE AND X11_FOUND)
set(CMAKE_FIND_FRAMEWORK NEVER)
find_package(OpenGL)
unset(CMAKE_FIND_FRAMEWORK)
else()
find_package(OpenGL)
endif()
建置此專案的終端使用者可能需要使用 -DOpenGL_ROOT=/opt/X11
將 CMake 指向其 X11 安裝。