公式如下:

Cdiffuse = Clight * mdiffuse * max(0, dot(n,l));

其中,n 为表面法线,l 为指向光源的单位向量,mdiffuse 为材质温反射颜色,Cdiffuse 为光源颜色。

需要注意的是,需要防止法线与光源方向点积为负,因些使用max函数。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7068273.html

shader如下:

Shader "Custom/Diffuse Vertex-Level"
{
Properties
{
_Diffuse ("Diffuse", Color) = (,,,)
} SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
Tags { "LightMode"="ForwardBase" } // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "Lighting.cginc" struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
}; float4 _Diffuse; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); // 在模型空间中计算
float3 lightDir = ObjSpaceLightDir(v.vertex);
lightDir = normalize(lightDir);
float4 diffuseColor = _Diffuse * _LightColor0 * max(, dot(lightDir, v.normal)); // 也可以世界坐标中计算
//float3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object)); // 使用顶点变换矩阵的逆转置矩阵来变换法线,参考前面的章节“法线变换”
//float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
//float4 diffuseColor = _Diffuse * _LightColor0 * saturate(dot(worldNormal, worldLight)); o.color = UNITY_LIGHTMODEL_AMBIENT + diffuseColor;
return o;
} fixed4 frag (v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
} Fallback "Diffuse"
}

效果如下:

Unity shader学习之逐顶点漫反射光照模型的更多相关文章

  1. Unity shader学习之逐像素漫反射光照模型

    shader如下: Shader "Custom/Diffuse Fragment-Level" { Properties { _Diffuse (,,,) } SubShader ...

  2. 【Unity Shader学习笔记】Unity光照基础-漫反射光照

    本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...

  3. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  4. 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

    在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律 ...

  5. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  6. Unity shader学习之高光反射光照模型

    高光反射光照模型的公式如下: Cspecular = Clight * mspecular * max(0, dot(v, r))gloss 要计算高光反射需要知道4个参数:入射光线颜色Cspecul ...

  7. 【Unity Shader学习笔记】Unity基础纹理-单张纹理

    1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...

  8. 【Unity Shader学习笔记】Unity光照基础-高光反射

    1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...

  9. Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

    一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...

随机推荐

  1. 知乎如何基于开源Druid打造下一代数据平台?

    https://mp.weixin.qq.com/s/WXA_Pn5xwlL-cA4JaGRw6Q

  2. python3元组,列表的几个属性

    list1 = ['a', 'b', 'c', 'a'] tuple1 = ('a', 'b', 'c', 'a') 计算list1或者tuple1中元素的个数:  count_a = list1.c ...

  3. LeetCode 693 Binary Number with Alternating Bits 解题报告

    题目要求 Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits w ...

  4. g++编译多个文件

    注意:头文件不用去指定,其是由#include命令进行管理的,只需要编译cpp文件就可以了: 举例: 有以下三个文件: a.h a.cpp main.cpp 那么编译可以有以下两种方式: 1.分开编译 ...

  5. 1-1-linux环境搭建

    1-1-linux环境搭建 1.安装虚拟机 (1).安装虚拟机增强工具. (2).创建共享文件夹:(https://www.cnblogs.com/huangjianxin/p/6343881.htm ...

  6. nginx做正向代理

    #代理服务器设置 server { resolver 8.8.8.8; resolver 114.114.114.114; listen ; access_log /home/lin/proxy.ac ...

  7. 20171129 ASP.NET中使用Skin文件

    在Web.config里加入<pages styleSheetTheme="DefSkin"/>再在App_Themes文件夹里建个DefSkin文件夹把css和Ski ...

  8. vue【指令】

    <div class="m-conbox"> <div v-text="html"></div> <div>{{ ...

  9. 万恶之源 - Python装饰器及内置函数

    装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...

  10. Scala的apply unapply unapplySeq 语法糖

    apply 可以理解为注入 unapply unapplySeq 可以理解为提取 apply 与 unapply 虽然名字相近,但是使用起来区别挺大.apply有点像构造函数unapply主要是结合模 ...