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

漫反射计算基本光照:

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. APP test

    在讲APP测试之前,先讲一下,目前APP的操作系统以及APP相关基础知识. 一.APP基础知识 1.操作系统# 现在移动端的操作系统主流的分为两种:(1)安卓系统 (2)IOS系统. 2.安卓系统# ...

  2. 用dbexpress连接sqlserver数据库

    SQLConnection1.Params.clearSQLConnection1.Params.Values['ServerName'] := '192.168.0.112'; SQLConnect ...

  3. 五、core开发

    一.支付方面的 https://www.cnblogs.com/stulzq/p/7606164.htmlhttps://www.cnblogs.com/guolianyu/

  4. C# json解析

    json格式数 [{ , , , "ItemCode": "UBAC11211OF-A54", "basicName_bg": " ...

  5. zookeeper客户端操作

    ZooKeeper客户端 zkCli.sh 节点的增删改查 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./zkCli.sh -timeout 5000  -server ...

  6. 【Python练习题】程序5

    #题目:输入三个整数x,y,z,请把这三个数由小到大输出. # a = input('请输入整数: \n') # # b = input('请输入整数: \n') # # c = input('请输入 ...

  7. Microsoft Azure Machine Learning Studio

    随着机器学习(ML)成为软件行业的主流,重要的是要了解它的工作原理,并将其置于开发栈中.了解如何为您的应用程序构建ML服务,您可以确定您的ML应用程序中的机会,实施ML,并与您的团队的ML专业人士清楚 ...

  8. model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转;解决的方法是用responsewrite(普通的字符响应)

    model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转:解决的方法是用responsewrite

  9. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  10. 51Nod 1381 硬币游戏

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6445369.html 1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值 ...