Unity 光照着色器
光照着色器需要考虑光照的分类,一般分为漫反射和镜面反射。
漫反射计算基本光照:
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 光照着色器的更多相关文章
- Unity Shader着色器优化
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...
- Unity 5着色器系统代码介绍(上)
http://forum.china.unity3d.com/thread-25724-1-10.html Unity 5着色器系统代码介绍(上) Unity在着色器开发方面提供了很大的灵活性.有些工 ...
- Unity 几何着色器
Unity 几何着色器 shaderGeometry Shader几何着色器 Unity 几何着色器 如果学习不能带来价值,那将毫无意义 简介 在顶点和片段着色器之间有一个可选的着色器,叫做几 ...
- [Unity] Shader(着色器)输入输出和语义
在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...
- [Unity] Shader(着色器)之纹理贴图
在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...
- Unity 5着色器系统代码介绍(下)
http://forum.china.unity3d.com/thread-25738-1-10.html 上一篇对着色器系统的工作原理做了介绍,现在我们将继续深入,将目光聚焦在标准着色器的光照函数. ...
- [Unity] Shader(着色器)之固定管线
在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...
- Unity 内置着色器(转)
Unity包括超过40种内置的shader. 标准着色器家族 Normal Shader Family 这些着色器都是Unity基本的着色器.适用于大多数的不透明物体,如果想要物体有透明.发光效果等, ...
- Unity 渲染教程(二):着色器基础
转载:https://www.jianshu.com/p/7db167704056 这是关于渲染基础的系列教程的第二部分.这个渲染基础的系列教程的第一部分是有关矩阵的内容.在这篇文章中我们将编写我们的 ...
随机推荐
- python 编码格式
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- delphi中如何实现DBGrid中的两列数据想减并存入另一列
可参考下面的例子: 数据自动计算的实现:“金额”是由“单价”和“工程量”相乘直接得来的,勿需人工输入. 这可在“数据源构件”的onupdatedata例程添加如下代码实现: procedure T ...
- codeforces472C
Design Tutorial: Make It Nondeterministic CodeForces - 472C A way to make a new task is to make it n ...
- linux硬件数据
Linux 文件详解 lrwxrwxrwx root root 8月 bin -> usr/bin //二进制目录 存放了许多GNU用户极工具 dr-xr-xr-x. root root 8月 ...
- Python getattr() 函数
Python getattr() 函数 Python 内置函数 描述 getattr() 函数用于返回一个对象属性值. 语法 getattr 语法: getattr(object, name[, d ...
- iptables防火墙的原理及应用
简介 (netfilter, 位于Linux内核中的包过滤功能体系 ,称为Linux防火墙的“内核态”) iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防 ...
- HDU 1556-Color the ball-树状数组
树状数组的成段更新. 首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和. 更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1.这时,query(a) ...
- 图片文字识别aip的一个小Demo
目前接触到了一个新的内容,识别图片上的文字,以下是这个Demo 首先需要在需要在百度云-管理中心创建应用 地址:http://console.bce.baidu.com/ai/#/ai/ocr/app ...
- MT【278】二次齐次化
对于$c>0$,当非零实数$a,b$满足$4a^2-2ab+4b^2-c=0,$且使$|2a+b|$最大时,$\dfrac{3}{a}-\dfrac{4}{b}+\dfrac{5}{c}$的最小 ...
- 【java+selenium】网易云音乐刷累计听歌数
背景应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了.当时试了下,直接一下子刷了有好几万.悲 ...