Unity中UI组件对Shader调色

news2025/2/22 6:42:17

文章目录

  • 前言
  • 一、原理
    • 在Shader中直接暴露的Color属性,不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色,如果需要在修改组件中的颜色时,使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点着色器的数据增加一个变量,用于给顶点着色器使用。
  • 二、实现
    • 1、在结构体 appdata 中,加入一个用COLOR语义的变量,用于代表传入的顶点颜色
    • 2、在结构体 v2f 中,加入一个用 TEXCOORD1语义定义变量,这里的语义其实没有什么含义,主要作用是精度的不同。
    • 3、在片元着色器中,让顶点颜色 和 采样后的纹理混合输出即可


前言

Unity中UI组件对Shader调色


一、原理

在Shader中直接暴露的Color属性,不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色,如果需要在修改组件中的颜色时,使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点着色器的数据增加一个变量,用于给顶点着色器使用。


二、实现

1、在结构体 appdata 中,加入一个用COLOR语义的变量,用于代表传入的顶点颜色

//定义一个语义为Color的4维向量,用于传入顶点颜色,设置语义为COLOR后,这个变量就会与顶点颜色对应
struct appdata
{
//顶点信息
float4 vertex:POSITION;
float2 uv : TEXCOORD;
//这里定义一个语义为Color的4维向量,用于传入顶点颜色,设置语义为COLOR后,这个变量就会与顶点颜色对应
fixed4 color:COLOR;
};

2、在结构体 v2f 中,加入一个用 TEXCOORD1语义定义变量,这里的语义其实没有什么含义,主要作用是精度的不同。

在传入到片元着色器的数据中,只有 SV_POSITION 语义是必要的,这个用于存储转化到裁剪坐标下的位置信息。

//存储 顶点着色器输入到片元着色器的信息
struct v2f
{
//裁剪空间下的位置信息(SV_POSITION是必须的)
float4 pos:SV_POSITION;
float2 uv : TEXCOORD;
//这里的语义主要代表精度不同,TEXCOORD 在这里只是代表高精度,可以使用COLOR语义,代表低精度
fixed4 color : TEXCOORD1;
};

3、在片元着色器中,让顶点颜色 和 采样后的纹理混合输出即可

示例代码:

Shader"MyShader/P1_1_4"
{
    Properties
    {
        //命名要按标准来,这个属性才可以和Unity组件中的属性产生关联
        //比如说,在更改 Image 的源图片时,同时更改这个
        [PerRendererData]_MainTex("MainTex",2D) = "white"{}
        
        [PerRendererData]_Color("Color",color) = (1,1,1,1)
    }
    SubShader
    {
        //更改渲染队列(UI的渲染队列一般是半透明层的)
        Tags {"Queue" = "TransParent"}
        //混合模式
        Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex  vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            //存储 应用程序输入到顶点着色器的信息
            struct appdata
            {
                //顶点信息
                float4 vertex:POSITION;
                float2 uv : TEXCOORD;
                //这里定义一个语义为Color的4维向量,用于传入顶点颜色,设置语义为COLOR后,这个变量就会与顶点颜色对应
                fixed4 color:COLOR;
            };
            //存储 顶点着色器输入到片元着色器的信息
            struct v2f
            {
                //裁剪空间下的位置信息(SV_POSITION是必须的)
                float4 pos:SV_POSITION;
                float2 uv : TEXCOORD;
                //这里的语义主要代表精度不同,TEXCOORD 在这里只是代表高精度
                fixed4 color : TEXCOORD1;
            };
            
            sampler2D _MainTex;
            fixed4 _Color;
            v2f vert(appdata v)
            {
                v2f o;
                //把顶点信息转化到裁剪坐标下
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.color = v.color;
                return o;
            }
            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 mainTex = tex2D(_MainTex,i.uv);
                return  mainTex * i.color;
            }
            
            ENDCG
        }
    }
}

效果(可以通过UI的Image组件中改变颜色,来对Shader调色了):
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker容器启动失败:找不到映像

Docker容器启动失败:找不到映像 Docker容器启动失败:找不到映像摘要 😕引言 😮正文 🤓为什么会找不到映像? 😕1. 映像不存在2. 映像标签错误3. 映像不兼容 如何预防和解决问题? &…

国家开放大学 考试试题训练

经济数学基础 参考 试题 导数基本公式: 积分基本公式: c0 ∫0dxc xaaxa-1 ∫xadxxa1a1c(a≠-1) axaxlna(a>0且a≠1) …

大转盘抽奖活动制作流程,让你轻松打造火爆营销活动

抽奖活动一直是商家吸引顾客、推广产品的利器之一。而如何让抽奖活动更加顺利、高效地进行呢?今天我们就要介绍的就是乔拓云平台,通过它,商家可以轻松地制作、发布抽奖活动,让您的营销更加便捷、迅速!以下是具体操作步…

总结 HTTP 协议的基本格式和 fiddler 的用法

HTTP基本格式 HTTP协议也是日常开发中非常常用的的一种协议,在众多协议栈里HTTP可能是实际开发中用的最多的。 注意 这里说的HTTP是指HTTP1以及HTTP2,他们都是基于TCP协议的,注意:如今最新版的HTTP3是基于UDP的。 但如今在互联网…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1)定义模型结构2)优化损失函数 3. 模型训练及保存1)模型训练2)模型保存 4. 模型应用1)制作页面2)模型导入及调用3&am…

