我们有一个应用程序,允许用户使用附加到鼠标的"画笔"擦除顶层图像。 画笔可以是任何类型的形状,例如圆形、星形、W 或任何随机的奇异形状。
这目前在C++中使用 DirectX9 和着色器 (3.0( 实现。 这是一个旧系统,DirectX 的更高版本不可用。 单通道不透明度贴图累积画笔描边。 然后将不透明度贴图用作顶部和底部图像之间的 alpha 层。
问题是,当图像显示一定百分比时,需要自动擦除图像的其余部分。 例如,如果用户已经显示了底层的 60%,则应用将自动清除不透明度地图的其余部分以显示所有不透明度地图。问题是试图弄清楚在不锁定表面和计算像素的情况下擦除了多少不透明度贴图,因为这真的很慢。
您可以尝试以下方法:
- 创建 1x 帧缓冲
- 创建一个着色器,通过获取一列像素的所有不透明度值的总和并将其写入帧缓冲区中的该索引,呈现到此帧缓冲区中。每个着色器调用应负责一列像素。
- 锁定帧缓冲图面并汇总所有这些像素值。这应该比对整个屏幕执行此操作要快得多。
- 将您的总和与原始宽度和高度的乘积进行比较。