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

树莓派3B+的Processing Pi移植GLSL视频溶解Shader遇白屏问题求助

调试树莓派Processing GLVideo+GLSL溶解Shader白屏问题

针对你把GLSL视频溶解效果从Processing Mac移植到树莓派3B+时遇到的白屏问题,结合树莓派GPU和Processing Pi的特性,给你几个具体的调试方向和解决方案:

1. 绕开PGraphics,直接绑定GLMovie纹理

你当前把GLMovie画到PGraphics再传给Shader,但GLMovie本身已经是基于OpenGL的纹理对象,树莓派的PGraphics P2D上下文可能和桌面端存在纹理绑定差异,尝试直接将GLMovie对象传给Shader的sampler2D uniform:

// 去掉pg和pg2的创建与绘制逻辑,直接在setup里设置:
mixShader.set("iChannel0", movie);
mixShader.set("iChannel1", movie2);

// draw函数简化为:
void draw() {
  mixShader.set("iTime", millis()/1000.0); // 记得实时更新时间
  shader(mixShader);
  rect(0, 0, width, height);
}

这样可以避免PGraphics带来的额外纹理拷贝和上下文切换问题,直接利用GLMovie的原生GL纹理。

2. 检查Shader纹理采样的Y轴翻转问题

树莓派的OpenGL ES纹理坐标Y轴方向可能和桌面端相反,尝试在Shader中翻转采样坐标:

vec2 uv = gl_FragCoord.xy / iResolution.xy;
uv.y = 1.0 - uv.y; // 翻转Y轴

如果原视频纹理在采样时Y轴颠倒,可能会导致采样到纹理外的区域(默认返回全白或全黑),这是嵌入式平台常见的纹理坐标差异。

3. 验证GLSL ES语法兼容性

树莓派的VideoCore IV GPU仅支持GLSL ES 1.00(对应OpenGL ES 2.0),检查你的Shader是否存在语法问题:

  • 去掉不必要的类型转换:mod(iTime, duration)即可,iTime已经是float类型;
  • 确保uniform变量的命名和类型匹配,也可以尝试将iChannel0/iChannel1改成更符合Processing习惯的命名(比如tex0/tex1),避免潜在的命名冲突;
  • 测试Shader基础功能:暂时替换Shader内容,验证Shader是否能正常运行:
    #define PROCESSING_COLOR_SHADER
    uniform float iTime;
    uniform vec2 iResolution;
    void main() {
      vec2 uv = gl_FragCoord.xy / iResolution.xy;
      gl_FragColor = vec4(uv.x, uv.y, iTime*0.1, 1.0); // 输出渐变+随时间变化的蓝色通道
    }
    

如果这个基础Shader能显示内容,说明Shader上下文没问题,问题出在纹理绑定或采样上。

4. 分步排查纹理绑定问题

用纯色纹理替代视频,验证Shader的混合逻辑是否正常:

// 在setup里创建纯色PGraphics
pg = createGraphics(width, height, P2D);
pg.beginDraw();
pg.background(255,0,0); // 红色
pg.endDraw();
pg2 = createGraphics(width, height, P2D);
pg2.beginDraw();
pg2.background(0,0,255); // 蓝色
pg2.endDraw();
// 然后绑定给Shader
mixShader.set("iChannel0", pg);
mixShader.set("iChannel1", pg2);

如果能看到红到蓝的渐变混合,说明Shader本身没问题,问题出在GLMovie的纹理加载或传递上;如果还是白屏,那要检查Processing Pi的PShader初始化是否正确。

5. 修正uniform更新逻辑

你当前只在setup里设置了iTime,draw函数里没有实时更新,虽然这不会导致白屏,但会让混合效果静止。记得在draw里加上:

mixShader.set("iTime", millis()/1000.0);

6. 检查GPU纹理格式与内存

控制台输出显示视频格式是RGBA,符合要求,但可以尝试:

  • 用更小分辨率的视频(比如320x180)测试,减少GPU纹理压力;
  • 确保树莓派的GPU内存分配生效:修改/boot/config.txt中的gpu_mem=256后重启设备,避免只在系统设置里调整但未生效。

内容的提问来源于stack exchange,提问作者jshaw3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:22:38