unity之shader学习笔记(四)--高光反射

本文介绍了Unity中高光反射的计算,包括Blinn光照模型和Blinn-Phong模型的原理与应用。通过公式解析和代码示例,展示了如何实现更真实的光照效果,以及如何调整高光范围。同时提到了UnityCG.cginc中的常用函数和宏定义,帮助理解Shader代码的编写。
摘要由CSDN通过智能技术生成

但是我们会发现物体的背光面是个全黑的颜色,现实生活中物体的背光面并不是全黑的,而是可以看到物体的大概形状,并不是全黑的,之前使用的计算方式是兰伯特光照模型。要实现此种现象,那么就需要使用半兰伯特光照模型来实现

半兰伯特光照模型
Diffuse = 直射光颜色 *(cosθ*0.5+0.5)
兰伯特光照模型
Diffuse = 直射光颜色 * max(0,cosθ) θ是指光照方向与法线方向的夹角

半兰伯特光效果如图:

这里写图片描述

高光反射的计算 (Blinn光照模型)

Specular = 直射光*pow(max(cosθ,0),高光的参数)

对于上述公式的解释:
θ是指反射光方向和反射点到相机方向的夹角
pow的次方的意思 就是cosθ的高光参数次方
max(cosθ,0)作用是防止在物体背光面,如果高光参数为偶数,那么最后的值会从负数变为正数

使用的示例代码如下

Properties{
        _Diffuse("Diffuse Color",Color) = (1,1,1,1)
        _Gloss("Gloss",Range(8,200)) = 10
    }
        SubShader{
            Pass{

                Tags{
  "LightMode" = "ForwardBase"}

                CGPROGRAM

                #include "Lighting.cginc"  
                //unity系统定义好的类  可以使用一些内置的变量来简化计算操作  
                //_LightColor0              该变量表示第一个直射光的颜色
                //_WorldSpaceLightPos0      该变量表示第一个直射光的位置(世界坐标下)
                //UNITY_LIGHTMODEL_AMBIENT  该变量表示系统的环境光
                #pragma vertex vert

                #pragma fragment frag

                fixed4 _Diffuse;
                half _Gloss;

                struct a2v {
                    float4 vertex : POSITION; //系统自动将顶点坐标传入vertex
                    float3 normal : NORMAL;  //系统自动将法线传入    变量normal
                };

                struct v2f {
                    float4 position:SV_POSITION;
                    fixed3 color : COLOR;
                };



                v2f vert(a2v x) {
                    v2f f;
                    //UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
                    f.position = mul(UNITY_MATRIX_MVP, x.vertex); 
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值