pyglet运行GUI代码出现GLSL版本报错,如何设置使用的GLSL版本?
问题解决方法
问题本质
所有报错均由pyglet默认创建的OpenGL上下文绑定的GLSL版本过低导致:默认使用GLSL 1.10,不支持着色器代码中用到的uniform数组初始化、数组构造器等语法,要求至少GLSL 1.20版本。
两步修复方案
1. 修改着色器头部,添加版本声明
在GLSL文件最顶部第一行添加版本声明,指定使用GLSL 1.20:
#version 120 // 原有代码保留,以下是你原来的开头 #ifdef GL_ES precision highp float; #endif
如果需要兼容更高版本,可以替换为#version 130甚至更高,只要不低于120即可。
2. 修改pyglet窗口配置,指定OpenGL版本
仅修改着色器版本不生效,需要在pyglet创建窗口前手动配置OpenGL上下文版本,OpenGL 2.1对应GLSL 1.20,刚好满足需求:
import pyglet # 配置OpenGL上下文参数 gl_config = pyglet.gl.Config( major_version=2, minor_version=1, double_buffer=True ) # 创建窗口时传入配置,原有窗口参数(宽高、标题等)可自行保留 window = pyglet.window.Window(config=gl_config, width=800, height=600)
如果你的设备支持更高版本OpenGL,也可以配置为3.3版本以获得更好的兼容性:
gl_config = pyglet.gl.Config( major_version=3, minor_version=3, forward_compatible=True )
可选优化建议
你的代码中weight数组是固定常量值,不需要从CPU侧传值,可将uniform修饰符替换为const,进一步避免跨版本兼容问题:
// 原代码:uniform float weight[5] = float[](0.2270270270, 0.1945946, 0.1216216216, 0.0540540541, 0.0162162162); // 修改为: const float weight[5] = float[](0.2270270270, 0.1945946, 0.1216216216, 0.0540540541, 0.0162162162);
修改后所有报错和警告都会消失。
内容的提问来源于stack exchange,提问作者Erfan Hamdi
相关产品推荐
相关产品推荐

