确定屏幕覆盖面积

determine area of screen covered

我们有一个应用程序,允许用户使用连接到鼠标的 "brush" 擦除顶层图像。画笔可以是任何类型的形状,例如圆形、星形、W 或任何随机的奇异形状。

这目前是使用 DirectX9 和着色器 (3.0) 在 C++ 中实现的。这是一个遗留系统,更高版本的 DirectX 不可用。单通道不透明度贴图累积画笔笔触。然后将不透明度贴图用作顶部和底部图像之间的 alpha 层。

问题是当显示一定比例的图像时,需要自动擦除图像的其余部分。例如,如果用户已经显示了 60% 的底层,应用程序将自动清除其余的不透明度贴图以显示所有内容。 问题是在不锁定表面和计算像素的情况下试图弄清楚有多少不透明度贴图被擦除,因为那是真的慢.

您可以尝试以下方法:

  1. 创建 1x 帧缓冲区
  2. 通过获取一列像素的所有不透明度值的总和并将其写入帧缓冲区中的该索引,创建一个渲染到此帧缓冲区中的着色器。每个着色器调用都应该负责一列像素。
  3. 锁定帧缓冲区表面并对所有这些像素值求和。这应该比在整个屏幕上这样做要快得多。
  4. 将您的总和与原始宽度和高度的乘积进行比较。