Python openGL(pyglet)3d场景未在AMD图形卡上正确渲染

Python openGL(pyglet)3d场景未在AMD图形卡上正确渲染,python,python-3.x,3d,pyglet,Python,Python 3.x,3d,Pyglet,我找到了用pyglet渲染立方体的代码,我观看了随代码一起播放的视频,它在Nvidia图形卡上正确地显示了立方体渲染。当我在我的AMD图形卡上尝试代码时,它会断开,我如何修复它 github链接: 视频链接: 我得到的: 视频显示的内容: 来自main.py的代码 导入数学 导入ctypes 导入pyglet pyglet.options[“阴影窗口”]=False pyglet.options[“debug_gl”]=False 将pyglet.gl导入为gl 导入矩阵 导入着色器 进口照

我找到了用pyglet渲染立方体的代码,我观看了随代码一起播放的视频,它在Nvidia图形卡上正确地显示了立方体渲染。当我在我的AMD图形卡上尝试代码时,它会断开,我如何修复它

github链接:

视频链接:

我得到的:

视频显示的内容:

来自main.py的代码

导入数学
导入ctypes
导入pyglet
pyglet.options[“阴影窗口”]=False
pyglet.options[“debug_gl”]=False
将pyglet.gl导入为gl
导入矩阵
导入着色器
进口照相机
导入块类型
导入纹理管理器
类窗口(pyglet.Window.Window):
定义初始化(self,**参数):
super()
#创建块
self.texture\u manager=texture\u manager.texture\u manager(16,16,256)
self.cobblestone=block_type.block_type(self.texture_管理器,“cobblestone”,{“all”:“cobblestone”})
self.grass=block_type.block_type(self.texture_manager,“grass”,{“top”:“grass”,“bottom”:“dirty”,“sides”:“grass_side”})
self.dirt=block_type.block_type(self.texture_管理器,“dirt”,{“all”:“dirt”})
self.stone=block_type.block_type(self.texture_管理器,“stone”,{“all”:“stone”})
self.sand=block_type.block_type(self.texture_管理器,“sand”,{“all”:“sand”})
self.planks=block_type.block_type(self.texture_管理器,“planks”,{“all”:“planks”})
self.log=block_type.block_type(self.texture_manager,“log”,{“top”:“log_top”,“bottom”:“log_top”,“side”:“log_side”})
self.texture\u manager.generate\u mipmaps()
#创建顶点数组对象
self.vao=gl.GLuint(0)
gl.glgenvertexarray(1,ctypes.byref(self.vao))
总账glBindVertexArray(self.vao)
#创建顶点位置vbo
self.vertex\u position\u vbo=gl.GLuint(0)
gl.glGenBuffers(1,ctypes.byref(self.vertex\u position\u vbo))
gl.glBindBuffer(gl.gl_数组_BUFFER,self.vertex_position_vbo)
gl.glBufferData(
gl.gl\u数组\u缓冲区,
ctypes.sizeof(gl.GLfloat*len(self.grass.vertex_positions)),
(gl.GLfloat*len(self.grass.vertex_positions))(*self.grass.vertex_positions),
总帐、总帐(静态图)
gl.glVertexAttribute指针(0,3,gl.gl\u浮点,gl.gl\u假,0,0)
gl.GlenableVertexAttributeArray(0)
#创建tex coord vbo
self.tex\u coord\u vbo=gl.GLuint(0)
gl.glGenBuffers(1,ctypes.byref(self.tex\u coord\u vbo))
gl.glBindBuffer(gl.gl_数组_BUFFER,self.tex_coord_vbo)
gl.glBufferData(
gl.gl\u数组\u缓冲区,
ctypes.sizeof(gl.GLfloat*len(self.grass.tex_coords)),
(gl.GLfloat*len(self.grass.tex_coords))(*self.grass.tex_coords),
总帐、总帐(静态图)
gl.glVertexAttribute指针(1,3,gl.gl\u浮点,gl.gl\u假,0,0)
gl.GlenableVertexAttributeArray(1)
#创建着色值vbo
self.shading\u value\u vbo=gl.GLuint(0)
gl.glGenBuffers(1,ctypes.byref(self.shading_value_vbo))
gl.glBindBuffer(gl.gl\u数组\u缓冲区、自着色\u值\u vbo)
gl.glBufferData(
gl.gl\u数组\u缓冲区,
ctypes.sizeof(gl.GLfloat*len(self.grass.shading_值)),
(gl.GLfloat*len(self.grass.shading_值)(*self.grass.shading_值),
总帐、总帐(静态图)
gl.glVertexAttribute指针(2,1,gl.gl\u浮点,gl.gl\u假,0,0)
gl.GlenableVertexAttributeArray(2)
#创建索引缓冲区对象
self.ibo=gl.GLuint(0)
gl.glGenBuffers(1,self.ibo)
gl.glBindBuffer(gl.gl\u元素\u数组\u缓冲区,self.ibo)
gl.glBufferData(
gl.gl\u元素\u数组\u缓冲区,
ctypes.sizeof(gl.GLuint*len(self.grass.index)),
(gl.GLuint*len(self.grass.index))(*self.grass.index),
总帐、总帐(静态图)
#创建着色器
self.shader=shader.shader(“vert.glsl”、“frag.glsl”)
self.shader\u sampler\u location=self.shader.find\u uniform(b“纹理\u数组\u sampler”)
self.shader.use()
#派格莱特材料
pyglet.clock.schedule_间隔(自我更新,1.0/60)
self.mouse_captured=False
#摄影器材
self.camera=camera.camera(self.shader、self.width、self.height)
def on_牵引(自):
self.camera.update_matrix()
#绑定纹理
gl.glActiveTexture(gl.gl\U纹理0)
gl.glBindTexture(gl.gl\u纹理\u 2D\u数组,self.TEXTURE\u管理器.TEXTURE\u数组)
gl.glUniform1i(self.shader\u sampler\u位置,0)
#画画
glEnable总包(总包深度测试)
gl.glClearColor(0.0,0.0,0.0,1.0)
self.clear()
gl.gl元素(
gl.gl_三角形,
len(自草指数),
gl.gl\u无符号\u INT,
(无)
*注意:一些相机移动代码被省略了,要查看完整代码,请参考github链接


我已经就discord与创建者进行了交谈,他已经确认他正在使用Nvidia卡,非常感谢您为解决此问题提供的任何帮助

您必须确保pyglet窗口的默认帧缓冲区具有深度缓冲区。见:

config=pyglet.gl.config(深度大小=24)
window=pyglet.window.window(config=config)
如果硬件不支持24位深度缓冲区,则可能需要尝试16位:

config=pyglet.gl.config(深度大小=16)
window=pyglet.window.window(config=config)

非常感谢您!有没有办法让皮格莱特自动选择正确的一个?@drakeerv我不这么认为。根据文档,默认值始终为24。