UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合

请添加图片描述

1.Blend混合

// 正常,透明度混合  Normal
Blend SrcAlpha OneMinusSrcAlpha
//柔和叠加  Soft Additive
Blend OneMinusDstColor One
//正片叠底 相乘  Multiply
Blend DstColor Zero
//两倍叠加 相加  2x Multiply
Blend DstColor SrcColor
//变暗  Darken
BlendOp Min
Blend One One
//变亮  Lighten
BlendOp Max
Blend One One
//滤色  Screen
Blend OneMinusDstColor One   //或者 Blend One OneMinusSrcColor
//线性减淡  Linear Dodge
Blend One One

2.Blend算法

//Darken变暗
float3 Darken(float3 Src, float3 Dst) {
   return saturate(min(Src.rgb, Dst.rgb));
}
//Multiply正片叠底
float3 Multiply(float3 Src, float3 Dst) {
   return saturate((Src.rgb*Dst.rgb));
}
//Color Burn颜色加深
float3 ColorBurn(float3 Src, float3 Dst) {
   return saturate((1.0-((1.0-Dst.rgb)/Src.rgb)));
}
//Linear Burn线性加深
float3 LinearBurn(float3 Src, float3 Dst) {
   return saturate((Src.rgb+Dst.rgb-1.0));
}
//Lighten变亮
float3 Lighten(float3 Src, float3 Dst) {
   return saturate(max(Src.rgb,Dst.rgb));
}
//Screen滤色
float3 Screen(float3 Src, float3 Dst) {
   return saturate((1.0-(1.0-Src.rgb)*(1.0-Dst.rgb)));
}
//Color Dodge颜色减淡
float3 ColorDodge(float3 Src, float3 Dst) {
   return saturate((Dst.rgb/(1.0-Src.rgb)));
}
//Linear Dodge线性减淡
float3 LinearDodge(float3 Src, float3 Dst) {
   return saturate((Src.rgb+Dst.rgb));
}
//Overlay叠加
float3 Overlay(float3 Src, float3 Dst) {
        return saturate(( Dst.rgb > 0.5 ? (1.0-(1.0-2.0*(Dst.rgb-0.5))*(1.0-Src.rgb)) : (2.0*Dst.rgb*Src.rgb) ));
}
//Hard Light强光
float3 HardLight(float3 Src, float3 Dst) {
   return saturate((Src.rgb > 0.5 ?  (1.0-(1.0-2.0*(Src.rgb-0.5))*(1.0-Dst.rgb)) : (2.0*Src.rgb*Dst.rgb)) );
}
//Vivid Light亮光
float3 VividLight(float3 Src, float3 Dst) {
   return saturate(( Src.rgb > 0.5 ? (Dst.rgb/((1.0-Src.rgb)*2.0)) : (1.0-(((1.0-Dst.rgb)*0.5)/Src.rgb))));
}
//Linear Light线性光
float3 LinearLight(float3 Src, float3 Dst) {
   return saturate(( Src.rgb > 0.5 ? (Dst.rgb + 2.0*Src.rgb -1.0) : (Dst.rgb + 2.0*(Src.rgb-0.5))));
}
//Pin Light点光
float3 PinLight(float3 Src, float3 Dst) {
   return saturate(( Src.rgb > 0.5 ? max(Dst.rgb,2.0*(Src.rgb-0.5)) : min(Dst.rgb,2.0*Src.rgb) ));
}
//Hard Mix实色混合
float3 HardMix(float3 Src, float3 Dst) {
   return saturate(round( 0.5*(Src.rgb + Dst.rgb)));
}
//Difference差值
float3 Difference(float3 Src, float3 Dst) {
   return saturate(abs(Src.rgb-Dst.rgb));
}
//Exclusion排除
float3 Exclusion(float3 Src, float3 Dst) {
   return saturate((0.5 - 2.0*(Src.rgb-0.5)*(Dst.rgb-0.5)));
}
//Subtract减去
float3 Subtract(float3 Src, float3 Dst) {
   return saturate((Dst.rgb-Src.rgb));
}
//Divide划分
float3 Divide(float3 Src, float3 Dst) {
   return saturate((Dst.rgb/Src.rgb));
}

二、RGB、HSV/HSB、HSL的转换

// RGB转HSV/HSB
float3 RGBToHSV( float3 Color ){
    float4 p = lerp(float4(Color.bg, -1.0,2.0 / 3.0), float4(Color.gb, 0.0, -1.0 / 3.0), step(Color.b, Color.g));
    float4 q = lerp(float4(p.xyw, Color.r), float4(Color.r, p.yzx), step(p.x, Color.r));
    float d = q.x - min(q.w, q.y);
    float e = 1.0e-10;
    return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}

// HSV/HSB转RGB
float3 HSVToRGB( float3 Color ){
    return lerp(float3(1,1,1),saturate(3.0*abs(1.0-2.0*frac(Color.r+float3(0.0,-1.0/3.0,1.0/3.0)))-1),Color.g)*Color.b;
}

// HSV/HSB转HSL
float3 HSVToHSL( float3 HSV){
    float L = HSV.b - 0.5 * HSV.g;
    return float3(HSV.r,HSV.g * HSV.b / (1 - abs(2 * L -1)),L);
}

// HSL转HSV/HSB
float3 HSLToHSV( float3 HSL){
    float B = HSL.b + 0.5 * HSL.g * (1 - abs(2 * HSL.b - 1));
    return float3(HSL.r,2 - 2 * HSL.b / B,B);
}

三、UV序列帧动画

