Unity Shader-边缘光(RimLight)效果

unity物体边缘发光shader_Unity的shader学习:实现物体边缘高亮 游戏里常出现的一种需求,就是鼠标触碰到角色或物体时高亮。正在学习unity的shader,看官方的shader示例,其中有一个就是Rim Lighting,但是官方示例那个模型并没有把这个效果凸显出来,然后查了下Rim Lighting,看到了这个例子,才明白是物体边缘高亮的效果,联想到玩的游戏,瞬间明白了。这也算是个挺有用的效果,所以细心研究了下,而且发现官方示例和上面这个博客都没有提到为什么这... 阅读详情

简介


写了两篇简单光照模型的shader的文章,虽然Unity自带的shader就有diffuse和specular,效果还比自己写的好,然而要想学好shader,基础还是很重要的。不然到网上到处找shader,扔到项目里,能用就好,完全不看性能的话,迟早会出事的。今天不看光照模型了,物理渲染还没搞懂,所以只好先来个简单的shader玩一玩。正好最近在和某基友玩黑魂,这货一出来总是自带一个特效-边缘光。于是本人强迫症发作,决定研究一下这个怎么实现。



RimLight--边缘发光效果,是一个比较常用的效果,实现简单,在普通的光照计算后只需要两步操作,就可以实现边缘光效果。看下面一幅图,简单介绍一下RimLight的原理:


所谓RimLight边缘发光,也就是说对应我们当前视角方向,物体上位于边缘的地方额外加一个光的效果。那么,怎么判断一个点是否在物体的边缘呢?就是通过法线方向和视线方向的夹角来判断。当视线方向V与法线方向N垂直时,这个法线对应的面就与视线方向平行,说明当前这个点对于当前视角来说,就处在边缘;而视线方向与法线方向一致时,这个法线对应的面就垂直于视线方向,说明当前是直视这个面。所以,我们就可以根据dot(N,V)来获得视线方向与法线方向的余弦值,通过这个值来区分该像素是否处在边缘,进而判断是否需要增加以及增加边缘光的强弱。


边缘光效果Unity下的实现


上面已经说完了边缘光效果的实现原理,下面附上完整的边缘光效果shader,基于之前介绍过的 兰伯特光照模型,增加了边缘光效果:
    //边缘发光Shader  
    //by:puppet_master  
    //2016.12.11  
      
    Shader "ApcShader/RimLight"  
    {  
        //属性  
        Properties{  
            _Diffuse("Diffuse", Color) = (1,1,1,1)  
            _RimColor("RimColor", Color) = (1,1,1,1)  
            _RimPower("RimPower", Range(0.000001, 3.0)) = 0.1  
            _MainTex("Base 2D", 2D) = "white"{}  
        }  
      
        //子着色器    
        SubShader  
        {  
            Pass  
            {  
                //定义Tags  
                Tags{ "RenderType" = "Opaque" }  
      
                CGPROGRAM  
                //引入头文件  
                #include "Lighting.cginc"  
                //定义Properties中的变量  
                fixed4 _Diffuse;  
                sampler2D _MainTex;  
                //使用了TRANSFROM_TEX宏就需要定义XXX_ST  
                float4 _MainTex_ST;  
                fixed4 _RimColor;  
                float _RimPower;  
      
                //定义结构体:vertex shader阶段输出的内容  
                struct v2f  
                {  
                    float4 pos : SV_POSITION;  
                    float3 worldNormal : TEXCOORD0;  
                    float2 uv : TEXCOORD1;  
                    //在vertex shader中计算观察方向传递给fragment shader  
                    float3 worldViewDir : TEXCOORD2;  
                };  
      
                //定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)  
                v2f vert(appdata_base v)  
                {  
                    v2f o;  
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
                    //通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;  
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
                    o.worldNormal = mul(v.normal, (float3x3)_World2Object);  
                    //顶点转化到世界空间  
                    float3 worldPos = mul(_Object2World, v.vertex).xyz;  
                    //可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省  
                    o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;  
                    return o;  
                }  
      
                //定义片元shader  
                fixed4 frag(v2f i) : SV_Target  
                {  
                    //unity自身的diffuse也是带了环境光,这里我们也增加一下环境光  
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;  
                    //归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的  
                    fixed3 worldNormal = normalize(i.worldNormal);  
                    //把光照方向归一化  
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  
                    //根据半兰伯特模型计算像素的光照信息  
                    fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;  
                    //最终输出颜色为lambert光强*材质diffuse颜色*光颜色  
                    fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;  
                    //进行纹理采样  
                    fixed4 color = tex2D(_MainTex, i.uv);  
                      
                    //以下为本篇主题:计算RimLight  
                    //把视线方向归一化  
                    float3 worldViewDir = normalize(i.worldViewDir);  
                    //计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘  
                    float rim = 1 - max(0, dot(worldViewDir, worldNormal));  
                    //计算rimLight  
                    fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);  
                    //输出颜色+边缘光颜色  
                    color.rgb = color.rgb* diffuse + rimColor;  
                      
                    return fixed4(color);  
                }  
      
                //使用vert函数和frag函数  
                #pragma vertex vert  
                #pragma fragment frag     
      
                ENDCG  
            }  
        }  
        //前面的Shader失效的话,使用默认的Diffuse  
        FallBack "Diffuse"  
    }  

