在顶点着色器中创建纹理并传递给片段以使用Metal涂抹画笔吗?

时间:2019-07-19 21:56:12

标签: ios shader metal fragment-shader vertex-shader

我正在尝试为我的画笔项目添加污点效果。为此,我认为我需要从笔刷笔划坐标的开始采样当前结果(在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是已绘制到画布上的当前结果。我想使用与画笔纹理相同的区域从paintedTexture创建一个新纹理,并将其传递给片段着色器。

片段着色器中的existingColor [[color(0)]]无用,因为它是当前颜色,而不是笔画开始时的颜色。如果我使用现存的颜色,就好比使用透明度(或基于将其与新颜色结合使用的数学方法的传输模式)。

如果我树错了树皮,那么任何有关如何用Metal达到污迹效果的建议都是可以接受的答案。

更新:我尝试在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'

1 个答案:

答案 0 :(得分:0)

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

我希望您可以将paintedTexture传递给片段着色器,并使用顶点着色器来记录从该纹理采样的位置。因此,只需协调即可。