Unity3D ShaderLab 自定义光照模型

接着上一篇BasicMyDiffuse来说,这次要说明的就是自定义的光照模型。

1.>//#pragma surface surf Lambert::这个是默认的光照模型

2.>#pragma surface surf CusDiffuse //自己定义的光照模型CusDiffuse;

3.>在SubShader 中加入光照模型函数:

inline float4 LightingCusDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){

float difLight = max(0,dot(s.Normal,lightDir));

float4 col;

//使用(difLight*atten*2)试试区别;;

col.rgb = s.Albedo * _LightColor0.rgb*(difLight*atten*1.5);

col.a=s.Alpha;

return col;

}

第二步,告诉着色器使用CusDiffuse光照模型来计算。第二篇文章使用的是默认的Lambert光照模型。

第三步,编写自己的光照模型函数。函数名格式Lighting+光照模型名称,也就是我们的LightingCusDiffuse;

为了完成漫反射的效果,我们将SurfaceOutput 结构体提供给我们的数据做乘法运算,s.Albedo来自于surf函数,_LightColor0.rgb来自于unity,通过乘法获得col的rgb值。

通过在Unity中的Shader切换,我们可以看出我们自己的光照模型和上一篇BasicMyDiffuse使用Lambert光照模型的效果区别。若把参数调整为2,那么效果区别就很难看出。

read:1 这里用到的点乘函数dot(arg1,arg2)是cg语言内置的数学函数,用来比较两个向量在空间的方向;dot函数会检查两个向量是平行还是垂直,

任意2个向量都可以通过dot函数获得-1~1的夹角范围,-1表示平行向量被离视角的方向,1表示平行但朝向你的方向,0表示和你垂直的方向向量。

read:2 max函数属于cg标准库的函数,我们可以通过他限制点乘的计算结果,max(arg1,arg2);通过max函数保证漫反射计算记过永远介于0和点乘最大值之间。

如果是小于0的数值,着色器可能会生成极度黑色的区域,并且影响后续的计算值。

以下是本次修改后的全部内容。

code start ---------------------------------------------------------------

Shader "91YGame/BasicMyCusDiffuse" {
    Properties {
        _EmissiveColor("Emissive Color",Color) = (1,1,1,1)
        _AmbientColor("Ambient Color",Color)=(1,1,1,1)
        _MySliderValue("Slider Value",Range(0,10))=1.3
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        //#pragma surface surf Lambert
        #pragma surface surf CusDiffuse

float4 _EmissiveColor;
        float4 _AmbientColor;
        float _MySliderValue;

struct Input {
            float2 uv_MainTex;
        };

void surf (Input IN, inout SurfaceOutput o) {
            float4 c;
            c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

inline float4 LightingCusDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){
            float difLight = max(0,dot(s.Normal,lightDir));
            float4 col;
            col.rgb = s.Albedo * _LightColor0.rgb*(difLight*atten*1.5);
            col.a=s.Alpha;
            return col;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
code end ---------------------------------------------------------------

时间: 2024-08-07 16:48:47

Unity3D ShaderLab 自定义光照模型的相关文章

Unity3D Half Lambert光照模型

Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 .但是这个half lambert的光照模型是没有任何特殊物理原理,仅仅是增强玩家视觉的一个简单的光照模型例子. 具体的介绍可以参见Valve的wiki: https://developer.valvesoftware.com/wiki/Half_Lambert 左边是普通的Lambert光照模型

Unity3D ShaderLab 创建自定义高光类型

Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数进行像素操作. 所以还是新建Shader,再建材质球然后打开编辑器进行shader的编辑. 1.修改Properties Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _MainTint("Diff

Unity3D教程宝典之Shader篇:第十六讲自定义光照模型

转载自风宇冲Unity3D教程学院   十四讲我们实现了基本的Surface Shader,十五讲讲了光照模型的基础知识.这一讲说的是如何写光照模型. 自定义光照模型主要分为4步: (0)架设框架,填写需要的参数 (1)计算漫反射强度 (2)计算镜面反射强度 (3)结合漫反射光与镜面反射光 代码配有中文注释,配合上上讲的光照公式,一步一步实现即可. //Author: 风宇冲 Shader "Custom/T_customLightModel" { Properties { _Main

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的方式,我们可以在同一个着色器上实现垫型表面和光亮表面,也可以使用贴图来控制镜面高光的范围或者高光强度, 以实现一个表面是广泛的镜面高光而另一面确是细小的高光. 新建一个shader,一个材质球.老规矩双击shader脚本,在编辑器中编写代码吧. 1.Properties: Properties {

Unity3D ShaderLab 各向异性高光

Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. 首先创建Shader,再创建材质球.然后双击Shader 打开编辑器. 1:修改Properties Properties { //添加属性; _MainTint("Diffuse Tint",Color)=(1,1,1,1) _MainTex ("Base (RGB)"

Unity3D ShaderLab 使用BlinnPhong高光类型

Unity3D shaderLab 使用BlinnPhong高光类型 上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所形成的半角向量来完成. 这种方式比我们自己形成反射向量来进行计算更加高效.在UnityCG.cginc文件中内置的BlinnPhong光照模型就是半角矢量完成的. 首先还是创建一个shader,一个材质球,双击shader,打开编辑器. 1:Properties Properties { _Main

Unity3D ShaderLab 立方体图的菲涅尔反射

Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情况,我们接下来就来实现这种反射效果过. 还是先创建Shader和 Material,沿用上一节的立方体图.代码变动较少,直接看下面的完成代码: code start -------------------------------------------------------------------

Unity3D ShaderLab 使用渐变纹理着色

Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片.再把我们之前的Hlf Lambert的代码稍加修改. 1:Properties添加GUI上的图片纹理属性>_RampTex ("Ramp Texture", 2D) = "" 2:在SubShader中申明图片纹理>sampler2D _RampTex;

Unity3D ShaderLab 基础的高光实现

Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现着色器逼真的镜面效果,我们需要考虑相机或者观察者面向物体表面的方向,然而高光还需要一个元素来实现视觉的真实效果---光的入射方向! 通过结合2个方向,我们可以在物体的表面得到一个热点或者说亮点,它位于视角方向和光源方向中间位置.这种中间位置的方向可以成为半角矢量,我们通过他可以实现高光效果和镜面等.