FindOpenGL¶
用于 OpenGL 和 OpenGL 实用库 (GLU) 的 FindModule。
3.2 版本更改:在 Unix/Linux 系统上,X11 不再被添加为依赖项。
3.10 版本新增:Linux 上的 GLVND 支持。请参阅下面的 Linux 特定 部分。
可选组件¶
3.10 版本新增。
此模块支持多个可选组件
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 特定库 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 头文件目录的路径。
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。要在 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
。