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

本文主要是介绍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);
}

持续更新中…

这篇关于UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791505

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更