如何使用GLFW请求最新的核心OpenGL配置文件?

问题描述 投票:0回答:1

我是 OpenGL 和 GLFW 的新手,我想使用 GLFW Python 绑定和 moderngl 库在 Python 中制作一个小型图形引擎来获取 OpenGL 上下文。从 GLFW 的 documentation 来看,如果我将

glfw.CONTEXT_VERSION_MAJOR
glfw.CONTEXT_VERSION_MINOR
保留为默认值,我应该会获得系统上可用的最新 OpenGL 上下文。此外,我还想强制使用核心配置文件,这样我就不会通过使用
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
获得已弃用的功能。然而,这样做似乎迫使我显式指定上下文版本,否则,它无法创建窗口。因此,我无法再请求可用的最新版本。这是我的示例代码:

import platform
import sys

import glfw
import moderngl as mgl


def glfw_error_callback(error: int, description: bytes) -> None:
    print(f"GLFW error [{error}]: {description.decode()}", file=sys.stderr)


glfw.set_error_callback(glfw_error_callback)
if not glfw.init():
    sys.exit("Failed to initialize GLFW")

glfw.window_hint(glfw.RESIZABLE, False)
glfw.window_hint(glfw.DOUBLEBUFFER, True)
# I want to use the core profile to avoid deprecated functions,
# but doing so forces me to specify the context version,
# which means I can't get the latest version.
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 4)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 6)
if platform.system() == "Darwin":
    glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, True)

window = glfw.create_window(800, 600, "Demo window", None, None)
if not window:
    sys.exit("Failed to create GLFW window")
glfw.make_context_current(window)
glfw.swap_interval(1)

ctx = mgl.create_context()  # Create ModernGL context to see the context version

print("OpenGL info:")
print(f"  Vendor: {ctx.info['GL_VENDOR']}")
print(f"  Renderer: {ctx.info['GL_RENDERER']}")
print(f"  Version: {ctx.info['GL_VERSION']}")

while not glfw.window_should_close(window):
    glfw.swap_buffers(window)
    glfw.poll_events()

glfw.destroy_window(window)
ctx.release()
glfw.terminate()

我指定最低版本没有问题(也许我将来想使用 4.0+ 的功能),但指定这些窗口提示给了我一个上下文,即完全我指定的版本而不是更高版本。对我来说,请求最低版本似乎是合乎逻辑的,但允许甚至支持使用更高版本(如果有)。如果我说我至少需要 OpenGL 3.3,那么我在 4.6 的上下文中应该不会有问题,但我当前的设置似乎不可能。

我的问题是,如何请求可用的最新 OpenGL 版本并使用 GLFW 强制使用核心配置文件?既然它看起来比需要的更难,也许这不是我应该如何工作?是否有理由请求 4.6 等特定版本,而不是指定最低版本并获取与我的规范兼容的最新版本?换句话说,使用 GLFW 请求 OpenGL 上下文的“正确”方式是什么?

python opengl glfw
1个回答
0
投票

OpenGL 规范(第 22.2 节)

还可以通过使用

GetIntegerv
pname
MAJOR_VERSION
调用
MINOR_VERSION
来查询上下文版本,它们分别返回与
VERSION
字符串中的主编号和次编号相同的值。

此外:

GetString
返回版本号(在
VERSION
字符串中),可以 当前 GL 上下文支持。 因此,如果客户端和服务器支持不同版本,则会返回兼容版本。

© www.soinside.com 2019 - 2024. All rights reserved.