Processing中Geometry Shader生成三角形时出现重复渲染问题
重复渲染问题原因分析
你看到的两个错开的三角形,实际是两个独立渲染流程各自输出一次的结果:
- 偏移位置的彩色三角形:是你自定义几何着色器生成的输出
- 未偏移位置的原始三角形:是Processing 内置默认渲染流程直接绘制的输入形状
具体触发逻辑
- 早期版本Processing(2.x及部分3.x早期迭代版本)中,
shader()函数的实际运行逻辑是为当前绘制上下文追加自定义Shader的参数绑定,而非完全替换内置的默认渲染管线。当你调用shader()后再使用triangle()、rect()这类封装好的内置图元接口时,Processing 会对同一个图元提交两次独立的绘制命令:- 第一次绘制走你的自定义Shader管线:顶点着色器把传入的原始顶点坐标传递给几何着色器,几何着色器根据你写的偏移逻辑生成新的三角形并输出,最终得到左侧带颜色的偏移三角形
- 第二次绘制走Processing 内置的默认2D渲染管线:不经过你的自定义几何着色器,直接把原始输入的顶点坐标按默认规则光栅化,得到位置没有偏移的原始三角形
- 你当前的几何着色器代码完全没有对输入的原始三角形做透传输出:仅提取了
gl_in[0]的顶点位置做偏移生成新形状,本身语法没有错误,但在Processing 的双次绘制机制下,就会直接叠加出两个独立的形状。 - 额外说明:你几何着色器的输入输出配置(
layout(triangles) in、max_vertices =5)本身没有语法问题,不是参数配置错误导致的重复渲染。
可落地的解决方向
- 跳过Processing 内置的图元封装逻辑,直接使用原生顶点提交接口:通过
beginShape(TRIANGLES)手动传入3个顶点后调用endShape(),不要依赖triangle()这类高层封装函数,从根源上避免双次绘制 - 如果需要保留内置图元接口,可在绘制前显式调用
noFill()关闭内置流程的填充渲染,只保留自定义Shader的输出结果 - 升级到最新稳定版Processing 3.x,该版本已经修复了
shader()函数叠加两次绘制的问题,自定义Shader绑定后会完全替换内置管线,不会重复提交绘制命令
内容的提问来源于stack exchange,提问作者Pau Rosello
相关产品推荐
相关产品推荐

