美文网首页
使用computeShader加速Texture2D叠加处理

使用computeShader加速Texture2D叠加处理

作者: Kasug | 来源:发表于2019-01-05 11:15 被阅读0次

对于Texture2D,Unity提供了Texture2D.SetPixels(x,y,Color)来设置每个像素的RGBA值,但这种方法效率较低。
我这里使用一张2048x1024的背景图,和一张256x256的前景图进行合并

    public Texture2D characterTex;
    public Texture2D inputTexture;

    public RawImage outputImage;


    void Start () {
        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
        watch.Start();

        Texture2D tex = new Texture2D(inputTexture.width, inputTexture.height);

        int inputWidth = inputTexture.width;
        int inputHeight = inputTexture.height;

        int characterWidth = characterTex.width;
        int characterHeight = characterTex.height;    

        //定位到左下角
        for (int x = 0; x < inputWidth; x++)
        {
            for (int y = 0; y < inputHeight; y++)
            {
                if (x < characterWidth && y < characterHeight)
                    tex.SetPixel(x, y, characterTex.GetPixel(x, y));
                else
                    tex.SetPixel(x, y, inputTexture.GetPixel(x, y));
            }
        }

        tex.Apply();
        outputImage.texture = tex;

        watch.Stop();

        print(watch.Elapsed.TotalMilliseconds);
    }

结果显示为大约550ms


图片.png

再来看看ComputeShader的加速效果
新建立ComputerShader输入以下代码

#pragma kernel CSMain

RWTexture2D<float4> outputTexture;
Texture2D inputTexture;
Texture2D characterTex;
int x;
int y;
[numthreads(8, 8, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
    // TODO: insert actual code here!
    float R = (id.x >= x || id.y >= y) ? inputTexture[id.xy].r : characterTex[id.xy].r;
    float G = (id.x >= x || id.y >= y) ? inputTexture[id.xy].g : characterTex[id.xy].g;
    float B = (id.x >= x || id.y >= y) ? inputTexture[id.xy].b : characterTex[id.xy].b;
    float A = 1;
    
    outputTexture[id.xy] = float4(R, G, B, A);
   
}

再建立一个cs脚本

    public Texture2D inputTexture;
    public RawImage outputImage;
    public ComputeShader shader;
    public Texture2D characterTex;

    void Start () {
        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
        watch.Start();

        RenderTexture tex = new RenderTexture(inputTexture.width, inputTexture.height, 24);
        tex.enableRandomWrite = true;
        tex.Create();
        outputImage.texture = tex;

        int kernel = shader.FindKernel("CSMain");
        shader.SetInt("x", characterTex.width);
        shader.SetInt("y", characterTex.height);
        shader.SetTexture(kernel, "inputTexture", inputTexture);
        shader.SetTexture(kernel, "characterTex", characterTex);
        shader.SetTexture(kernel, "outputTexture", tex);
        shader.Dispatch(kernel, inputTexture.width, inputTexture.height, 1);

        watch.Stop();

        print(watch.Elapsed.TotalMilliseconds);
    }

大约1ms左右,确实降低不少


图片.png

相关文章

  • 使用computeShader加速Texture2D叠加处理

    对于Texture2D,Unity提供了Texture2D.SetPixels(x,y,Color)来设置每个像素...

  • [Unity] 关于 ComputeShader中ThreadG

    今天遇到一个神奇的现象,我设置了一个100 * 100的 texture,然后使用 ComputeShader 让...

  • 视频处理

    使用 OpenCV 的 GPU 模块,使用独立显卡对视频处理进行加速 1.使用 CPU 进行处理 2.使用 GPU...

  • OpenCVforUnity案例说明

    Basic(基础) 场景名说明Texture2D To Mat Example演示Texture2D和自定义Mat...

  • 恩易Modbus网关,质量值得信赖

    Modbus网关不仅支持单台摄像机的字符信息处理,还可同时支持多台摄像机的叠加使用。每台字符叠加器最多可同时支持4...

  • Modbus网关是什么?有什么优势?

    Modbus网关不仅支持单台摄像机的字符信息处理,还可同时支持多台摄像机的叠加使用。每台字符叠加器最多可同时支持4...

  • Cocos2dx Sprite&ImageView换图

    Sprite 有两种方式: 使用setTexture(Texture2D)函数,可以重新设置精灵类的纹理图片。/*...

  • Flutter 开发大全

    Skia是个2D向量图形处理函数库 CPU 渲染称之为软件绘制(关闭硬件加速时使用该引擎,开启硬件加速时使用Ope...

  • 并行优化、多线程

    OpenCV使用pthread实现多线程加速处理图像(C++)[https://blog.csdn.net/guy...

  • 「临摹练习」红宝石

    以临摹红宝石主要学习以下技能 背景的简单处理 叠加新的图层,并通过羽化处理,使纯色背景看起不显单调 钢笔工具的使用...

网友评论

      本文标题:使用computeShader加速Texture2D叠加处理

      本文链接:https://www.haomeiwen.com/subject/yikrrqtx.html