博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】Blinn-Phong 光照模型
阅读量:4089 次
发布时间:2019-05-25

本文共 2833 字,大约阅读时间需要 9 分钟。

这里写图片描述

  • Blinn-Phong 光照模型,又称为 Blinn-phong 反射模型(Blinn–Phong reflection
    model)或者 phong 修正模型(modified Phong reflection model),是由 Jim Blinn
    于 1977 年在文章“Models of light reflection for computer synthesized pictures”中对
    传统 phong 光照模型基础上进行修改提出的。和传统 phong 光照模型相比,
    Blinn-phong 光照模型混合了 Lambert 的漫射部分和标准的高光,渲染效果有时
    比 Phong 高光更柔和、更平滑,此外它在速度上相当快,因此成为许多 CG 软
    件中的默认光照渲染方法。此外它也集成在了大多数图形芯片中,用以产生实时
    快速的渲染。在 OpenGL 和 Direct3D 渲染管线中, Blinn-Phong 就是默认的渲染
    模型。
Shader "Unlit/Blinn-phong"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _SpecularColor("SpecularColor",Color )=(1,1,1,1)        _SpecularGloss("Gloss",Range(8.0,256)) = 20        _Diffuse ("Diffuse", Color) = (1, 1, 1, 1)    }    SubShader    {        Tags { "RenderType"="Opaque" }        Pass        {            Tags { "LightMode"="ForwardBase" }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            #include "Lighting.cginc"             struct a2v            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                float3 normal:NORMAL;            };            struct v2f            {                float2 uv : TEXCOORD0;                float4 vertex : SV_POSITION;                float3 worldNormal :TEXCOORD1;                float3 worldPos :TEXCOORD2;            };            sampler2D _MainTex;            float4 _MainTex_ST;            float4 _SpecularColor;            float  _SpecularGloss;            float4  _Diffuse;            v2f vert (a2v v)            {                v2f o;                o.uv = TRANSFORM_TEX(v.uv,_MainTex);                o.vertex = UnityObjectToClipPos(v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos  = mul(unity_ObjectToWorld,v.vertex).xyz;                return o;            }            fixed4 frag (v2f i) : SV_Target            {                // 1.ambientColor                float3  ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;                // 2.diffuseColor                float3 N =  normalize(i.worldNormal);                float3 L = normalize(_WorldSpaceLightPos0.xyz);                float3 diffuseColor = _LightColor0.rgb * _Diffuse.rgb * max(0.0,dot(N,L));                // 3.specularColor                float3  V = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                // H替代了Phong中的reflectDic = normalize(reflect(-L,N));                float3 H = normalize(L+V);                // 这里需要注意的是计算高光反射的时候使用的是【半角向量 H】和法向量的点积                float3 specularColor = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0,dot(H,N)),_SpecularGloss);                fixed4 col =  tex2D(_MainTex,i.uv) * float4 ((ambient+diffuseColor+specularColor),1);                return col;            }            ENDCG        }    }    FallBack "Specular"}
你可能感兴趣的文章
函数和常用模块1 装饰器
查看>>
第七章作业2
查看>>
Zookeeper原理
查看>>
后端程序员之路 32、Index搜索引擎实现分析1-类的设计
查看>>
在DevExpress程序中使用内置的图标构建美观的界面元素【转】
查看>>
JAVA入门之数组
查看>>
spring注解方式注入
查看>>
增加CentOS最大打开文件数/文件描述符
查看>>
健身VS不健身,完全是两种不同的人生!
查看>>
【转发】centos 7安装完后出现please make your choice from '1' ......
查看>>
linux:jenkins的那点事
查看>>
大数据学习第8天
查看>>
unittest 单元测试
查看>>
随记(十)--'xxx' does not contain bitcode报错
查看>>
.net 服务器空间生命周期
查看>>
<aop:aspectj-autoproxy proxy-target-class="false|true"/>使用时的问题
查看>>
商品综合练习题
查看>>
day 45 Django 的初识2 路由层,视图层,模板层
查看>>
C/C++的编译过程
查看>>
mysql存储过程游标使用
查看>>