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
如果系统具有 X 窗口系统的 OpenGL 扩展 (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::*
import 目标。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+ 功能的唯一方法,从而可以在各供应商中移植。项目可以使用目标 OpenGL::OpenGL
和 OpenGL::GLX
或 OpenGL::EGL
显式使用 GLVND。
项目可以使用 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
目标。理论上可以在 OpenGL::OpenGL
的位置使用 GLES* 库,但此模块目前不支持该操作;欢迎投稿。
OPENGL_egl_LIBRARY
和 OPENGL_EGL_INCLUDE_DIRS
在 GLVND 情况下进行了定义。对于非 GLVND Linux 和其他系统,它们保持未定义状态。
特定于 macOS¶
在 macOS 上,此模块默认使用OpenGL的 macOS 自有框架版本。要在 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()
构建此项目的最终用户可能需要用 -DOpenGL_ROOT=/opt/X11
指向他们的 X11 安装,例如,使用 CMake。