下面看一下加了边缘光后的效果,普通diffuse shader:

白色边缘光效果:

黄色边缘光效果:

增加 景深效果和 Bloom效果,Bloom可以把亮的部分处理得更亮,有一种光线溢出的效果,而景深效果可以突出我们要表现的重点。唉,最近发现自己身陷后处理不能自拔啊....


通过Mask图控制边缘光


我们把边缘光效果加大到一定程度,就快成了自发光效果,但是上面的shader有个问题,就是全身都会自发光。如下图所示:

如果只希望盔甲部分有自发光效果,而其他部分没有自发光,我们就需要用Mask图来控制了,我们用一张Alpha8的灰度图来控制是否开启边缘光效果,将上面的shader简单修改一下,增加Mask图的通道:
    //边缘发光Shader  
    //by:puppet_master  
    //2016.12.11  
      
    Shader "ApcShader/RimLight"  
    {  
        //属性  
        Properties{  
            _Diffuse("Diffuse", Color) = (1,1,1,1)  
            _RimColor("RimColor", Color) = (1,1,1,1)  
            _RimPower("RimPower", Range(0.000001, 20.0)) = 0.1  
            _RimMask("RimMask", 2D) = "white"{}  
            _MainTex("Base 2D", 2D) = "white"{}  
        }  
      
        //子着色器    
        SubShader  
        {  
            Pass  
            {  
                //定义Tags  
                Tags{ "RenderType" = "Opaque" }  
      
                CGPROGRAM  
                //引入头文件  
                #include "Lighting.cginc"  
                //定义Properties中的变量  
                fixed4 _Diffuse;  
                sampler2D _MainTex;  
                //使用了TRANSFROM_TEX宏就需要定义XXX_ST  
                float4 _MainTex_ST;  
                sampler2D _RimMask;  
                fixed4 _RimColor;  
                float _RimPower;  
      
                //定义结构体:vertex shader阶段输出的内容  
                struct v2f  
                {  
                    float4 pos : SV_POSITION;  
                    float3 worldNormal : TEXCOORD0;  
                    float2 uv : TEXCOORD1;  
                    //在vertex shader中计算观察方向传递给fragment shader  
                    float3 worldViewDir : TEXCOORD2;  
                };  
      
                //定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)  
                v2f vert(appdata_base v)  
                {  
                    v2f o;  
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
                    //通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;  
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
                    o.worldNormal = mul(v.normal, (float3x3)_World2Object);  
                    //顶点转化到世界空间  
                    float3 worldPos = mul(_Object2World, v.vertex).xyz;  
                    //可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省  
                    o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;  
                    return o;  
                }  
      
                //定义片元shader  
                fixed4 frag(v2f i) : SV_Target  
                {  
                    //unity自身的diffuse也是带了环境光,这里我们也增加一下环境光  
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;  
                    //归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的  
                    fixed3 worldNormal = normalize(i.worldNormal);  
                    //把光照方向归一化  
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  
                    //根据半兰伯特模型计算像素的光照信息  
                    fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;  
                    //最终输出颜色为lambert光强*材质diffuse颜色*光颜色  
                    fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;  
                    //进行纹理采样  
                    fixed4 color = tex2D(_MainTex, i.uv);  
                      
                    //以下为本篇主题:计算RimLight  
                    //把视线方向归一化  
                    float3 worldViewDir = normalize(i.worldViewDir);  
                    //计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘  
                    float rim = 1 - max(0, dot(worldViewDir, worldNormal));  
                    //计算RimLight  
                    fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);  
                    //通过RimMask控制是否有边缘光,Rim目前存在一张Alpha8类型的图片中  
                    fixed rimMask = tex2D(_RimMask, i.uv).a;  
                    //输出颜色+边缘光颜色  
                    color.rgb = color.rgb* diffuse + rimColor * (1 - rimMask);  
                      
                    return fixed4(color);  
                }  
      
                //使用vert函数和frag函数  
                #pragma vertex vert  
                #pragma fragment frag     
      
                ENDCG  
            }  
        }  
        //前面的Shader失效的话,使用默认的Diffuse  
        FallBack "Diffuse"  
    }  
