我们一直在开发一个 OpenGL 程序,glad 是在两年前的夏天构建的,在 Linux 和 Windows 上的显卡上工作,例如 Ubuntu 20.04LTS 下的 NVIDIA 2060、Windows 和 Ubuntu 上的 Intel、GeForce 940mx 等。
在 Linux 上,我个人在这台笔记本电脑上使用的驱动程序是 nouveau。
*-display
description: VGA compatible controller
product: HD Graphics 620
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 02
width: 64 bits
clock: 33MHz
capabilities: pciexpress msi pm vga_controller bus_master cap_list rom
configuration: driver=i915 latency=0
resources: irq:129 memory:a2000000-a2ffffff memory:b0000000-bfffffff ioport:4000(size=64) memory:c0000-dffff
*-display
description: 3D controller
product: GM108M [GeForce 940MX]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:01:00.0
version: a2
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress bus_master cap_list rom
configuration: driver=nouveau latency=0
resources: irq:131 memory:a3000000-a3ffffff memory:90000000-9fffffff memory:a0000000-a1ffffff ioport:3000(size=128)
Run Code Online (Sandbox Code Playgroud)
在上一个问题中,我问为什么在尝试从着色器程序获取二进制文件时会出现段错误。给出的零碎答案是,也许glad.c 构建错误。
在我看来,这不是一个可以接受的答案,但也许我需要提出一个更好的问题。 从二进制着色器提取代码时有没有办法调试 OpenGL 段错误
从着色器程序中提取二进制文件是适用于所有现代 openGL 和驱动程序的标准功能吗?假设 Windows/Intel、Windows/NVIDIA、linux/Intel、linux/NVIDIA Neuveau 和/或带有 NVIDIA 驱动程序的 Linux/NVDIA。
如果它在某些平台上不起作用,那么测试此功能的干净编程方法是什么?如何判断该功能是否不受支持,以便在该功能不存在时可以动态禁用它?
如果我们错误地生成了glad.c,这就是该功能无法正常工作的原因,我该如何正确生成它?我刚刚去了glad.david.de,选择了opengl 4.6 core并生成了。是对的吗?如果没有,我该怎么办?
- 从着色器程序中提取二进制文件是适用于所有现代 openGL 和驱动程序的标准功能吗?假设 Windows/Intel、Windows/NVIDIA、linux/Intel、linux/NVIDIA Neuveau 和/或带有 NVIDIA 驱动程序的 Linux/NVDIA。
OpenGL 扩展中指定了检索已编译着色器程序的二进制表示ARB_get_program_binary。从 4.1 版本开始,OpenGL 中也提供了此功能。这意味着如果满足以下任一条件,您就可以使用此功能:
GL_ARB_get_program_binary在 GL 扩展字符串中来宣传此功能的可用性(在此上下文中)。每个相当现代的 GPU 都应该支持 GL 4.1,所以这个功能应该被广泛使用。但是,某些实现可能仅在核心配置文件中支持 OpenGL 4.x。如果您使用兼容性或旧版配置文件,您可能会不走运。
- 如果它在某些平台上不起作用,那么测试此功能的干净编程方法是什么?如何判断该功能是否不受支持,以便在该功能不存在时可以动态禁用它?
这是拥有扩展机制的要点之一。由于您使用了 Glad GL 加载程序,因此可以通过 Glad 轻松完成此操作。创建上下文并初始化后,您可以在运行时查询此功能的可用性:
if (GLAD_GL_VERSION_4_1 || GLAD_GL_get_program_binary) {
// feature is available...
}
Run Code Online (Sandbox Code Playgroud)
由于核心 OpenGL 和扩展确实指定了完全相同的函数和枚举名称,而没有任何扩展后缀,因此无论它们是通过核心 OpenGL 功能集还是扩展获取的,您都可以使用这些函数。
请注意,创建上下文的方式以及创建上下文时请求的版本都很重要。如果您请求 4.1 版本以下的上下文,即使实现在技术上支持该版本,您也可能得不到。通常,无论如何,扩展在这种情况下都是可用的,但这不是必需的。
- 如果我们错误地生成了glad.c,这就是该功能无法正常工作的原因,我该如何正确生成它?我刚刚去了glad.david.de,选择了opengl 4.6 core并生成了。是对的吗?如果没有,我该怎么办?
上述代码工作的唯一要求是您至少为 OpenGL 4.1 和扩展生成 GLAD 加载程序GL_ARB_get_program_binary。如果您为 4.6 生成并省略了扩展名,那么 happy 永远不会查找该扩展名,也GLAD_GL_get_program_binary不会被定义。然后,如果您使用低于 4.1 的 GL 上下文,您将无法使用该扩展,即使您的 GL 实现支持该扩展。