shader如下:

  1. Shader "Custom/Diffuse Fragment-Level"
  2. {
  3. Properties
  4. {
  5. _Diffuse ("Diffuse", Color) = (,,,)
  6. }
  7.  
  8. SubShader
  9. {
  10. Tags { "RenderType"="Opaque" }
  11. LOD
  12.  
  13. Pass
  14. {
  15. Tags { "LightMode"="ForwardBase" } // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0
  16.  
  17. CGPROGRAM
  18.  
  19. #pragma vertex vert
  20. #pragma fragment frag
  21.  
  22. #include "UnityCG.cginc"
  23. #include "Lighting.cginc"
  24.  
  25. struct appdata
  26. {
  27. float4 vertex : POSITION;
  28. float3 normal : NORMAL;
  29. };
  30.  
  31. struct v2f
  32. {
  33. float4 vertex : SV_POSITION;
  34. float3 worldNormal : NORMAL;
  35. };
  36.  
  37. float4 _Diffuse;
  38.  
  39. v2f vert (appdata v)
  40. {
  41. v2f o;
  42. o.vertex = UnityObjectToClipPos(v.vertex);
  43. float3 wn = mul(v.normal, (float3x3)_World2Object);
  44. o.worldNormal = normalize(wn);
  45. return o;
  46. }
  47.  
  48. fixed4 frag (v2f i) : SV_Target
  49. {
  50. float3 lightDir = normalize(_WorldSpaceLightPos0);
  51. float4 diffuseColor = _Diffuse * _LightColor0 * max(, dot(lightDir, i.worldNormal));
  52. return UNITY_LIGHTMODEL_AMBIENT + diffuseColor;
  53. }
  54.  
  55. ENDCG
  56. }
  57. }
  58.  
  59. Fallback "Diffuse"
  60. }

效果如下:

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

逐像素光照可以得到更新平滑的光照效果,但有一个缺点,在光照无法到达的区域,模型的外观通常是全黑的,没有任何明暗变化,像一个平面一样,无任何模型细节表现,如下图。

为此,有一种改善技术:半兰伯特(Half Lambert)光照模型。

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

  1. Unity shader学习之逐顶点漫反射光照模型

    公式如下: Cdiffuse = Clight * mdiffuse * max(0, dot(n,l)); 其中,n 为表面法线,l 为指向光源的单位向量,mdiffuse 为材质温反射颜色,Cdi ...

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

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

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

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

  4. Unity Shader 学习之旅

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

  5. Unity Shader 学习之旅之SurfaceShader

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

  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. Diagnosing out of memory errors and memory leaks 内存泄露实例 C Java JavaScript 内存泄露

    小结: 1. 数据库连接池. JDBC语句和结果对象必须显式地关闭. 2. 电梯到目标楼层后地址是否被释放 When a button is pressed: Get some memory, whi ...

  2. Copycat - Overview

    Copycat’s primary role is as a framework for building highly consistent, fault-tolerant replicated s ...

  3. LeetCode 784 Letter Case Permutation 解题报告

    题目要求 Given a string S, we can transform every letter individually to be lowercase or uppercase to cr ...

  4. vue中watch的详细用法

    在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...

  5. 洛谷P3311 [SDOI2014]数数 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 首先看到多串匹配balabala显然想到建个AC自动机? 然后可以用一点儿数位dp的思想地想下(,,,其实并不算QAQ 幸运数可以分为两类:位数<n ...

  6. 跨域的问题(nginx解决才是王道)

    跨域分为两类:一时get跨域,而是post跨域.常见的是三种: 一种是jsonp, $.ajax({ url: "http://127.0.0.1/~chenjiebin/mycode/ph ...

  7. atom 为什么启动terminal是总是打开是用户目录?

    atom 为什么启动terminal是总是打开是用户目录?如下图: 原因也很简单,只怪自己懒,没查单词surpress是什么意思: surpress directory argument,是抑制目录参 ...

  8. python 版Faster Rcnn

    直接按照官网https://github.com/rbgirshick/py-faster-rcnn上的教程对faster Rcnn进行编译的时候,会发有一些层由于cudnn版本的更新,会报错如下: ...

  9. C#图解:第七章

    C#图解第七章:类和继承 1.类继承 通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展. 1.可以使用- 一个已经存在的类作为新类的基础..已存在的类称为基类(baseclass),新 ...

  10. ActiveMQ整合spring、同步索引库

    1.   Activemq整合spring 1.1. 使用方法 第一步:引用相关的jar包. <dependency> <groupId>org.springframework ...