【Unity Shader】效果公式总结

Unity中复刻Photoshop图层混合效果:从公式到Shader的完整实现指南 本文详细解析了在Unity中复刻Photoshop图层混合效果的完整实现过程,从数学公式到Shader代码的逐步指导。涵盖了27种混合模式的实现方法,包括正片叠底、滤色、叠加等核心模式,并提供了性能优化技巧和移动端适配方案,帮助开发者高效实现专业级图像合成效果。 阅读详情

a.漫反射公式:

diff=C*max(0,cos<L,N>);//C是颜色和强度_LightColor0.rgb

代码: diff=max(0,dot(i.normal,i.lightDir))//i的单位向量and单位法向量

c=tex2D(tex,i.uv)_LightColor0diff//_LightColor0表示的是场景中平行光的颜色和强度


b.高光反射公式:

Spec=pow(max(0,cos(R,V),gloss))//R 单位反射向量reflect(ray,normal)函数获取,V视线单位方向向量 ,gloss光色度

代码: Spec=pow(max(0),dot(reflect(-i.lightDir,i.normal),32))

c=c**_LightColor0*(diff+Spec)


纹理 uv坐标是顶点存储了图片上的坐标

_MainTex (“Main Tex”, 2D) = “white” {}

sampler2D _MainTex;

float4 _MainTex_ST;//Unity中 纹理_ST来默认声明该纹理的属性_MainTex_ST.xy表示Scale, Till缩放,_MainTex_ST.zw表示Transform 偏移

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//vs输入纹理坐标和纹理值输出UV,ps对uv进行纹理采样和计算。UV通常在0-1范围,等于o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;//反射率

法线贴图:

xyz映射存成rgb值。一般存在切线空间,z轴法线方向,x轴切线方向,y轴副(法)切线方向

TANGENT_SPACE_ROTATION;//Unity来获取rotation矩阵,从模型空间到切线空间变换的矩阵。仅存在旋转和平移时,一个矩阵的转置矩阵等于他的逆矩阵。

自己实现:

float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; //切线空间的w分量用来存储负法线向内还是向外

float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);//float3x3是按行存储

float3 tangentNormal = UnpackNormal(packedNormal);Unity将法线贴图纹理坐标0,1映射到正常法线坐标-1,1,返回切线空间下的法线方向。法线贴图要设置成Normal格式。该设置unity有优化 rgb值不再是法线xyz的映射了,如果不设置的话要自己算 该公式不能用。

自己实现:

tangentNormal.xy = (packedNormal.xy * 2 - 1) * _BumpScale;//坐标反映射,自己计算的方法

tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));//通过xy计算z


屏幕后处理:

void OnRenderImage(RenderTexture src, RenderTexture dest){}//全部渲染完后将调用,屏幕纹理存在src上,用来计算后通过dest返回,添加[ImageEffectOpaque]属性,可使不透明物体(AlphaTest)被渲染完后立即调用.

Graphics.Blit(src, dest);//直接copy纹理。src是屏幕当前或上一步渲染的纹理,dest是目标纹理

Graphics.Blit(src, dest, material,pass=-1);//将把src传到shader的material的_MainTex纹理。经过material(shader)的处理后输出到dest渲染到屏幕.pass默认是-1会调用所有pass,否则只调用给定顺序的pass。指定pass渲染很重要。

基于颜色变化的边缘检测:Sobel卷积算法,对边缘点进行采样计算 和特定矩阵卷积相乘。

高斯模糊:多次采样纹理混合 消耗较大

Bloom效果:把较亮区域提取出来进行高斯模糊 模拟扩散效果,然后再与原纹理混合。

运动模糊:将上一帧的屏幕图像存到renderTexture中,然后执行Graphics.Blit(src, renderTexture, material),shader将开启混合Blend SrcAlpha OneMinusSrcAlpha把src纹理和目标缓冲纹理renderTexture进行混合,然后再Blit输出到dst进行渲染。就得到了运动模糊效果。


