opengl 从GLSL着色器中提取二进制文件是一个标准的、受支持的操作吗?如果是,我们如何构建glad. c来支持它?

nfg76nw0  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(179)

我们一直在开发一个OpenGL程序,两年前的夏天,我们在Linux和Windows上开发了一个程序,比如Ubuntu 20.04LTS下的NVIDIA 2060,Windows和Ubuntu上的英特尔,GeForce 940mx等等。
在Linux上,我个人使用的驱动程序在这台笔记本电脑上是新的。

*-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)

在上一个问题中,我问为什么我们在尝试从着色器程序中获取二进制文件时会出现segfault。给出的零碎答案是,可能glad. c构建错误。
在我看来,这不是一个可以接受的答案,但也许我需要构造一个更好的问题。
1.从着色器程序中提取二进制文件是一个标准的功能,将工作在所有现代的openGL和驱动程序?让我们说windows/英特尔,windows/NVIDIA,linux/英特尔,linux/NVIDIA Neuveau,和/或Linux/NVIDIA与NVIDIA驱动程序。
1.如果它在某些平台上不起作用,什么是干净的编程方式来测试它?我如何判断该功能是否不受支持,以便在它不存在时动态禁用它?
1.如果我们错误地生成了glad.c,而这正是该特性不能工作的原因,我该如何正确地生成它呢?我只是访问了glad.david.de,选择了opengl 4.6核心并生成了它。对吗?如果不对,我该怎么办?

kkih6yb8

kkih6yb81#

1.从着色器程序中提取二进制文件是一个标准的功能,将工作在所有现代的openGL和驱动程序?让我们说windows/英特尔,windows/NVIDIA,linux/英特尔,linux/NVIDIA Neuveau,和/或Linux/NVIDIA与NVIDIA驱动程序。
ARB_get_program_binary OpenGL扩展中指定了检索已编译着色器程序的二进制表示形式。从4.1版开始,OpenGL也提供了此功能。这意味着,如果满足以下任一条件,则可以使用此功能:

  • 您使用的GL上下文至少为4.1版
  • 您正在使用的GL实现通过在GL扩展字符串中包含GL_ARB_get_program_binary来通告此功能(在此上下文中)的可用性。

每一个相当现代的GPU都应该支持GL 4.1,所以这个特性应该可以广泛使用。但是,有些实现可能只在 * 核心配置文件 * 中支持OpenGL 4.x。如果你使用兼容性或传统配置文件,你可能就不走运了。
1.如果它在某些平台上不起作用,什么是干净的编程方式来测试它?我如何判断该功能是否不受支持,以便在它不存在时动态禁用它?
这是扩展机制的一个要点。由于您使用了glad GL加载器,这可以通过glad很容易地完成。在创建上下文并初始化glad之后,您可以通过以下方式在运行时查询此特性的可用性:

if (GLAD_GL_VERSION_4_1 || GLAD_GL_get_program_binary) {
  // feature is available...
}

由于核心OpenGL和扩展确实指定了完全相同的函数和枚举名称,而没有任何扩展后缀,因此无论这些函数是通过核心OpenGL功能集还是扩展获取的,您都可以使用它们。
请注意,创建上下文的方式以及创建上下文时所请求的版本都很重要。如果您请求的上下文版本低于4.1,即使实现技术上支持该版本,您也可能得不到上下文。通常情况下,在这种情况下扩展是可用的,但这不是必需的。
1.如果我们错误地生成了glad.c,而这正是该特性不能工作的原因,我该如何正确地生成它呢?我只是访问了glad.david.de,选择了opengl 4.6核心并生成了它。对吗?如果不对,我该怎么办?
要使上述代码正常工作,唯一的要求是您至少为OpenGL 4.1和GL_ARB_get_program_binary扩展生成了GLAD加载程序。如果您为4.6生成了GLAD加载程序,而忽略了扩展,那么glad将永远不会查找该扩展,并且不会定义GLAD_GL_get_program_binary。这样,如果您使用GL上下文〈4.1,您将无法使用该扩展。即使GL实现支持它。

相关问题