You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:10:19