在 OS X 上的 pyglet 中启用 OpenGL 核心配置文件

Posted

技术标签:

【中文标题】在 OS X 上的 pyglet 中启用 OpenGL 核心配置文件【英文标题】:Enabling the OpenGL Core Profile in pyglet on OS X 【发布时间】:2015-10-07 20:35:04 【问题描述】:

我正在尝试让一个最小的 OpenGL 着色器在 pyglet 中工作,但在编译时出现以下错误:

ERROR: 0:1: '' :  version '420' is not supported

这似乎是由于 pyglet 使用了旧版 OpenGL 配置文件,如 this question 但如果是这种情况,我怎样才能让 pyglet 使用不同的配置文件?我在任何地方都找不到它的文档,我觉得我一定遗漏了一些明显的东西。

以下代码重现问题(改编自this example):

import pyglet
import pyglet.gl as gl
import ctypes

window = pyglet.window.Window()
handle = gl.glCreateProgram()
shader = gl.glCreateShader(gl.GL_VERTEX_SHADER)

source = """
#version 420

in vec3 vertex_position;

void main() 
    gl_Position = vec4(vertex_position, 1.0);

"""

src = ctypes.c_char_p(source)
gl.glShaderSource(shader, 1,
    ctypes.cast(ctypes.pointer(src),
    ctypes.POINTER(ctypes.POINTER(ctypes.c_char))), None)
gl.glCompileShader(shader)

# Retrieve compilation status
status = ctypes.c_int(0)
gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS, ctypes.byref(status))
# If compilation failed, print the log
if not status:
    gl.glGetShaderiv(shader, gl.GL_INFO_LOG_LENGTH, ctypes.byref(status))
    buffer = ctypes.create_string_buffer(status.value)
    gl.glGetShaderInfoLog(shader, status, None, buffer)
    print buffer.value

pyglet.app.run()
硬件:MacBook Air(13 英寸,2012 年中)Intel HD Graphics 4000 1024 MB OSX:10.10.1 Python:2.7.6 pyglet:1.2.4

【问题讨论】:

OSX 不支持 GL 4.2。它将支持 2.1 版作为传统的向后兼容性,并支持 3.2 到 4.1 的核心配置文件。所以你可能已经有一个核心配置文件。 glGetString(GL_VERSION) 会告诉你你得到了什么。 感谢@derhass,知道 4.2 永远不会工作是很有用的!我尝试改用#version 320 并得到了类似的错误。尝试 glGetString(GL_VERSION) 给我 2.1 INTEL-10.0.86 所以看起来 pyglet 正在使用旧配置文件? 【参考方案1】:

似乎是一个未解决的错误,在旧的 Google 代码仓库中有一个未解决的问题 here,我已经提交了一个新错误 here。

所以我猜目前(从 pyglet 1.2.4 开始)不可能获得 >3.0 的 OpenGL 上下文。

【讨论】:

以上是关于在 OS X 上的 pyglet 中启用 OpenGL 核心配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Python 上的 io.open() 和 os.open() 有啥区别?

Apple OS X 上的 OpenCL 半精度扩展支持

仅为 OS X 10.8.x 和 iOS 6.x 在 iCloud 中启用核心数据同步

在 OS X 上以编程方式启用“全键盘访问”

在 Mac OS X (sierra & Mojave) 中启用 OpenMP 支持

以编程方式配置 Mac OS X MIDI