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 这是关于渲染基础的系列教程的第二部分.这个渲染基础的系列教程的第一部分是有关矩阵的内容.在这篇文章中我们将编写我们的 ...
随机推荐
- 销售合同金额数据从Excel导入
一.业务需求 1.新增了销售合同金额的字段,但是老数据没有这个字段:所以销售合同金额从销售合同附件的各品种金额之和. 2.制作好excel字段模板,将此模板发送给销售业务部门来统计并完成excel表格 ...
- SQL Server 只安装客户端的方法
只安装管理工具
- java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer; at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.jav
在整合spring和mybatis在执行数据库操作的时候报出了: java.lang.AbstractMethodError: org.mybatis.spring.transaction.Sprin ...
- EChart.js 笔记二
交互组件 Echart.js 中交互组件比较多.例如: legend(图例).title(标题组件).visualMap(视觉映射组件).dataZoom(数据缩放组件).timeline(时间线组件 ...
- 实验吧 WEB 貌似有点难
错误!你的IP不在允许列表之内! 提示:代码审计 这个提示可谓是非常良心了,一看源代码是一个识别ip地址的东西,如果IP为1.1.1.1那么就会得到KEY. 第一个if是判断是否有client-ip ...
- mysql-tar包搭建过程
第一: wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz tar z ...
- Vuex以及axios
Vuex 简介 vuex是一个专门为Vue.js设计的集中式状态管理架构. 状态? 我们把它理解为在data中需要共享给其他组件使用的部分. Vuex和单纯的全局对象有以下不同: 1.Vuex 的状态 ...
- Python中matplotlib模块解析
用Matplotlib绘制二维图像的最简单方法是: 1. 导入模块 导入matplotlib的子模块 import matplotlib.pyplot as plt import numpy as ...
- Codeforces Round #514 (Div. 2) C. Sequence Transformation 思维构造
题意 给出一个1-n的集合 gcd 集合里面的所有数 得到的 一个 数 然后自己选择删去一个数 要使得到的数 构成的数列 的字典序最大 思路: gcd所有数 那gcd得到的数肯定要小于数 ...
- Matplotlib学习---用matplotlib画面积图(area chart)
这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://book.flowingdata.com/ch05/data/us-pop ...