光照着色器需要考虑光照的分类,一般分为漫反射和镜面反射。

漫反射计算基本光照:

float brightness=dot(normal,lightDir)    将法线和光的入射方向进行点积运算,求出光的亮度。

float3 pixelColor=brightness*lightColor*surfaceColor  将光的亮度*光的颜色*物体表面颜色得到我们最终看到的颜色。

Shader "Unlit/DiffuseShader"
{
Properties
{
_Color("Color",Color)=(,,,)
}
SubShader
{
#新加了光照模式标签
Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"}
LOD Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "UnityLightingCommon.cginc" fixed4 _Color; struct appdata
{
float4 vertex : POSITION;
float3 normal:NORMAL; #法线方向
}; struct v2f
{
float4 vertex : SV_POSITION;
float3 worldNormal:TXCOORD0; # }; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float3 worldNormal=UnityObjectToWorldNormal(v.normal);
o.worldNormal=worldNormal;
return o;
} fixed4 frag (v2f i) : SV_Target
{
float3 normalDirection=normalize(i.worldNormal);
float nl=max(0.0,dot(normalDirection,_WorldSpaceLightPos0.xyz));
float4 diffusTerm=nl*_Color*_LightColor0;
return diffusTerm;
}
ENDCG
}
}
}

镜面反射具体实现:

R=2*(N*L)*N-L;

float3 reflectionVector=reflect(-lightDir,normal);                 //用入射光线方向和法线求出反射光线方向

float specDot=max(dot(reflectionVector,eyeDir),0.0);        //反射光线和眼睛入射方法求点积

float spec=pow(specDot,spectExponent);

            fixed4 frag (v2f i) : SV_Target
{
//标准化法向量
float3 normalDirection=normalize(i.worldNormal);
float3 viewDirection=normalize(UnityWorldSpaceViewDir(i.vertexWorld));
float3 lightDirection=normalize(UnityWorldSpaceViewDir(i.vertexWorld)); //采样纹理
float4 tex=tex2D(_DiffuseTex,i.uv); //漫反射计算,使用兰帕特近似方法lambert
float nl=max(0.0,dot(normalDirection,_WorldSpaceLightPos0.xyz));
float4 diffusTerm=nl*_Color*_LightColor0; //镜面反射计算,使用芳式近似方法Phong
float3 reflectionDirection=reflect(-lightDirection,normalDirection);
float3 specularDot=max(0.0,dat(viewDirection,reflectionDirection));
float3 specular=pow(specularDot,_shininess); //计算最终的颜色
float4 specularTerm=float4(specular,)*_SpacColor*_LightColor;
float4 finalColor=diffusTerm*specularTerm; return finalColor;

Unity 光照着色器的更多相关文章

  1. Unity Shader着色器优化

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...

  2. Unity 5着色器系统代码介绍(上)

    http://forum.china.unity3d.com/thread-25724-1-10.html Unity 5着色器系统代码介绍(上) Unity在着色器开发方面提供了很大的灵活性.有些工 ...

  3. Unity 几何着色器

    Unity 几何着色器 shaderGeometry Shader几何着色器 Unity 几何着色器 如果学习不能带来价值,那将毫无意义 简介     在顶点和片段着色器之间有一个可选的着色器,叫做几 ...

  4. [Unity] Shader(着色器)输入输出和语义

    在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...

  5. [Unity] Shader(着色器)之纹理贴图

    在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...

  6. Unity 5着色器系统代码介绍(下)

    http://forum.china.unity3d.com/thread-25738-1-10.html 上一篇对着色器系统的工作原理做了介绍,现在我们将继续深入,将目光聚焦在标准着色器的光照函数. ...

  7. [Unity] Shader(着色器)之固定管线

    在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...

  8. Unity 内置着色器(转)

    Unity包括超过40种内置的shader. 标准着色器家族 Normal Shader Family 这些着色器都是Unity基本的着色器.适用于大多数的不透明物体,如果想要物体有透明.发光效果等, ...

  9. Unity 渲染教程(二):着色器基础

    转载:https://www.jianshu.com/p/7db167704056 这是关于渲染基础的系列教程的第二部分.这个渲染基础的系列教程的第一部分是有关矩阵的内容.在这篇文章中我们将编写我们的 ...

随机推荐

  1. python 编码格式

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  2. delphi中如何实现DBGrid中的两列数据想减并存入另一列

    可参考下面的例子:   数据自动计算的实现:“金额”是由“单价”和“工程量”相乘直接得来的,勿需人工输入. 这可在“数据源构件”的onupdatedata例程添加如下代码实现: procedure T ...

  3. codeforces472C

    Design Tutorial: Make It Nondeterministic CodeForces - 472C A way to make a new task is to make it n ...

  4. linux硬件数据

    Linux 文件详解 lrwxrwxrwx root root 8月 bin -> usr/bin //二进制目录 存放了许多GNU用户极工具 dr-xr-xr-x. root root 8月 ...

  5. Python getattr() 函数

    Python getattr() 函数  Python 内置函数 描述 getattr() 函数用于返回一个对象属性值. 语法 getattr 语法: getattr(object, name[, d ...

  6. iptables防火墙的原理及应用

    简介 (netfilter, 位于Linux内核中的包过滤功能体系  ,称为Linux防火墙的“内核态”) iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防 ...

  7. HDU 1556-Color the ball-树状数组

    树状数组的成段更新. 首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和. 更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1.这时,query(a) ...

  8. 图片文字识别aip的一个小Demo

    目前接触到了一个新的内容,识别图片上的文字,以下是这个Demo 首先需要在需要在百度云-管理中心创建应用 地址:http://console.bce.baidu.com/ai/#/ai/ocr/app ...

  9. MT【278】二次齐次化

    对于$c>0$,当非零实数$a,b$满足$4a^2-2ab+4b^2-c=0,$且使$|2a+b|$最大时,$\dfrac{3}{a}-\dfrac{4}{b}+\dfrac{5}{c}$的最小 ...

  10. 【java+selenium】网易云音乐刷累计听歌数

    背景应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了.当时试了下,直接一下子刷了有好几万.悲 ...