深度和法线纹理:

float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth));

_CameraDepthNormalsTexture //unity中调用camera.depthTextureMode=DepthTextureMode.Depth/DepthNormal;这句话后可以通过该变量访问深度纹理或者深度和法线纹理,project空间

float depth=SAMPLE_DEPTH_TEXTURE(tex,uv)//对深度纹理进行采样,返回project空间下非线性深度值。和tex2D类似 只是封装了平台。自动将NDC坐标下的深度映射(0,1)需要转换到(-1,1)veiw空间去计算

LinearEyeDepth(depth)负责把深度纹理的采样结果转换到视角view空间下的线性深度值

Linear01Depth(depth)则会返回一个范围在0,1的线性深度值

half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv);

half2 centerNormal = DecodeViewNormalStereo(sample1);//center.xy存的法线的映射值

float centerDepth = DecodeFloatRG(center.zw);//zw深度

DecodeDepthNormal(sample1,out centerNormal,out centerDepth)//获取采样的法线和深度

Camera.worldToCameraMatrix //世界转相机矩阵 world2view

Camera.cameraToWorldMatrix //相机转世界矩阵

Camera.projectionMatrix //get投影矩阵viewToproject 视角空间到2维投影空间矩阵,set自定义的投影矩阵。如果你改变这个矩阵,相机的渲染不再基于它的fieldOfView更新,直到调用ResetProjectionMatrix

默认把view2project矩阵叫成project矩阵,默认把World2view矩阵叫做view矩阵。比如ViewProject就是world 2 project矩阵

全局雾效

深度雾效:通过每个顶点的深度值计算出该点到摄像机的距离d,然后把距离d进行参与公式计算得到雾效图(远的雾浓 rgb值大,近的雾淡 rgb值小),再把原图和雾效图进行混合。一般用线性,指数,指数平方公式,ds采用指数平方。

地面雾效:通过深度值和摄像机的方向向量计算该点到摄像机的偏移量,再加上摄像机的位置得到该顶点在世界空间中的坐标,然后把该坐标的y值参与雾效计算。如果用坐标z参与计算和深度雾类似。

#pragma multi_compile_fog

基于法线的边缘检测:防止阴影等信息干扰检测,判断临近的4个点的法线和深度值是否是近似,如果差距过大则是边缘roberts算法。(屏幕后处理)


渲染轮廓线:第一个pass对顶点进行法线方向扩散渲染,第二个pass用真实渲染实际光照,覆盖第一次,对扩散的顶点未被覆盖的像素就产生了轮廓效果。(模型轮廓)


噪声:

消融效果:怪物消失渐散的效果,把某个像素值小于阈值的裁剪掉,阈值附近的值用burncolor进行混合。阴影的pass里边算阴影时也把该项给clip掉,这样阴影就动态变化了//clip(burn.r - _BurnAmount);

水面扰动效果:用时间去控制偏移距离,然后对该顶点的uv偏移两点的法线平均值来代替该点的法线值。水面=反射+折射+绕动

float2 speed = _Time.y * float2(_WaveXSpeed, _WaveYSpeed);

/ Get the normal in tangent space

fixed3 bump1 = UnpackNormal(tex2D(_WaveMap, i.uv.zw + speed)).rgb;

fixed3 bump2 = UnpackNormal(tex2D(_WaveMap, i.uv.zw - speed)).rgb;

fixed3 bump = normalize(bump1 + bump2);

全局(动态)雾效:通过时间控制噪声纹理的偏移距离,然后根据噪声颜色值来参与计算雾效浓度,然后计算雾效,就有了流动和淡浓的效果。

Unity中复刻Photoshop图层混合效果:从公式到Shader代码的完整指南 本文详细解析了在Unity中复刻Photoshop图层混合效果的完整流程,从数学公式到Shader代码实现。涵盖了27种混合模式的数学本质、色彩空间转换及性能优化技巧,帮助开发者精确还原设计效果,提升游戏与交互设计的视觉专业度。 阅读详情

