Rim 边缘光

边缘光:计算眼睛和模型顶点法线的点积,结果作为强度,和材质输出;顶点和法线平行时,强度最大,垂直时,强度最小。因此将他取反,即同一方向时,强度最小,垂直时,强度最大。

float rim= 1-dot(normalize(viewDirection),normalDirection);

源代码:

 1 Shader "JQM/Rim_1"
 2 {
 3     Properties
 4     {
 5         _Color("Color", color) = (1.0,1.0,1.0,1.0)
 6         _SpecColor("Specular Color", color) = (1.0,1.0,1.0,1.0)
 7         _Shininess("Shininess",float) = 10
 8         _RimColor("Rim Coloe Color", color) = (1.0,1.0,1.0,1.0)
 9         _RimPower("Rim Power",Range(0.1,10.0)) = 3.0
10
11     }
12     SubShader{
13         Pass{
14
15             Tags { "LightMode" = "ForwardBase"}
16
17             CGPROGRAM
18             #pragma vertex vert
19             #pragma fragment frag
20
21             //使用自定义变量
22             uniform float4 _Color;
23             uniform float4 _SpecColor;
24             uniform float4 _RimColor;
25             uniform float _Shininess;
26             uniform float _RimPower;
27
28             //使用Unity定义的变量
29             uniform float4 _LightColor0;
30
31             struct vertexInput{
32                 float4 vertex:POSITION;
33                 float3 normal:NORMAL;
34             };
35
36             struct vertexOutput{
37                 float4 pos:SV_POSITION;
38                 float4 posWorld:TEXCOORD0;
39                 float3 normalDir:TEXCOORD1;
40             };
41
42             //顶点程序
43             vertexOutput vert(vertexInput v)
44             {
45                 vertexOutput o;
46                 o.posWorld = mul(_Object2World, v.vertex);
47                 o.normalDir =  normalize( mul(float4(v.normal,0.0),_World2Object).xyz);
48                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
49                 return o;
50             }
51
52             //片段程序
53             float4 frag(vertexOutput i):COLOR
54             {
55                 float3 normalDirection = i.normalDir;
56                 float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz- i.posWorld.xyz);
57
58                 float rim=1 -dot(normalize(viewDirection),normalDirection);
59                 return float4(rim*_Color.xyz,1.0);
60             }
61
62             ENDCG
63         }
64     }
65
66 }
时间: 2024-10-13 06:45:57

Rim 边缘光的相关文章

边缘光shader

Shader "CM/RimLight" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _IlluminPower("Illumin Power", Range(0, 2)) = 1 _RimColor ("Rim Color", Color

【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader来编写边缘发光Shader. 一.最终实现的效果

unity shader笔记

clip函数可以用来切割mesh clip(var); var 的值小于0时就会被切割 表面着色器 其实就是生成了定点片元着色器,相当于一种包装和简化吧 标准的填充结构 struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular power in 0..1 r

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)——自定义光照模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=183 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的自定义光照模式的写法. 上篇文章中我们已经说到,表面着色器将分为两次讲解,上

UnityShader之遮挡透明

好久没写博客了,最近在学shader,不得不说,shader真的非常美妙,我沉迷其中无法自拔= = 之前做过一个遮挡透明的功能,当物体遮挡住主角时,该物体会变成半透明显示出主角.这次同样是遮挡透明的功能,不过,变透明的刚刚相反,是主角变成半透明,更严谨的说是主角被遮挡的那一部分变成半透明. 先放出结果图: 当被遮挡时,遮挡部分透明处理,那么需要涉及渲染深度的知识.引擎是如何判断哪个物体在前面哪个物体在后面呢? 深度:每个像素有自己的深度值,离摄像机近的深度小,远的深度大 深度缓冲区:存储每个像素

NormalMap 法线贴图

法线贴图 存储法线的一张贴图,法线的 xyz 的值被映射成为对应的 RGB 值.即法线的分量由(-1,1)映射成(0,127).法线贴图一般呈蓝色,因为大多数朝向 (0,0,1)的法线被映射成为了 (0,0,127). 切空间(Tangent Space,TBN):纹理空间 切空间是在某一点所有的切向量组成的线性空间.也就是说,在模型每个顶点中,都存在这样的一个切空间坐标系,以模型顶点为圆心,再加上TBN3个轴(Tangent,Binormal,Normal),N是顶点的法线方向,T.B两个向量

Unity3D游戏开发从零单排(九) - 进击的Shader

提要 今天要学习的是一些Shader 的例子,从简单到难.Let's go. 一大波例子来袭 还是用上一篇用到的工程.点我下载 红色的螃蟹 Test1.shader Shader "Custom/Test1" { SubShader { Tags { "RenderType" = "Opaque" } CGPROGRAM #pragma surface surf Lambert struct Input { float4 color : COLO

unity3d 模拟人体皮肤

继续对<unity着色器和屏幕特效开发秘籍>进行学习 本shader可模拟出类似人体皮肤的效果 作者总结出模拟人体皮肤重点的四要素: 1.次表面散射: 简称3S,3S的最大用处之一在于表现灯光照射下的人的皮肤,在人体皮肤比较薄部位,可以透过皮肤产生血色,或可见的血管. 说得简单一些就是:光射进表面,在材质里散射,然后从与射入点不同的地方射出表面. 举个例子,当隔着手指打开手电筒看到的效果就是次表面反射. 2.漫反射: 漫反射,是投射在粗糙表面上的光向各个方向反射的现象,我们经常用到的.这里同时

UnityShader实例11:积雪材质

积雪材质 概述 积雪材质是我自己给这个材质取的名字,既然是积雪,那顾名思义,雪是从天而降的,因此积雪都是在物体朝上的表面:不管你的模型怎么摆放 ,雪都保证是积在物体朝上(在unity里就是y轴正方向)的表面,如下图所示: 实现原理 要保证向上的面有积雪,其实就是模型表面的法线方向与世界坐标空间的Y轴正方向保持一致积雪多,否则积雪就少雪,所以将模型的法线方向normal从模型空间转化到世界空间,然后与y轴正方向float3(0,1,0)做点积,根据结果来确认法相的朝向和Y轴的夹角大小,从而确认是否