局部形状颜色混合

我正在尝试在Unity 4 Pro中实现这一点 。

但是我被困在混合部分。 我不明白你怎么可以在一个对象上使用多个卷来混合多个纹理/颜色。 你怎么能访问着色器中的这些卷,并检查“碰撞”?

这似乎是顶点/像素照明非常相似。 但也许我错了。

这是我想创建的简单效果。 在这里输入图像描述

从本质上讲,这看起来像你需要一个自定义的混合function,其中的结果将取决于实际形状轮廓的距离。

  • 对于每个覆盖像素的shapve,确定该点与形状的轮廓有多接近。
  • 对于一个圆圈,这可以是简单的1 - (distance_to_center / radius)
  • 对于一个长方形来说,它将是相似的,确定判断到任何边界的最短距离。
  • 然后比较所有形状的这些值 – 比例将告诉你如何混合颜色:
    • 如果两者具有相同的值,则将颜色混合50:50。
    • 如果一个值是1,另一个值是0.5,你可以把颜色混合67:33。

我不能告诉你如何在着色器中做到这一点,但我至less可以解释一下math。

基本上,所有的对象都有两个纹理:一个RGB颜色纹理(在你的例子中只是每个对象的纯色)和一个纹理(在你的例子中只是一个径向渐变)。 实际上,您可以方便地将重量存储为4分量RGBA纹理的alpha分量(尽管您不会将其用于正常的alpha混合)。 或者,对于这些简单的形状和渐变,您可以在着色器中程序化地计算每个对象的权重。

现在,要计算每个像素的颜色,需要对与该像素重叠的对象的颜色进行加权平均 。 也就是说,如果对象k的权重W k和颜色C k =( R kG kB k ),那么你可以计算出:

C sum =( W 1 * C 1 )+( W 2 * C 2 )+( W 3 * C 3 )+ …

和:

W sum = W 1 + W 2 + W 3 + …

并让像素的颜色为C avg = C sum / W sum

请注意,如果您存储预先乘以权重的颜色通道,则可以避免计算C sum时的乘法运算。 还要注意, C sumW sum可能是零,例如,如果没有物体与给定像素重叠。 在这种情况下,你需要决定使用什么颜色。 您的示例图片似乎在使用黑色的情况下。