相关推荐

Unity Shader入门精要——笔记

顶点数据–> 几何阶段:(顶点着色器–> 曲面细分着色器–>几何着色器–>裁剪–>屏幕映射)–>光栅化阶段(三角形设置–>三角形遍历–>片元着色器–>逐片元操作)–>屏幕图像顶点着色器:最基本的功能就是把模型的顶点坐标从模型空间转换到齐次裁剪坐标(通常串联成一个矩阵,即MVP矩阵)。

Andy Blog 1782

unity shader 效果公式

a.漫反射公式: diff=C*max(0,cos<L,N>);//C是颜色和强度_LightColor0.rgb 代码: diff=max(0,dot(i.normal,i.lightDir))//i的单位向量and单位法向量 c=tex2D(tex,i.uv)*_LightColor0*diff//_LightColor0表示的是场景中平行光的颜色和强度 ---------...

FoxGame的专栏 992

Unity Shader菲涅耳反射

公式: 实现如下: Shader "_Fresnel" { Properties { _MainTex ("Texture", 2D) = "white" {} _FresnelScale("Fresnel Scale",Range(0,1)) = 0.5 _Cubemap("Refraction Cubemap",Cube) = "_Skybox"{} ...

qq_44800780的博客 226

Unity Shader学习一:矢量的点积和叉积

矢量的点积 点积的名称来源于这个运算的符号:a•b。中间这个圆点符号是不可省略的,在Unity Shader中,可以直接使用形如dot(a,b)的代码来对两个矢量进行点积 的运算。 点积的公式由两种形式 第一种:两个三维矢量的点积是把两个矢量对应分量相乘然后再取和,最后的结果是一个标量, 公式为:a•b = (ax, ay, az)•(bx, by, bz) = axbx + ayby + azbz 矢量的点积满足交换律,即a•b = b•a 点积的几何意义很重要,因为点积几乎应用到了图形学的各个

qq_42720695的博客 3821

Unity Gerstner Waves水面波浪

根据《GPU Gems》的Gerstner 公式,实现水波的效果。 参考文档地址 https://developer.nvidia.com/gpugems/gpugems/part-i-natural-effects/chapter-1-effective-water-simulation-physical-models GersterWaves公式 定点偏移: 法线计算: 波长和速度的关...

u012740992的专栏 2640

Unity Shader学习:收缩、螺旋

Unity Shader学习:收缩、螺旋 这个效果老酷了,主要数学知识稍微涉及到点,详细原理可以看puppet_master的原文,大致实现了下,有需要的朋友可以看看。 扭曲效果基本原理:根据数学公式改变uv偏移,再叠加噪声偏移模糊场景。 效果图: C#部分: //屏幕后处理基类 using UnityEngine; using System.Collections; //非运行时也触发效...

咪咪博客 1725

Unity Shader---数学公式总结

转自:https://www.cnblogs.com/Fflyqaq/p/12553567.html 1、数学函数 2、几何函数 3、纹理映射函数 1、数学函数 dot(A,B) //点积 //点积结果为标量,主要用于求向量的夹角或b向量在a向量上的投影。 cross(A,B) //叉积 //叉积结果为向量,结果与这两个向量组成的平面垂直。主要用于3D图形学 mul(M, N) //矩阵M和矩阵N的积 mul(M, v) //矩阵M和列向量v的积 mul(v, M) //行向量v和矩阵M的积

youmangu的专栏 2037

菲涅尔公式实现边缘光效果

Shader"review/EdgeEmission" { ///标准光照模型 光照数据=自发光(E)+漫反射光(D)+环境光(A)+高光(S) Properties { _MainTexture("主贴图",2D)="white"{} _NormalMap("法线贴图",2D)="white"{} _SpecularColor("高光颜色",color)=(1,1,1,1) _Gloss("高光范围",Range(8,25

fchewqeqweqw的博客 1645

Unity Shader常用函数总结

  数学函数 Abs(x) :返回输入参数的绝对值; Clamp(x,a,b):如果x小于a则返回a;如果x大于b则返回b; Cross(A,B):返回两个三元向量的叉积; degree(x):输入参数为弧度值(radians),函数将其转换为角度值; determinant(m):计算矩阵的行列式因子; dot(A,B):返回A和B的点积; exp2(x): 2的x次...

陈高爽的博客 3374

【Unity Shader】 CubeMap(立方体贴图)

Unity Shader 立方体贴图 一、介绍CubeMap Shader中对CubeMap采样 Unity中如何制作CubeMap 二、Reflect CubeMap(反射立方体纹理用于环境映射) 环境映射原理 反射方向的计算 Unity Shader实现Reflection CubeMap(基于CubeMap的反射效果) 反射CubeMap的Shader代码 反射效果展示 ps:“...

赞美月亮的专栏 4万+

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

Unity Shader 学习笔记(13) 混合光源、光的衰减

Unity Shader 学习笔记(13) 混合光源、光的衰减 参考书籍:《Unity Shader 入门精要》 3D数学 学习笔记(8) 光照 混合光源的前向渲染一个BasePass处理平行光、四个点光源调用四次Additional Pass,四个点光源的顺序是依靠重要度排序的(光源强度、颜色、距离远近)。注意:只处理了逐像素光照,即光源渲染模式如果为Not Imoportant,则不会

l773575310的博客 3397

从Simulink仿真到DSP28335真机部署:PID闭环控制快速移植指南

本文详细介绍了如何将Simulink中的PID闭环控制算法快速移植到DSP28335嵌入式平台。通过模型与代码映射、浮点与定点数选择、定时器中断配置、物理输出实现以及调试技巧五个关键步骤,帮助工程师高效完成从仿真到真机部署的全过程,特别适合需要实现精确控制的嵌入式开发者。

weixin_42521843的博客 363

【Unity3d Shader】眨眼效果

眨眼效果常用于游戏中的剧情表现,先看效果图: 原理很简单: 椭圆公式: 当焦点在x轴时,椭圆的标准方程是:x^2/a^2+y^2/b^2=1,(a>b>0); 当焦点在y轴时,椭圆的标准方程是:y^2/a^2+x^2/b^2=1,(a>b>0); 核心代码如下: half4 color = IN.color; half x = IN.t...

PangNanGua的专栏 5719

osg3.6.5---osgEarth3.2 实现数字地球的加载

目前我在网上找得比较多的是osgearth2.10及以下的版本及加载数字地球的方法,但是我使用的是osg3.6.5和osgEarth3.。但是3.x版本和2.x版本差别很大,主要区别在于2.x有7个主要库,而3.x版本只有osgEarth这一个库。所以,特别记录一下。后面我讲他集成到qt的窗体在上传更新新的代码。1.直接上源码pro文件和cpp文件。

枫影竹韵的博客 1009

基于Simulink的异步电机定子磁链定向控制(SFOC)仿真

本文带你从零构建了异步电机SFOC系统​ 的完整Simulink仿真模型,实现了:✅ 搭建异步电机、逆变器、风机负载的主电路与传感器模型;✅ 用MATLAB Function实现定子磁链观测(电压模型)、坐标变换、双闭环PI控制;✅ 验证SFOC在转速跟踪(响应0.2s、超调4%)、转矩响应(恢复0.15s)中的高性能;✅ 对比RFOC,明确SFOC在参数鲁棒性(转子电阻+50%时波动<2%)上的独特优势;✅ 理解SFOC“定子磁链定向+解耦控制”的核心思想(低成本高鲁棒性驱动的工程实现)。

xiaoheshang_123的博客 389

Unity Shader Fresnel 菲涅尔反射

效果图 黄色的漫反射 天空盒镜面反射 资源 天空盒 https://assetstore.unity.com/packages/2d/textures-materials/sky/free-hdr-sky-61217 代码 Shader "DC/Lighting/Fresnel" { Properties { _MainTex ("Texture", 2D...

TDC的专栏 1097

【62】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标

本文针对工业相机拍摄的2000万像素图像中十字刻度尺的精确定位问题进行了研究。面对图像较暗、存在红黄干扰、记号笔涂抹及细节模糊等难点,提出了一种基于霍夫变换的解决方案。通过灰度化、反色、二值化预处理后,对比分析了多尺度霍夫直线(HoughLines)和渐进概率霍夫线段(HoughLinesP)两种方法的定位效果。实验结果表明,HoughLinesP由于具有最小线段长度和间隙约束,在直线贴合度和交点定位精度上表现更优,其返回的线段端点坐标也更便于后续处理。该研究为工业视觉中微小目标的精确定位提供了实用参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 975

【ShaderLab】利用shader实现中心遮罩缩放效果

写在前面 前几天一个以前的同事突然说想叫我帮忙搞个着色器,想要做一个UI的过场效果。大概就像类似动画片里面结束的时候的黑场效果,需要用一个透明UI图在一个全黑的背景中间做放大缩小的操作。当透明UI最大时,显示场景的其他UI,当透明UI最小时,整个场景黑场,效果如下。 其实这就是同事想要的效果了,实现的原理很简单,没花什么功夫就写出来了。后来想想写都写了,看看能...

ssssssilver的博客 1826

[系统安全] 四十七.恶意软件分析 (3)动态分析经典沙箱Cape的安装和基础用法详解

系统安全将更好地帮助初学者了解病毒逆向分析和系统安全。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 6737

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

shader 反射 水面_UnityShader-菲涅尔反射(Fresnel Reflection)

菲涅耳公式(或菲涅耳方程),由奥古斯丁·让·菲涅耳导出。用来描述光在不同折射率的介质之间的行为。由公式推导出的光的反射称之为“菲涅尔反射”。菲涅尔公式是光学中的重要公式,用它能解释反射光的强度、折射光的强度、相位与入射光的强度的关系在计算机图形学中的应用##一般运用于水面效果,试想一下你站在湖边,低头看向水里,你会发现近的地方非常清澈见底(反射较少),而看远的地方却倒映着天空(反射较多)。这就是菲...

weixin_42421187的博客 1407

XPATH注入漏洞检测工具汇总

环境 > Python3.7。

墨痕诉清风的博客 742

Unity_Shader_常用函数API

原文地址:https://blog.youkuaiyun.com/qq_38721111/article/details/83784276?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160370263119724838518430%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160370263119724838518430&biz_

weixin_42137574的博客 655

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一日一Shader·包裹【SS_25】

高光与法线贴图的直接结合不太好看,所以就用层叠的方式结合看看,结果实现了这种类似荔枝的效果。 Shader "MyShader/SS_25" { Properties { _MainTex("Texture", 2D) = ""{} _Normal("Normal", 2D) = ""{} _Emission("Emission",Range(0,1))=0.5 _Wrap("Wrap",Range(0,1))=0.5 ..

座右铭 261

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Unity Shader】高光反射

写在前面 只有一盏平行光的情况下 高光反射公式 高光反射公式:反射顏色=光源顏色反射係數pow(saturate(dot(摄像机視角方向,反射方向)) ,_Gloss) 用到的Unity内置函数和变量 UnityObjectToWorldNormal:把法線從模型空間轉換到世界空間 UnityWorldSpaceViewDir:獲取攝像機視角方向 unity_ObjectToWorld:模型空間到...

大大大老虎的博客 869
上一篇: 【Unity Shader 个人笔记】 渲染管线
下一篇: 【Unity Shader】API汇总
洛初_Rakuui
博客等级 码龄8年 11粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值