在顶点着色器中创建纹理并传递给片段以实现用金属涂抹刷子?

Creating texture in Vertex shader and passing to Fragment to achieve smudging brush with Metal?

我正在尝试为我的画笔项目添加涂抹效果。为此,我想我需要从笔触坐标的开始对当前结果(在 paintedTexture 中)进行采样,并将其传递给片段着色器。

我有一个顶点着色器,例如:

vertex VertexOut vertex_particle(
                 device Particle *particles [[buffer(0)]],
                 constant RenderParticleParameters *params [[buffer(1)]],
                 texture2d<half> imageTexture [[ texture(0) ]],
                 texture2d<half> paintedTexture [[ texture(1) ]],
                 uint instance [[instance_id]])
{
    VertexOut out;

绘制片段着色器如:

fragment half4 fragment_particle(VertexOut in [[ stage_in ]],
               half4 existingColor [[color(0)]],
               texture2d<half> brushTexture [[ texture(0) ]],
               float2 point [[ point_coord ]]) {

是否可以从 paintedTexture 创建裁剪纹理并将其发送到片段着色器?

paintedTexture是当前已经画到canvas的结果。我想使用与笔刷纹理相同的区域从 paintedTexture 创建一个新纹理,并将其传递给片段着色器。

片段着色器中的existingColor [[color(0)]]没有用,因为它是当前颜色,而不是笔画开始处的颜色。如果我使用 existingColor,就像使用透明度(或基于用于将其与新颜色组合的数学的传输模式)。

如果我找错人了,关于如何使用金属实现晕染效果的任何建议都可能是可以接受的答案。

更新:我尝试在 VertexOut 结构中使用 texture2d:

struct VertexOut {
    float4 position   [[ position ]];
    float  point_size [[ point_size ]];
    texture2d<half> paintedTexture;
}

但是编译失败,报错:

vertex function has invalid return type 'VertexOut'

VertexOut 结构中似乎也不可能有一个数组(这不像纹理那样理想,但它可能是前进的道路):

struct VertexOut {
    float4 position   [[ position ]];
    float  point_size [[ point_size ]];
    half4 paintedPixels[65536];
}

给我错误:

type 'VertexOut' is not valid for attribute 'stage_in'

着色器无法创建 纹理。他们可以填补现有的,但我认为这不是您想要或需要的。

我希望您可以将 paintedTexture 传递给片段着色器并使用顶点着色器记录从该纹理到何处进行采样。所以,只是坐标。