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 特有程式庫 OpenGLEGLGLX 的變數。

快取變數

也可以設定下列快取變數

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 特有程式庫 OpenGLEGLGLX 的變數。

Linux 專用

某些 Linux 系統利用 GLVND 作為 OpenGL 的新 ABI。GLVND 將內容程式庫與 OpenGL 本身分開;OpenGL 位於「libOpenGL」中,而內容則定義於「libGLX」或「libEGL」中。GLVND 目前是透過 EGL 以可在供應商之間移植的方式取得 OpenGL 3+ 功能的唯一方法。專案可以明確使用 GLVND 以及目標 OpenGL::OpenGLOpenGL::GLXOpenGL::EGL

專案可以使用 OpenGL::GL 目標(或 OPENGL_LIBRARIES 變數)來使用舊版 GL 介面。這些會使用 OPENGL_gl_LIBRARY 所定位的舊版 GL 程式庫(如果可用)。如果 OPENGL_gl_LIBRARY 為空或找不到,且 GLVND 可用,則 OpenGL::GL 目標會使用 GLVND OpenGL::OpenGLOpenGL::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_LIBRARYOPENGL_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 安裝。