我们把下面这张自发光Mask图赋给材质:

通过采样这张Mask就能控制那部分开启自发光,那部分关闭自发光了:

调整Mask图,也可以得到一些比较好玩的效果:


动态RimLight效果


看了一篇博文,其中的边缘光使用了一张动态图,达到了流动的效果,感谢 作者的无私分享,于是我也尝试一下动态RimLight的效果。其实思路跟上面的Mask图一样,只不过这次改成一张扫面线类型的纹理,然后通过这张纹理的采样滚动,达到动态的效果。一提到动态效果,我们第一个想到的应该就是_Time向量,这个向量中几个值都是跟时间相关的,我们如果做动态效果,肯定少不了和这个变量打交道,关于_Time及其变种,可以参考 这篇文章,我们这里用_Time.y就可以获得时间了。
我们用一张Mask纹理,白色代表有边缘光,黑色无边缘光,通过采样这张Mask纹理,控制模型上显示边缘光的部分:

动态RimLight的shader如下:
    //边缘发光Shader  
    //by:puppet_master  
    //2016.12.11  
      
    Shader "ApcShader/RimLight"  
    {  
        //属性  
        Properties{  
            _Diffuse("Diffuse", Color) = (1,1,1,1)  
            _RimColor("RimColor", Color) = (1,1,1,1)  
            _RimPower("RimPower", Range(0.000001, 20.0)) = 0.1  
            _RimMask("RimMask", 2D) = "white"{}  
            _MainTex("Base 2D", 2D) = "white"{}  
            _RimSpeed("RimSpeed", Range(-10, 10)) = 1.0  
        }  
      
        //子着色器    
        SubShader  
        {  
            Pass  
            {  
                //定义Tags  
                Tags{ "RenderType" = "Opaque" }  
      
                CGPROGRAM  
                //引入头文件  
                #include "Lighting.cginc"  
                //定义Properties中的变量  
                fixed4 _Diffuse;  
                sampler2D _MainTex;  
                //使用了TRANSFROM_TEX宏就需要定义XXX_ST  
                float4 _MainTex_ST;  
                sampler2D _RimMask;  
                fixed4 _RimColor;  
                float _RimPower;  
                float _RimSpeed;  
      
                //定义结构体:vertex shader阶段输出的内容  
                struct v2f  
                {  
                    float4 pos : SV_POSITION;  
                    float3 worldNormal : TEXCOORD0;  
                    float2 uv : TEXCOORD1;  
                    //在vertex shader中计算观察方向传递给fragment shader  
                    float3 worldViewDir : TEXCOORD2;  
                };  
      
                //定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)  
                v2f vert(appdata_base v)  
                {  
                    v2f o;  
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
                    //通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;  
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
                    o.worldNormal = mul(v.normal, (float3x3)_World2Object);  
                    //顶点转化到世界空间  
                    float3 worldPos = mul(_Object2World, v.vertex).xyz;  
                    //可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省  
                    o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;  
                    return o;  
                }  
      
                //定义片元shader  
                fixed4 frag(v2f i) : SV_Target  
                {  
                    //unity自身的diffuse也是带了环境光,这里我们也增加一下环境光  
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;  
                    //归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的  
                    fixed3 worldNormal = normalize(i.worldNormal);  
                    //把光照方向归一化  
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  
                    //根据半兰伯特模型计算像素的光照信息  
                    fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;  
                    //最终输出颜色为lambert光强*材质diffuse颜色*光颜色  
                    fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;  
                    //进行纹理采样  
                    fixed4 color = tex2D(_MainTex, i.uv);  
                      
                    //以下为本篇主题:计算RimLight  
                    //把视线方向归一化  
                    float3 worldViewDir = normalize(i.worldViewDir);  
                    //计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘  
                    float rim = 1 - max(0, dot(worldViewDir, worldNormal));  
                    //计算RimLight  
                    fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);  
                    //通过RimMask控制是否有边缘光,Rim目前存在一张Alpha8类型的图片中  
                    fixed rimMask = tex2D(_RimMask, i.uv + float2(0 , _Time.y * _RimSpeed)).r;  
                    //输出颜色+边缘光颜色  
                    color.rgb = color.rgb* diffuse + rimColor * (1-rimMask);  
                      
                    return fixed4(color);  
                }  
      
                //使用vert函数和frag函数  
                #pragma vertex vert  
                #pragma fragment frag     
      
                ENDCG  
            }  
        }  
        //前面的Shader失效的话,使用默认的Diffuse  
        FallBack "Diffuse"  
    }  

