FindOpenGL

用于 OpenGL 和 OpenGL 实用程序库 (GLU) 的 FindModule。

在 3.2 版本中更改: 在 Unix/Linux 系统上不再添加 X11 作为依赖项。

在 3.10 版本中添加: 在 Linux 上支持 GLVND。请参阅下面的 Linux-specific 部分。

可选 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 实用程序库 (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 包含目录的路径。首选 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+ 功能的唯一方法。项目可以显式使用 GLVND,目标为 OpenGL::OpenGL 以及 OpenGL::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,但此模块目前不支持;欢迎贡献。

OPENGL_egl_LIBRARYOPENGL_EGL_INCLUDE_DIRS 在 GLVND 的情况下定义。对于非 GLVND Linux 和其他系统,这些未定义。

macOS 特定的

在 macOS 上,此模块默认使用 OpenGL 的 macOS 原生框架版本。要在 macOS 上使用 OpenGL 的 X11 版本,可以禁用框架搜索。例如

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