FindOpenGL¶
查找 OpenGL 和 OpenGL 实用库 (GLU),用于在 CMake 项目中使用 OpenGL
find_package(OpenGL [COMPONENTS <components>...] [...])
OpenGL (Open Graphics Library) 是一个用于渲染 2D 和 3D 图形的跨平台 API。它广泛用于 CAD、游戏和可视化软件。
GL 指的是核心 OpenGL 库,它提供了基本的图形渲染 API。
GLU (OpenGL Utility Library) 是一个伴随库,它在 OpenGL 之上提供了实用函数,例如镶嵌和更复杂的形状绘制。
版本 3.2 中已更改: 在 Unix/Linux 系统上,X11 不再被添加为依赖项。
版本 3.10 中已添加: Linux 上的 GLVND (GL Vendor-Neutral Dispatch 库) 支持。请参阅下面的 Linux 特定 部分。
组件¶
此模块支持可选组件,可以使用 find_package() 命令指定
find_package(OpenGL [COMPONENTS <components>...])
支持的组件包括
EGL3.10 版本新增。
OpenGL、OpenGL ES 和底层窗口系统之间的 EGL 接口。
GLX3.10 版本新增。
X 的一个扩展,它连接 OpenGL、OpenGL ES 与 X 窗口系统。
OpenGL3.10 版本新增。
3D 图形的跨平台 API。
GLES2在 3.27 版本中新增。
OpenGL API 的一个子集,用于功能受限的嵌入式系统。
GLES3在 3.27 版本中新增。
OpenGL API 的一个子集,用于功能更强大的嵌入式系统。
导入的目标¶
此模块提供以下 导入目标
OpenGL::GL版本 3.8 新增。
封装了平台特定 OpenGL 库使用要求的目标,如果找到 OpenGL 则可用。
OpenGL::GLU版本 3.8 新增。
封装了 OpenGL 实用库 (GLU) 使用要求的目标,如果找到 GLU 则可用。
此外,还提供了以下 GLVND 特定库导入目标
OpenGL::OpenGL3.10 版本新增。
封装 libOpenGL 使用要求的目标,如果系统基于 GLVND 且找到 OpenGL 则可用。
OpenGL::GLX3.10 版本新增。
封装 OpenGL 扩展到 X Window System (GLX) 的使用要求的目标,如果找到 OpenGL 和 GLX 则可用。
OpenGL::EGL3.10 版本新增。
封装 EGL 使用要求的目标,如果找到 OpenGL 和 EGL 则可用。
OpenGL::GLES2在 3.27 版本中新增。
封装 GLES2 使用要求的目标,如果找到 OpenGL 和 GLES2 则可用。
OpenGL::GLES3在 3.27 版本中新增。
封装 GLES3 使用要求的目标,如果找到 OpenGL 和 GLES3 则可用。
结果变量¶
此模块定义了以下变量
OpenGL_FOUND3.3 版本中新增。
布尔值,指示是否找到了 OpenGL 和所有请求的组件。
OPENGL_XMESA_FOUND布尔值,指示是否找到了 OpenGL XMESA。
OPENGL_GLU_FOUND布尔值,指示是否找到了 GLU。
OpenGL_OpenGL_FOUND3.10 版本新增。
布尔值,指示是否找到了 GLVND OpenGL 库。
OpenGL_GLX_FOUND3.10 版本新增。
布尔值,指示是否找到了 GLVND GLX。
OpenGL_EGL_FOUND3.10 版本新增。
布尔值,指示是否找到了 GLVND EGL。
OpenGL_GLES2_FOUND在 3.27 版本中新增。
布尔值,指示是否找到了 GLES2。
OpenGL_GLES3_FOUND在 3.27 版本中新增。
布尔值,指示是否找到了 GLES3。
OPENGL_INCLUDE_DIRS在版本 3.29 中添加。
OpenGL 头文件目录的路径。
OPENGL_EGL_INCLUDE_DIRS3.10 版本新增。
EGL 头文件目录的路径。
OPENGL_LIBRARIESOpenGL 库、窗口系统库和 GLU 库的路径。在 Linux 上,这假定是 GLX,对于基于 EGL 的目标永远不正确。建议客户端使用
OpenGL::*导入的目标。
缓存变量¶
以下缓存变量也可以设置
OPENGL_INCLUDE_DIROpenGL 头文件目录的路径。推荐使用
OPENGL_INCLUDE_DIRS变量。OPENGL_GLU_INCLUDE_DIR在版本 3.29 中添加。
OpenGL GLU 头文件目录的路径。
OPENGL_egl_LIBRARY3.10 版本新增。
GLVND EGL 库的路径。
OPENGL_glu_LIBRARYGLU 库的路径。
OPENGL_glx_LIBRARY3.10 版本新增。
GLVND GLX 库的路径。
OPENGL_opengl_LIBRARY3.10 版本新增。
GLVND OpenGL 库的路径
OPENGL_gl_LIBRARYOpenGL 库的路径。
OPENGL_gles2_LIBRARY在 3.27 版本中新增。
OpenGL GLES2 库的路径。
OPENGL_gles3_LIBRARY在 3.27 版本中新增。
OpenGL GLES3 库的路径。
提示¶
此模块接受以下变量
OpenGL_GL_PREFERENCE3.10 版本新增。
此变量在 Linux 系统上受支持,用于指定在有多种选择可用时提供旧版 GL 接口的首选方式。该值可以是以下之一
GLVND如果 GLVND OpenGL 和 GLX 库可用,则优先使用它们。这将强制
OPENGL_gl_LIBRARY为空。版本 3.11 中已更改: 这是默认值,除非策略
CMP0072设置为OLD且未请求任何组件(因为组件对应于 GLVND 库)。LEGACY如果可用,则优先使用旧版 libGL 库。
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 接口的首选方式。
对于 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,可以使用 CMAKE_FIND_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()
构建此项目的最终用户可能需要将 CMake 指向他们的 X11 安装,例如使用 -DOpenGL_ROOT=/opt/X11。
已弃用变量¶
以下变量提供用于向后兼容性
OPENGL_FOUND版本 4.2 已弃用: 使用
OpenGL_FOUND,它具有相同的值。布尔值,指示是否找到了 OpenGL 和所有请求的组件。
示例¶
查找 OpenGL 库并将其链接到项目目标
find_package(OpenGL)
target_link_libraries(project_target PRIVATE OpenGL::OpenGL)
另请参阅¶
FindGLEW模块用于查找 OpenGL 扩展编写器库 (GLEW)。FindGLUT模块用于查找 OpenGL 实用工具包 (GLUT) 库。FindVulkan模块用于查找 Vulkan 图形 API。