来一张Gif截图(旁边好像有什么抢镜了):



Unity Shader中可用的变量类型整理


在传递参数时总是忘了能传递哪些类型的参数,记录一下,方便以后查找,这种东西也没必要死记硬背下来,需要的时候几秒钟之内能找到就好了。
    //Float类型,下面对应变量可以用flaot,half,fixed  
    _Name("Inspector Name", Float) = defaultValue  
    //Float类型,可以用一个滑动条控制范围,下面对应变量可以用float,half,fixed  
    _Name("Inspector Name", Range(min, max)) = defaultValue  
    //颜色类型,下面对应变量可以用float4,half4,fixed4,如果是颜色,尽量fixed4  
    _Name("Inspector Name", Color) = (defaultValue.r, defaultValue.g, defaultValue.b, defaultValue.a)  
    //2D纹理类型,默认纹理可以为空,白,黑,灰,凹凸,下面对应变量sampler2D  
    _Name("Inspector Name", 2D) = "" / "white" / "black" / "gray" / "bump"{options}  
    //长方形纹理,非2次方大小的纹理,其同上  
    _Name("Inspector Name", Rect) = "" / "white" / "black" / "gray" / "bump"{options}  
    //立方体贴图CubeMap  
    _Name("Inspector Name", Cube) = "" {options}  
    //传递一个Vector4向量  
    _Name("Inspector Name", Vector) = (defaultValue.x, defaultValue.y, defaultValue.z, defaultValue.w)  
      
    //注:上面纹理后面{}里面是一些纹理TexGen,LightmapMode光照模式等内容  

