我正在尝试为我的画笔项目添加污点效果。为此,我认为我需要从笔刷笔划坐标的开始采样当前结果(在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'
答案 0 :(得分:0)
着色器不可能创建纹理。他们可以填补现有的一个,但我认为这不是您想要的或不需要的。
我希望您可以将paintedTexture
传递给片段着色器,并使用顶点着色器来记录从该纹理采样的位置。因此,只需协调即可。