当前位置: 首页 > news >正文

【Raqote】 1.3 路径填充ShaderClipBlendMaskBlitter结构体(blitter.rs)

ShaderClipBlendMaskBlitter 结构体实现了 Blitter trait,用于支持 带裁剪遮罩(Clip Mask)和自定义混合函数(Blend Function)的着色器渲染。它比之前的 ShaderClipMaskBlitter 更灵活,因为它允许外部传入一个 自定义混合函数(blend_fn),而不是硬编码混合逻辑。

结构体定义

pub struct ShaderClipBlendMaskBlitter<'a> {
    pub x: i32,                     // 目标区域的起始 x 坐标
    pub y: i32,                     // 目标区域的起始 y 坐标
    pub shader: &'a dyn Shader,      // 着色器,用于生成像素颜色
    pub tmp: Vec<u32>,               // 临时缓冲区,存储着色器生成的像素
    pub dest: &'a mut [u32],         // 目标像素缓冲区(帧缓冲区)
    pub dest_stride: i32,            // 目标缓冲区的行跨度(每行的像素数)
    pub clip: &'a [u8],             // 裁剪遮罩(决定哪些像素允许绘制)
    pub clip_stride: i32,            // 裁剪遮罩的行跨度
    pub blend_fn: fn(&[u32], &[u8], &[u8], &mut [u32]), // 自定义混合函数
}

关键字段

字段用途
x, y目标绘制区域的起始坐标
shader生成像素颜色的着色器
tmp存储着色器生成的临时像素数据
dest目标帧缓冲区(最终绘制的位置)
dest_stride目标缓冲区的行跨度(用于非连续内存布局)
clip裁剪遮罩(决定哪些像素允许绘制)
clip_stride裁剪遮罩的行跨度
blend_fn自定义混合函数(核心改进点)

Blitter Trait 实现

impl<'a> Blitter for ShaderClipBlendMaskBlitter<'a> {
    fn blit_span(&mut self, y: i32, x1: i32, x2: i32, mask: &[u8]) {
        // 计算目标缓冲区的当前行偏移
        let dest_row = (y - self.y) * self.dest_stride;
        
        // 计算裁剪遮罩的当前行偏移
        let clip_row = y * self.clip_stride;
        
        // 计算要处理的像素数量
        let count = (x2 - x1) as usize;
        
        // 使用着色器生成像素颜色,存储到 tmp 缓冲区
        self.shader.shade_span(x1, y, &mut self.tmp[..], count);
        
        // 调用自定义混合函数进行像素混合
        (self.blend_fn)(
            &self.tmp[..],                          // 着色器生成的像素
            mask,                                   // 遮罩(控制透明度)
            &self.clip[(clip_row + x1) as usize..], // 裁剪遮罩(控制是否允许绘制)
            &mut self.dest[(dest_row + x1 - self.x) as usize..], // 目标像素缓冲区
        );
    }
}

关键改进:自定义混合函数

之前的 ShaderClipMaskBlitter 使用硬编码的 over_in_in 混合逻辑,而 ShaderClipBlendMaskBlitter 允许动态传入混合函数:

rust
复制
pub blend_fn: fn(&[u32], &[u8], &[u8], &mut [u32]),
混合函数的参数
参数 用途
&[u32] 着色器生成的像素(tmp 缓冲区)
&[u8] 遮罩(mask,控制透明度)
&[u8] 裁剪遮罩(clip,控制是否允许绘制)
&mut [u32] 目标像素缓冲区(最终写入位置)
示例混合函数
假设我们要实现一个 乘法混合(Multiply Blend),可以这样定义:

rust
复制
fn multiply_blend(
src: &[u32], // 着色器生成的像素
mask: &[u8], // 透明度遮罩
clip: &[u8], // 裁剪遮罩
dest: &mut [u32], // 目标像素
) {
for i in 0…src.len() {
if clip[i] != 0 { // 只有 clip 不为 0 时才绘制
let mask_val = mask[i] as f32 / 255.0;
let src_pixel = src[i];
let dest_pixel = dest[i];

        // 乘法混合公式: result = src * dest * mask
        let r = ((src_pixel >> 16) & 0xFF) as f32 * ((dest_pixel >> 16) & 0xFF) as f32 * mask_val;
        let g = ((src_pixel >> 8) & 0xFF) as f32 * ((dest_pixel >> 8) & 0xFF) as f32 * mask_val;
        let b = (src_pixel & 0xFF) as f32 * (dest_pixel & 0xFF) as f32 * mask_val;
        
        dest[i] = ((r as u32) << 16) | ((g as u32) << 8) | (b as u32);
    }
}

}
使用时:

rust
复制
let blitter = ShaderClipBlendMaskBlitter {
blend_fn: multiply_blend,
// 其他字段…
};
与 ShaderClipMaskBlitter 的对比
特性 ShaderClipMaskBlitter ShaderClipBlendMaskBlitter
混合方式 硬编码 over_in_in 自定义 blend_fn
灵活性 固定混合逻辑 支持任意混合模式(乘法、叠加、屏幕等)
适用场景 单一混合需求 需要动态切换混合模式的场景
适用场景
图形渲染引擎

支持不同的混合模式(如 Multiply、Screen、Overlay)。

UI 框架

不同控件可以使用不同的混合方式(如半透明窗口、叠加特效)。

游戏开发

动态光照(Additive 混合)、粒子效果(Alpha Blend)。

总结
ShaderClipBlendMaskBlitter 是一个高度可定制的像素混合渲染器,支持:

着色器生成像素

遮罩控制透明度

裁剪遮罩控制绘制区域

自定义混合函数

适用于需要 动态切换混合模式 的高级图形渲染场景。

http://www.dtcms.com/a/123139.html

相关文章:

  • Vue报错...properly without JavaScript enabled. Please enable it to continue
  • P1216 洛谷 数字三角形
  • 文件相关:echo重定向管道命令扩展详解
  • 论坛系统(测试报告)
  • 1.5SMC62A 单向瞬态抑制二极管,精准防护电路过压
  • 汽车软件开发常用的需求管理工具汇总
  • 校园食堂采购管理系统源码开发指南:探索数据大屏可视化建设
  • 微服务多模块构建feign项目过程与一些报错(2025详细版)
  • 【Java学习】如何利用AI学习Java语言开发(二)
  • linux shell编程规范与变量(一)
  • 25.4.10学习总结
  • 大数据Hadoop(MapReduce)
  • SQL 不走索引的常见情况
  • 小白电路设计-设计7-固定式倍压器直流稳压电源电路设计
  • Elasticsearch 系列专题 - 第三篇:搜索与查询
  • 超越肉眼所见:一种利用视网膜光学相干断层扫描血管成像(OCTA)图像进行早期痴呆检测的关联模型|文献速递-深度学习医疗AI最新文献
  • linux内核
  • 2021-10-19 C++奇怪数
  • 牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记1
  • MCU控制4G模组(标准AT命令),CatM的最大速率?
  • 学习笔记四——Rust 函数通俗入门
  • 城电科技 | 从概念到落地:如何打造真正的智慧零碳园区?
  • 粘性定位(position:sticky)——微信小程序学习笔记
  • Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(6)
  • 阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
  • js逆向入门图灵爬虫练习平台第六题
  • AI小程序+SpringAI+管理后台+源码+支持动态添加大模型+支持动态添加AI应用
  • ESP8266水位监测以及温湿度数据采集
  • 008二分答案+贪心判断——算法备赛
  • HDCP(二)