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

在曲线区域使用SetPixel32时遇到的技术疑问

曲线区域使用SetPixel32的解决方案

问题核心

你用SetPixel结合数组索引遍历曲线区域的方式可行,但直接调用固定32x32尺寸的SetPixels32重载无法适配非矩形的曲线区域,也不匹配你可变的块宽高。

解决方案1:操作整个纹理的Color32数组

和你用SetPixel的思路一致,先获取整个纹理的Color32数组,遍历曲线区域的每个像素坐标计算索引修改,再整体应用:

// 获取纹理的Color32像素数组
Color32[] pixels32 = _templateDirtMask.GetPixels32();

// 遍历曲线区域的所有像素坐标(x,y)(需自行实现曲线区域的坐标集合)
foreach (var (x, y) in GetCurveRegionPixels())
{
    // 计算当前像素在数组中的索引
    int pixelIndex = (pixelXOffset + x) + (pixelYOffset + y) * _templateDirtMask.width;
    // 设置为黑色(用Color32更高效)
    pixels32[pixelIndex] = Color32.black;
}

// 将修改后的数组应用到纹理
_templateDirtMask.SetPixels32(pixels32);
_templateDirtMask.Apply();

解决方案2:仅操作曲线区域的最小包围盒

如果不想修改整个纹理的像素数组,可以先计算曲线区域的最小矩形包围盒,只处理该范围内的像素:

// 先计算曲线区域的最小包围盒参数(需自行实现获取边界)
int minX = GetCurveMinX();
int minY = GetCurveMinY();
int boxWidth = GetCurveMaxX() - minX + 1;
int boxHeight = GetCurveMaxY() - minY + 1;

// 获取包围盒内的Color32数组
Color32[] boxPixels = _templateDirtMask.GetPixels32(minX, minY, boxWidth, boxHeight);

// 遍历曲线区域的每个像素,转换为包围盒内的相对坐标
foreach (var (x, y) in GetCurveRegionPixels())
{
    int relX = x - minX;
    int relY = y - minY;
    int pixelIndex = relX + relY * boxWidth;
    boxPixels[pixelIndex] = Color32.black;
}

// 将修改后的包围盒数组设置回纹理对应区域
_templateDirtMask.SetPixels32(minX, minY, boxWidth, boxHeight, boxPixels);
_templateDirtMask.Apply();

关键说明

  • SetPixels32的矩形重载仅适用于规则矩形区域,曲线区域是非矩形,必须逐个处理目标像素。
  • 用Color32替代Color能提升性能,因为它直接对应纹理的像素格式,无需转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:55:23