2

我正在评估 SkiaSharp 是否可以在允许在照片上渲染一些矢量元素的项目中使用。SkiaSharp 看起来非常适合渲染矢量元素,但我也想对图像应用变换——例如对比度或曝光等色调曲线调整。

理想的情况是在渲染包含图像的矩形时执行自定义 GLSL 片段着色器代码(例如,仅包装 GLSL 代码的 SKColorFilter 子类,在调用 DrawBitmap 时应用,或类似的)。

将我现有的 GLSL 代码渲染到纹理,然后让 SkiaSharp 使用该纹理作为其内容绘制一个矩形,这也可能会起作用。但是,如果没有 GPU 回读,我看不到这样做的方法,这感觉起来会非常慢。

这里最好的方法是什么?更准确地说:或者,我如何在 GPU 上,在 SkiaSharp 中对图像的像素数据应用转换,或者,我还能使用什么来提供类似 SkiaSharp 的矢量渲染基元,并且还允许类似 GLSL 片段着色器的像素转换?

4

1 回答 1

1

您可以查看 v2.84 系列的一些非常早期的预览。他们有一个新SKRuntimeEffect的,你可以利用。

查看预览提要:https ://aka.ms/skiasharp-eap/index.json

您必须查看https://github.com/mono/SkiaSharp/pull/1321 PR 的构建:

v2.84.0-pr.1321.*

请参阅此示例:https ://github.com/mono/SkiaSharp/issues/1319#issuecomment-640529824

// input values
SKCanvas canvas = ...;
float threshold = 1.05f;
float exponent = 1.5f;

// shader
var src = @"
in fragmentProcessor color_map;

uniform float scale;
uniform half exp;
uniform float3 in_colors0;

void main(float2 p, inout half4 color) {
    half4 texColor = sample(color_map, p);
    if (length(abs(in_colors0 - pow(texColor.rgb, half3(exp)))) < scale)
        discard;
    color = texColor;
}";
using var effect = SKRuntimeEffect.Create(src, out var errorText);

// input values
var inputs = new SKRuntimeEffectInputs(effect);
inputs.Set("scale", threshold);
inputs.Set("exp", exponent);
inputs.Set("in_colors0", new[] { 1f, 1f, 1f });

// shader values
using var blueShirt = SKImage.FromEncodedData(Path.Combine(PathToImages, "blue-shirt.jpg"));
using var textureShader = blueShirt.ToShader();
var children = new SKRuntimeEffectChildren(effect);
children.Set("color_map", textureShader);

// create actual shader
using var shader = effect.ToShader(inputs, children, true);

// draw as normal
canvas.Clear(SKColors.Black);
using var paint = new SKPaint { Shader = shader };
canvas.DrawRect(SKRect.Create(400, 400), paint);
于 2020-07-01T05:03:03.447 回答