原文地址:http://blog.youkuaiyun.com/puppet_master/article/details/53548134

unity物体边缘发光shader_Shaderlab Notizen 15 Rim Shader(边缘发光)的两种实现形态 一、实现思路在正常的漫反射Shader的基础之上,在最终的漫反射颜色值出来之后,再准备一个自发光颜色值,附加上去,即得到了最终的带自发光的颜色值。公式表达:最终颜色 = (漫反射系数 x 纹理颜色 x RGB颜色)+自发光颜色英文公式:FinalColor=(Diffuse x Texture x RGBColor)+Emissive二、Surface Shader版边缘发光Shader源码如下:... 阅读详情

相关推荐

用UCTS还原《原神》角色材质?卡通渲染Shader的进阶参数详解

本文详细解析如何利用Unity Chan Toon Shader(UCTS)复刻《原神》标志性卡通渲染材质效果。从阴影分层、高光控制到轮廓光处理,提供参数配置对照表和Shader代码示例,帮助技术美术师掌握进阶卡通渲染技巧,实现高质量二次元角色表现。

weixin_29009339的博客 168

Unity3D Shader系列之边缘光RimLight

1 引言 这一两个月会花一点时间来集中总结下用Shder实现的效果。其实我一直在想为什么自己将渲染流水线、坐标变换这些弄得非常清楚了,但看到某种效果的时候,依然不知从何下手?现在觉得最主要的原因是自己对实现这种效果的算法的知识是欠缺的。因为每种效果用到的算法是都是不一样的,不是说自己把这种效果弄懂后就能迁移到另外一种效果。说白了没有系统性的看过书,系统看过书之后,看到某种效果就能大概知道它底层的原理是什么,原理知道了写Shader相对来说就是简单的事情了。所以来总结下一些常用的效果,以便后面查阅。 2 原理

老王的博客 7936

Unity之ShaderGraph如何实现边缘光效果

游戏中最常用的一个效果就是边缘光了,既可以做物体的高亮效果,也可以给人物皮肤表面添加光泽。

TxNet 1832

Unity Shader unity文档学习笔记(八):边缘光(RimLight)效果

