⭐ Unity里 用Shader 去做实时动态绿幕抠图

1.先看一下效果

a.这是背景图片

b.抠完图之后(这里用的是扣去白色的)

2.shader代码如下

Shader "UniversalChromaKey" {
    Properties{
            _MainTex("Base (RGB)", 2D) = "white" {}
            _Sens("Sensibilidad", Range(0,.9)) = .3
            _Cutoff("Recorte", Range(0,.9)) = .2
            _Color("Chroma", Color) = (0, 1.0, 0)
    }
        SubShader{
                Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
                LOD 200


                CGPROGRAM
                #pragma surface surf Lambert alpha

                sampler2D _MainTex;
                float _Cutoff;
                float _Sens;
                half3 _Color;


                struct Input {
                        float2 uv_MainTex;
                };

                void surf(Input IN, inout SurfaceOutput o) {
                        half4 c = tex2D(_MainTex, IN.uv_MainTex);
                        o.Emission = c.rgb;


                        float aR = abs(c.r - _Color.r) < _Sens ? abs(c.r - _Color.r) : 1;
                        float aG = abs(c.g - _Color.g) < _Sens ? abs(c.g - _Color.g) : 1;
                        float aB = abs(c.b - _Color.b) < _Sens ? abs(c.b - _Color.b) : 1;

                        float a = (aR + aG + aB) / 3;

                        if (a < _Cutoff) {
                            o.Alpha = 0;
                        }
else {
   o.Alpha = 1;
}

}
ENDCG
            }
                FallBack "Diffuse"
}

3.相机脚本和控制shader脚本

using UnityEngine;
using System.Collections;
using UnityEngine.Video;
using UnityEngine.UI;
using System.IO;

public class CameraControl : MonoBehaviour
{
    /// <summary>
    /// 外部摄像头
    /// </summary>
    private WebCamTexture webTex;
    /// <summary>
    /// UI父物体
    /// </summary>
    private Canvas canvas;
    /// <summary>
    /// 摄像头映射画面
    /// </summary>
    private RawImage Camera_image;


    private void Start()
    {
        canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
        Camera_image = canvas.transform.Find("Camera_screen").GetComponent<RawImage>();

        StartCoroutine(CallCamera());


    }
    /// <summary>
    /// 打开摄像头
    /// </summary>
    /// <returns></returns>
    IEnumerator CallCamera()
    {
        //等待用户允许访问
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        //如果用户允许访问,开始获取图像        
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            string devicename = devices[1].name;
            webTex = new WebCamTexture(devicename, Screen.width, Screen.height);
            Camera_image.texture = webTex;
            webTex.Play();
        }
    }



}

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ShaderControls : MonoBehaviour
{


    float sensS, cutoffS;
    Color colS;

    // Use this for initialization
    void Start()
    {
        sensS = GetComponent<RawImage>().material.GetFloat("_Sens");
        cutoffS = GetComponent<RawImage>().material.GetFloat("_Cutoff");
        colS = GetComponent<RawImage>().material.GetColor("_Color");

        sens = sensS;
        cutoff = cutoffS;

    }

    // Update is called once per frame
    void Update()
    {

    }

    public float sens, cutoff;
    public string r = "99", g = "205", b = "77";
    //void OnGUI()
    //{
    //    sens = GUI.HorizontalSlider(new Rect(25, 25, 100, 30), sens, 0.0f, 1.0f);
    //    cutoff = GUI.HorizontalSlider(new Rect(25, 70, 100, 30), cutoff, 0.0f, 1.0f);

    //    r = GUI.TextField(new Rect(25, 120, 40, 20), r);
    //    g = GUI.TextField(new Rect(70, 120, 40, 20), g);
    //    b = GUI.TextField(new Rect(120, 120, 40, 20), b);

    //    if (GUI.Button(new Rect(25, 160, 100, 30), "Reset"))
    //    {
    //        sens = sensS;
    //        cutoff = cutoffS;

    //        r = (colS.r * 255f).ToString();
    //        g = (colS.g * 255f).ToString();
    //        b = (colS.b * 255f).ToString();
    //    }


    //    GetComponent<RawImage>().material.SetFloat("_Sens", sens);
    //    GetComponent<RawImage>().material.SetFloat("_Cutoff", cutoff);
    //    try
    //    {
    //        Color col = new Color(int.Parse(r) / 255f, int.Parse(g) / 255f, int.Parse(b) / 255f);
    //        //print (col);
    //        GetComponent<RawImage>().material.color = col;

    //    }
    //    catch (UnityException e)
    //    {
    //    }
    //}
}

4.调整场景里的注意事项

a.主相机

b.光照

c.canvas

d.脚本挂载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/220326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】AI作图最全提示词prompt集合(收藏级)

目录 一、正向和负向提示词 二、作图参数 你好&#xff0c;我是giszz. AI做图真是太爽了&#xff0c;解放生产力&#xff0c;发展生产力。 但是&#xff0c;你是不是也总疑惑&#xff0c;为什么别人的图&#xff0c;表现力那么丰富呢&#xff0c;而且指哪打哪&#xff0c;要…

模拟电路学习笔记(一)之芯片篇(持续更新)

模拟电路学习笔记&#xff08;一&#xff09;之芯片篇&#xff08;持续更新&#xff09; 1.CD4047BE芯片 CD4047是一种包含高电压的多谐振荡器&#xff0c;该器件的操作可以在两种模式下完成&#xff0c;分别是单稳态和非稳态。CD4047需要一个外部电阻器和电容器来决定单稳态…