//UV序列帧动画,wid--宽度数量,hei--高度数量,tile--采样第几个(排序从左下角到右下角),uv--UV
float2 UVTile(float wid,float hei,float tile,float2 uv)
{
    float UVTile_ty = floor(tile / wid);
    float UVTile_tx = tile - wid * UVTile_ty;
    float2 UVTile = (uv + float2(UVTile_tx, UVTile_ty)) / float2( wid, hei);
    return UVTile;
}

四、重映射

//重映射,把值Val,从[iMin,iMax]重映射到[oMin,oMax]
float Remap(float Val,float iMin,float iMax,float oMin,float oMax)
{
    return (oMin + ( (Val - iMin) * (oMax - oMin) ) / (iMax - iMin));
}

五、旋转UV

//旋转UV,uv--原来的UV  centre--旋转中心点  rad--旋转弧度  返回最新的UV
float2 RotatorUV(float2 uv,float2 centre,float rad)
{
    float c = cos(rad);
    float s = sin(rad);
    return (mul(uv - centre,float2x2( c, -s, s, c)) + centre);
}

持续更新中…

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

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

相关文章

一款前端开发工具Hbuilder

背景:最近日在接触前同事留下的一个VUE项目(只有前端代码,后台服务压根没写真不知道以前是怎么糊弄过去的)时,发现一款可以快速开发前端的软件;今日分享一下。 当我打开项目时发现,有个app.vue…

C语言——详解字符函数和字符串函数(一)

Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 文章目录 🎆1.字符分类函数💯💯⏩1.1 什么是字符分类函数的?💯💯⏩1.2 字符函数的类型有哪…

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测 目录 回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM多变量回归预测…

ffmpeg解码和渲染理解

ffmpeg解码和渲染理解 ffmpeg视频解码步骤 FFmpeg 是一个功能强大的跨平台多媒体处理工具,包含了音视频编解码、封装/解封装、过滤器等功能。下面是一般情况下使用 FFmpeg 进行视频解码的步骤: 初始化 FFmpeg 库:首先需要初始化 FFmpeg 库&a…

linux系统达梦数据库(安装及操作)

新建 dmdba 用户 注意: 安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库。 创建用户所在的组,命令如下: groupadd dinstall 创建用户,命令如下: useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba 修…

一文彻底搞懂OSI七层模型和TCP/IP四层模型

文章目录 1. OSI七层模型2. TCP/IP四层模型 1. OSI七层模型 OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的…

口才提升秘籍:马云的说话之道你也能学会!

口才提升秘籍:马云的说话之道你也能学会! 在商界,马云以其卓越的领导才能和出色的口才赢得了广泛的赞誉。他的每一次演讲都充满智慧和力量,不仅激发了员工的斗志,也赢得了合作伙伴的信任。那么,马云是如何…

ctf杂项总结

1.文件无法打开 1.1.文件拓展名损坏/错误导致 方法: 1.使用kali当中的file命令查看,之后修改为正确的后缀即可 2.通过16进制编辑器打开查看文件头 3.文件头残缺/错误,可以先使用kail当中的file命令查看它的类型,之后再通过 16…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高,出行方式多样化,也以私家车为主,那么既然私家车的需求不断增长,那么基于驾校的考核管理也就不断增强,那么业务系统也就慢慢的随之加大。信息…

运维自动化之ansible工具

目录 前言 一、Ansible 工具概述 1、Ansible 功能 2、Ansible 特性 3、Ansible 优缺点 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 二、Ansible 安装和基础用法 1、Ansible 安装 1.1 yum源安装 1.2 使用python编译安装 1.3 Git方式安装 2、Ansib…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,来看看他们之…

天地图全国幼儿园数据下载与处理分析

概述 在看天地图服务资源的时候看到有个“幼儿园”的数据,好奇点开看了下,下载下来数据差看了下,数据质量还不错。本篇文章给大家分享一下这个数据的处理以及一些简单的统计分析结果。 数据下载 通过地址https://service.tianditu.gov.cn/…

Flutter 多语言、主题切换之GetX库

多语言、主题切换之GetX库 前言正文一、配置项目二、模拟UI三、语言配置① 常量键② 语言配置文件③ 配置 四、持久化五、切换语言① my_home.dart② home.dart③ mine_controller.dart④ language_setting_controller.dart⑤ language_setting.dart⑥ mine.dart 六、切换主题①…

流水账-20240314

目录 Linux系统删除文件后,磁盘大小没变化mysql事务和neo4j事务冲突误诊描述解决方法网上提供的方法重置Neo4j密码,成功解决问题高版本低版本 Linux系统删除文件后,磁盘大小没变化 lsof L1|grep 删除的文件名kill进程 mysql事务和neo4j事务…

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态,充分了解对客户…

高等数学相关知识点整理汇总

说明:由于工作原因可能更新不及时,内容逐步完善中… 一、空间解析几何与向量代数 二、多元函数的微分学 三、重积分 四、曲线积分与曲面积分 五、常微分方程 六、无穷级数

Qt 5.14.2插入VTK 9.0.1 窗口并绘制图形

文章目录 准备环境使用VS创建Qt Widget项目配置VTK依赖调试C/C链接器 添加vtk窗口测试代码 参考链接: VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客 QT5VTK9.1最新配置方法_qt vtk-CSDN博客 VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客 准…

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…

深信服技术认证“SCCA-C”划重点:深信服应用交付AD

为帮助大家更加系统化地学习云计算知识,高效通过云计算工程师认证,深信服特推出“SCCA-C认证备考秘笈”,共十期内容。“考试重点”内容框架,帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证(S…

leetcode代码记录(找到小镇的法官

目录 1. 题目:2. 我的代码:小结: 1. 题目: 小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。 如果小镇法官真的存在,那么: 小镇法官不会信任任何…