使用ModernGL与Pygame渲染纹理时屏幕全白,求问题排查
问题分析与修复方案
1. 导致全白的核心错误:顶点着色器变量重声明
你的顶点着色器中,main函数里重新声明了局部变量vec2 uv_0,这会覆盖全局的out vec2 uv_0输出变量,导致片段着色器无法接收到正确的纹理坐标,最终采样得到全白结果。
修正后的顶点着色器:
#version 330 layout (location = 0) in vec2 in_coords; layout (location = 1) in vec3 in_position; out vec2 uv_0; void main() { uv_0 = in_coords; // 移除vec2声明,直接赋值给输出变量 gl_Position = vec4(in_position, 1.0); }
2. 额外问题:Pygame图像Y轴翻转
Pygame加载的图像Y轴方向与OpenGL纹理坐标系相反,不处理的话蘑菇会上下颠倒。你可以通过两种方式修复:
- 方式一:修改纹理坐标数据
在create_vbo方法中,把tex_coords的Y值反转:tex_coords = [(0.2, 0.8), (0.8, 0.8), (0.8, 0.2), (0.2, 0.2)] - 方式二:在顶点着色器中反转Y坐标
修改顶点着色器的赋值逻辑:uv_0 = vec2(in_coords.x, 1.0 - in_coords.y);
3. 纹理采样优化(可选)
为了避免纹理边缘或缩放时出现异常,可以在创建纹理时添加过滤和包裹模式:
def get_texture(self): texture = self.ctx.texture((self.img.get_width(), self.img.get_height()), 4, pygame.image.tostring(self.img, "RGBA")) # 设置过滤模式,NEAREST是像素化,LINEAR是平滑 texture.filter = (mg.NEAREST, mg.NEAREST) # 设置纹理边缘包裹为 clamp to edge,避免重复偏移 texture.wrap = (mg.CLAMP_TO_EDGE, mg.CLAMP_TO_EDGE) return texture
内容的提问来源于stack exchange,提问作者Protolaser 28
相关产品推荐
相关产品推荐