忘记dot的意思可以点这个 Shader "Unlit/outLine" { //属性 Properties{ _RimColor("RimColor", Color) = (1,1,1,1) _RimPower("RimPower", Range(1.0, 5.0)) = 1 } //子着色器 SubShader { Pass { //定义Tags Tags{ "RenderType" = "Opaque" } CGPROGRAM //引

qq_43204246的博客 490

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2261

别再手动跑定时任务了!Spring Boot项目5分钟集成xxl-job保姆级教程(含Docker部署调度中心)

本文提供Spring Boot项目快速集成xxl-job的保姆级教程,包括Docker部署调度中心的详细步骤。通过实战案例展示如何构建企业级分布式任务调度系统,解决传统定时任务的资源竞争、单点故障等问题,提升开发效率与系统可靠性。

weixin_30315905的博客 291

Unity Shader学习:RimLight边缘光

Unity Shader学习:RimLight边缘光 依旧是模仿实现,这次的边缘光比较简单,也稍微简化了一下计算的方法,区别几乎不大,大家可以选择合适的使用。 RimLight边缘光主要思路:法线和视角向量的点积越小,证明两向量夹角越大,说明在边缘处,如果夹角小,则说明是正对相机,所以没有边缘发光。 shader代码:(在半兰伯特漫反射上增加边缘光) //边缘光shader Shader "Cus...

咪咪博客 1629

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆

在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo

weixin_34295316的博客 1777

Rimlight 项目推荐

Rimlight 项目推荐 项目基础介绍和主要编程语言 Rimlight 是一个为 Unity 引擎开发的定制化边缘光(Rimlight)着色器项目。该项目主要使用 C#、HLSL、ShaderLab 和 GLSL 等编程语言。通过这些语言,开发者可以创建出具有高度自定义功能的边缘光效果,适用于各种游戏和虚拟现实场景。 项目核心功能 Rimlight 项目的主要功能包括: 自定义边缘光效果:开发...

gitblog_00922的博客 747

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

BES 平台 SDK之 美格信Dongle 连接

最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。

谢文浩博客 924

边缘发光材质unity_Unity边缘光shader

shader脚本新建一个shader脚本,命名为RimLightshader代码如下Shader "CM/RimLight" {Properties{_Color ("Main Color", Color) = (1,1,1,1)_MainTex ("Base (RGB)", 2D) = "white" {}_IlluminPower("Illumin Power", Range(0, 2)) =...

weixin_36211941的博客 742

创建 Fiori Space 时看不到传输请求的根因与排查路径

摘要: 在创建Fiori Space时,若Transport字段下拉列表为空,通常是因为系统未找到符合要求的传输请求。主要原因是: 请求类型不匹配:需使用Customizing request而非Workbench request。 用户权限问题:当前用户需在请求下有可用的task。 客户端或系统不一致:请求需在当前客户端和正确系统(如后端)中创建。 解决方法: 在当前客户端和系统中新建Customizing request,确保包含用户task。 检查是否为前后端分离架构,确保请求创建在正确的系统。 验证

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 107

U3D实现边缘高光

1.边缘光方法(Rim Light): Unity官方教程里有例子,其中核心是这两句代码: half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal)); o.Emission = _RimColor.rgb * pow (rim, _RimPower); IN.viewDir是当前视角向量,IN.worl

afteryunlei的专栏 2596

LLC谐振变换器软启动,不只是“慢启动”,还是“智能启动”

LLC谐振变换器的软启动,不只是“慢慢来”,而是要在控制时序、限流、响应速度之间精妙权衡。而数字控制,特别是用查表法或混合信号法,为实现真正的“最佳轨迹”提供了可能。✨小Tips:如果你的系统成本敏感,选择查表法准没错;如果你的设计目标是超高速响应,那就上混合信号的高配方案!

weixin_43199439的博客 691

PCL 逐点插入法构建Delaunay三角网(C++详细过程版)

点云构建Delaunay三角网的逐点插入法基于PCL点云库的C++详细过程版实现

点云侠的博客 2991

边缘光+流光

自发光和流光合体

Mq110m的博客 356

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unity商业shader开发之高光RimColor,RimLight关键代码解析

原理 puppert大神已经说的很清楚了,而关键还是viewDir Unity Shader-边缘光(RimLight)效果_puppet_master的专栏-优快云博客 代码一 #ifdef RIMLIGHT half rim = 1-saturate(dot(i.viewDir, i.normal)); c.rgb += saturate(_RimColor.rgb * pow(rim, _LightArgs.w)); #endif//RIMLIGHT 代码二 //计算视线方向与法

大话程序员 1306

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

给物体边缘加高光轮廓的办法

1.边缘光方法(Rim Light): Unity官方教程里有例子,其中核心是这两句代码: half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal)); o.Emission = _RimColor.rgb * pow (rim, _RimPower); IN.viewDir是当前视角向量,IN.worl

menuconfig的专栏 2633

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

unity 给物体边缘加高光轮廓的办法,付Demo(增加一组算法)

原文链接:http://dong2008hong.blog.163.com/blog/static/469688272013113052146887/ 1.边缘光方法(Rim Light): Unity官方教程里有例子,其中核心是这两句代码:   half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNorm

LisenYang的专栏 6535

Unity3d 描边shader详解

1.边缘光方法(Rim Light): Unity官方教程里有例子,其中核心是这两句代码:   half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal)); o.Emission = _RimColor.rgb * pow (rim, _RimPower); IN.viewDir是当前视角向量,IN.wor

苗伟业的专栏 6808
上一篇: 【Unity Shader】浅析Unity shader中RenderType的作用及_CameraDepthNormalsTexture
下一篇: Unity Shader-描边效果
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值