【MySQL】 MySQL的增删改查(进阶)--壹

文章目录 🛫数据库约束🌴约束类型🎋NOT NULL约束🎍UNIQUE:唯一约束🌳DEFAULT:默认值约束🎄PRIMARY KEY:主键约束🍀FOREIGN KEY:外键约束&#x1f…

web:[ACTF2020 新生赛]Include

前提知识 文件包含漏洞 php伪协议 题目 点开题目,页面只显示一个tips,点进去看看 点进去之后 没有别的提示,先看源代码,恩,什么都没有 再看一下点进tips显示的页面,发现url中 flag可能就藏在这个页面中&…

需求是怎么一步一步变态的

最初的需求 需求是处理一些数据,数据例子: 而界面要显示的样子: 看起来不太难,可以分解出需求: 每一列的所有数据要都能参与选择,或者输入当一个参数选中之后,比如选中A选中1,则…

《人人都是提示工程师》读书笔记01.PDF

本书旨在介绍提示(prompt)工程师的工作内容和相关技能。本书首先讲述提示技术的基本工作原理、提示工程师的常用工具、提示技术的基础模式和提示技术的进阶知识(包括零样本提示、少样本提示和思维链提示);然后讲解自然…

uni-app跳转到另一个app

第一步&#xff1a; 首先要知道 app的包名 获取方式如下 第二步&#xff1a; 在第一个 demo1 app 一个页面中需要一个按钮去跳转 方法如下 <template><view class"content"><button click"tz">跳转</button></view> </…

【动态规划刷题 16】最长等差数列 (有难度) 等差数列划分 II - 子序列

1027. 最长等差数列 https://leetcode.cn/problems/longest-arithmetic-subsequence/ 给你一个整数数组 nums&#xff0c;返回 nums 中最长等差子序列的长度。 回想一下&#xff0c;nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] &#xff0c;且 0 < i1 <…

C++之浅拷贝、深拷贝、拷贝构造函数、拷贝赋值运算符、自定义的深拷贝函数应用总结(二百二十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

宝塔重装注意事项

欢迎关注我的公众号&#xff1a;夜说猫&#xff0c;让一个贫穷的程序员不靠打代码也能吃饭~ 前言 宝塔8.0版本&#xff0c;宝塔卸载重装&#xff0c;或者重装Linux系统后重新安装宝塔也适用。 不能上来直接就执行安装宝塔脚本&#xff0c;除非之前没有安装过宝塔。 步骤 1、…

短视频源码php

对于php短视频源码而言&#xff0c;视频质量与用户使用体验息息相关&#xff0c;高质量的视频观感更有利于留下用户。但实际上视频质量很容易受到各种因素的影响&#xff0c;接下来我们分析一下php短视频源码中导致视频出现异常的各种原因吧。 所谓短视频源码的原生开发&#…

华为云云耀云服务器L实例评测|华为云上安装kafka

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上安装kafka一、kafka介绍二、华为云主机准备三、kafka安装1. 安装什么版本java2. 安装zookeeper服务3. 使用systemctl 管理启动ZooKeeper服务4. 修改kafka配置5. 使用systemctl 管理启动kafka服务6. 创建一个测试 topi…

Springboot 实践(21)服务熔断机制

在微服务架构中&#xff0c;服务众多&#xff0c;通常会涉及到多个服务层的调用&#xff0c;一旦基础服务发生故障&#xff0c;很可能会导致级联故障&#xff0c;继而造成整个系统不可用&#xff0c;这种现象被称为服务雪崩效应。 服务熔断引入熔断器概念&#xff0c;熔断器如果…

libopenssl 实现私钥加密公钥解密

在需要验证可信来源时&#xff0c;需要用到签名验签。因此&#xff0c;需要使用私钥加密&#xff0c;公钥解密&#xff0c;取得被加密的信息。这就会使用到私钥加密&#xff0c;公钥解密的场景了。 参考&#xff1a; https://github.com/openssl/openssl/issues/20493 https:/…

【Python】Pycharm使用anaconda中的PaddleOCR的虚拟环境 卡在loading package list(保姆级图文)

目录 异常表现&#xff1a;解决方法1. 试着使用pytcharm的http代理&#xff08;很确定没用&#xff0c;无法成功&#xff0c;直接看下一步&#xff09;2. conda换国内源&#xff08;换源后重启&#xff1f;不知道有没有用&#xff0c;不确定是否关键&#xff09;3. 在conda中更…

2023年浙工商MBA新生奖学金名单公布,如何看待?

浙工商MBA项目官方最新公布了2023年的非全日制新生奖学金名单&#xff0c;按照政策约定&#xff0c;共分为特等奖学金1名&#xff0c;一等奖学金10名&#xff0c;二等奖学金15名&#xff0c;三等奖学金30名&#xff0c;额度对应3万、1万、0.8万、0.5万不等&#xff0c;主要名单…

c++ 继承与多态

一、c如何解决菱形继承的问题 例子一 菱形继承问题 #include <iostream> #include <string.h> using namespace std; class Animal { public:int m_Age; }; class Sheep : public Animal {}; class Tuo : public Animal {}; class SheepTuo :public Sheep, publ…