FindOpenGL

用於尋找 OpenGL 和 OpenGL Utility Library (GLU) 的 FindModule。

在 3.2 版本變更: 在 Unix/Linux 系統上不再加入 X11 作為依賴項。

在 3.10 版本加入: Linux 上的 GLVND 支援。請參閱下方的 Linux 專用 章節。

選用 COMPONENTS

在 3.10 版本加入。

此模組支援數個選用 COMPONENTS

EGL

OpenGL、OpenGL ES 和底層視窗系統之間的 EGL 介面。

GLX

X 的擴充功能,可將 OpenGL、OpenGL ES 與 X 視窗系統連接。

OpenGL

用於 3D 圖形的跨平台 API。

GLES2

在 3.27 版本加入。

適用於功能受限的嵌入式系統的 OpenGL API 子集。

GLES3

在 3.27 版本加入。

適用於功能較強的嵌入式系統的 OpenGL API 子集。

匯入目標

在 3.8 版本加入。

此模組定義了 IMPORTED 目標

OpenGL::GL

如果系統有 OpenGL,則定義為平台特定的 OpenGL 程式庫。

OpenGL::GLU

如果系統有 OpenGL Utility Library (GLU),則定義此項。

在 3.10 版本加入: 此外,還定義了以下 GLVND 特定的程式庫目標

OpenGL::OpenGL

如果系統是基於 GLVND 的,則定義為 libOpenGL。

OpenGL::GLX

如果系統具有 OpenGL Extension to the X Window System (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 包含目錄的路徑。建議使用 OPENGL_INCLUDE_DIRS 變數。

OPENGL_EGL_INCLUDE_DIRS

EGL 包含目錄的路徑。

OPENGL_LIBRARIES

OpenGL 程式庫、視窗系統程式庫和 GLU 程式庫的路徑。在 Linux 上,這假設為 GLX,並且對於基於 EGL 的目標永遠不正確。建議客戶端改用 OpenGL::* 匯入目標。

OPENGL_INCLUDE_DIRS

在 3.29 版本加入。

OpenGL 包含目錄的路徑。

在 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 包含目錄的路徑。

在 3.10 版本加入: 用於 GLVND 特定程式庫 OpenGLEGLGLX 的變數。

Linux 專用

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

專案可以使用 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,但此模組目前不支援;歡迎貢獻。

OPENGL_egl_LIBRARYOPENGL_EGL_INCLUDE_DIRS 在 GLVND 的情況下定義。對於非 GLVND Linux 和其他系統,這些保持未定義狀態。

macOS 專用

在 macOS 上,此模組預設為使用 macOS 原生框架版本的 OpenGL。若要在 macOS 上使用 X11 版本的 OpenGL,可以停用框架搜尋。例如

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()

建置此專案的最終使用者可能需要將 CMake 指向他們的 X11 安裝,例如,使用 -DOpenGL_ROOT=/opt/X11