二叉树的前序中序后序遍历

二叉树的前序中序后序遍历-含递归和迭代代码 前序(中左右)中序(左中右)后序(左右中) 前序(中左右) 对于二叉树中的任意一个节点&#xff0c;先打印该节点&#xff0c;然后是它的左子树&#xff0c;最后右子树 A-B-D-E-C-F //递归 const preorderTraversal (root) > {const…

基于ROPNet项目训练modelnet40数据集进行3d点云的配置

项目地址&#xff1a; https://github.com/zhulf0804/ROPNet 在 MVP Registration Challenge (ICCV Workshop 2021)&#xff08;ICCV Workshop 2021&#xff09;中获得了第二名。项目可以在win10环境下运行。 论文地址&#xff1a; https://arxiv.org/abs/2107.02583 网络简介…

flask web学习之flask与http(一)

文章目录 一、请求响应循环二、HTTP请求1. 请求报文2. request对象3. 在flask中处理请求3.1 路由匹配3.2 设置监听的http方法3.3 URL处理 三、请求钩子 一、请求响应循环 每一个web应用都包含这种处理方式&#xff0c;请求-响应循环&#xff1a;客户端发出请求&#xff0c;服务…

实战经验分享,Python 连接 Oracle 踩坑实录

最近的一个测试任务需要测试 oracle 同步 hive 数据库的性能&#xff0c;那就需要对 oracle 数据库灌注测试数据。我就又打开了我的IDE&#xff0c;准备把我之前一下可以灌50w数据到 MySQL 的代码&#xff0c;改一改&#xff0c;直接用。 因为我在网上看到&#xff0c;语法上也…

基于Springboot的社区医院管理服务系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区医院管理服务系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

高低温交变湿热实验箱

产品概述 武汉凯迪正大高低温实验箱&#xff08;恒温恒湿试验箱&#xff09;乃针对各种材质表面处理&#xff0c;包含涂料、电镀、有机及无机皮膜&#xff0c;阳极处理&#xff0c;防锈油等防腐处理后测试其耐腐蚀性&#xff0c;从而确立产品的质量。 产品特点 1、内箱尺寸…

全网最新最全面的Appium自动化:Appium常用操作之按键类操作

按键类操作 按键类操作用来模拟在手机设备上进行按键操作&#xff08;推荐使用 方式一 &#xff09; 方式一、press_keycode(self,keycode,metastateNone,flagsNone)&#xff1a;模拟按键输入&#xff0c;其中&#xff1a; keycode&#xff1a;发送到设备的键值编码可以通过An…

华为快应用中自定义Slider效果

文章目录 一、前言二、实现代码三、参考链接 一、前言 在华为快应用中官方提供了<slider>控件&#xff0c;但是这个控件的限制比较多&#xff0c;比如滑块无法自定义&#xff0c;所以这里进行下自定义&#xff0c;自己修改样式。 二、实现代码 整体效果如下: 源码如下…

【数据结构(七)】查找算法

文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中&#xff0c;我们…

全面解析修复msvcr120.dll缺失问题的方法,msvcr120.dll丢失的原因

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“msvcr120.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;本文…

Linux基础项目开发1:量产工具——UI系统(五)

前言&#xff1a; 前面我们已经把显示系统、输入系统、文字系统搭建好了&#xff0c;现在我们就要给它实现按钮操作了&#xff0c;也就是搭建UI系统&#xff0c;下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…

使用rust slint开发桌面应用

安装QT5&#xff0c;过程省略 安装rust&#xff0c;过程省略 创建工程 cargo new slint_demo 在cargo.toml添加依赖 [dependencies] slint "1.1.1" [build-dependencies] slint-build "1.1.1" 创建build.rs fn main() {slint_build::compile(&quo…

使用 async/await 是必须避免的陷阱

使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs&#xff0c;那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲&#xff0c;这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质&a…

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…

【mysql】mysgld.log文件太大怎么办

我们有一台测试服务器。跑着一个msyq&#xff0c;发现没有空间了。差看日志文件占用了很多。 怎么破 使用下面命令 echo "" >mysqld.log 执行命令后

PostGIS学习教程九:空间连接

PostGIS学习教程九&#xff1a;空间连接 空间连接&#xff08;spatial joins&#xff09;是空间数据库的主要组成部分&#xff0c;它们允许你使用空间关系作为连接键&#xff08;join key&#xff09;来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…

直播预告 | 降本增效持续深化,如何找准 FinOps 关键着力点?

企业落地 FinOps 有哪些实施路径和阶段规划&#xff1f;2023 年&#xff0c;业界 FinOps 取得了哪些进展&#xff1f;12 月 6 日&#xff0c;「降本增效持续深化&#xff0c;如何找准 FinOps 关键着力点」专题直播即将开讲。小红书基础技术部混合云资源管理负责人梁啟成将带来《…

无法从SD卡中删除文件怎么办?

在使用SD卡时&#xff0c;有时我们会无法从SD卡中删除文件&#xff0c;那么这该怎么办呢&#xff1f;下面我们就一起来了解一下吧。 方式1. 检查SD卡&#xff08;读卡器&#xff09;上的写保护选项卡 对于某些SD卡&#xff0c;SD卡的一侧可能有一个开关&#xff0c;并有标有Lo…
最新文章