高光反射公式:

Specular= 直射光颜色 * pow(max(dot(当前点的反射光方向,当前点到摄像机的方向),0),高光反射参数)

逐顶点高光反射:

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/Shader03"{Properties{_Color("_Color",Color) = (1,1,1,1) //物体本身的颜色_SpecularColor("_SpecularColor",Color)=(1,1,1,1) //高光的颜色_Gloss("Gloss",Range(8,200)) = 10 //控制高光光圈大小}SubShader{Pass{//定义LightMode以得到unity的内置光照变量Tags{"LightMode" = "ForwardBase"}CGPROGRAM//unity内置文件引入,要使用unity的内置变量#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;half _Gloss;fixed4 _SpecularColor;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 position : SV_POSITION;fixed3 color : COLOR;};v2f vert(a2v v) {v2f f;//UNITY_MATRIX_MVP 坐标从模型空间转剪裁空间f.position = UnityObjectToClipPos(v.vertex);//法线的单位向量:_World2Object 把一个方向从世界空间转模型空间fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));//光的单位向量:对于每个顶点来说,平行光位置就是光的方向 _WorldSpaceLightPos0 取得平行光的位置fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//取得漫反射颜色fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Color.rgb;//反射光方向fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));//当前点到摄像机的方向fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(v.vertex, unity_WorldToObject).xyz);//高光反射fixed3 specular = _LightColor0.rgb * pow(max(dot(reflectDir, viewDir), 0), _Gloss) *_SpecularColor;//环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//颜色叠加f.color = diffuse + specular + ambient;return f;}fixed4 frag(v2f f) : SV_Target{return fixed4(f.color,1);}ENDCG}}FallBack "Diffuse"
}

逐像素高光反射:

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/Shader03"{Properties{_Color("_Color",Color) = (1,1,1,1) //物体本身的颜色_SpecularColor("_SpecularColor",Color)=(1,1,1,1) //高光的颜色_Gloss("Gloss",Range(8,200)) = 10 //控制高光光圈大小}SubShader{Pass{//定义LightMode以得到unity的内置光照变量Tags{"LightMode" = "ForwardBase"}CGPROGRAM//unity内置文件引入,要使用unity的内置变量#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;half _Gloss;fixed4 _SpecularColor;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 position : SV_POSITION;float3 worldNormal : TEXCOOED0;float3 worldVertex : TEXCOOED1;};v2f vert(a2v v) {v2f f;//UNITY_MATRIX_MVP 坐标从模型空间转剪裁空间f.position = UnityObjectToClipPos(v.vertex);f.worldNormal = mul(v.normal, (float3x3) unity_WorldToObject);f.worldVertex = mul(v.vertex, unity_WorldToObject).xyz;return f;}fixed4 frag(v2f f) : SV_Target{//法线的单位向量:_World2Object 把一个方向从世界空间转模型空间fixed3 normalDir = normalize(f.worldNormal);//光的单位向量:对于每个顶点来说,平行光位置就是光的方向 _WorldSpaceLightPos0 取得平行光的位置fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//取得漫反射颜色fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Color.rgb;//反射光方向fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));//当前点到摄像机的方向fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - f.worldVertex);//高光反射fixed3 specular = _LightColor0.rgb * pow(max(dot(reflectDir, viewDir), 0), _Gloss) *_SpecularColor;//环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//颜色叠加fixed3 tempColor = diffuse + specular + ambient;return fixed4(tempColor,1);}ENDCG}}FallBack "Diffuse"
}

对比:

Unity Shader------Specular(高光反射)计算相关推荐

  1. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  2. specular图使用方法_Unity| Specular高光反射初探(上)

    哈喽,上次我们有分享过Diffuse漫反射的基本光照原理Unity | Diffuse Light漫反射光照,现在我们来聊一下另外一个反射,specular镜面或者高光反射. 在OpenGL中,光照使 ...

  3. Shader实现高光反射

    高光反射又叫做镜面反射:用于模拟有光泽物体的上面出现的光点.高光反射的颜色相比于物体的颜色会更倾向与光的颜色.(漫反射:模拟光源对物体的方向性影响.) 首先是Phong光照模型: 公式: v是视角方向 ...

  4. Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数

    1 高光反射光照模型计算公式 从公式可以看出,要计算高光反射需要知道 4 个参数:入射光线的颜色和强度c,材质的光反射系数 m,视角方向v以及反射方向r.其中,反射方向r可以由表面法线n和光源i计算得 ...

  5. Unity Shader标准光照模型——高光反射

    高光反射 顶点高光反射 Shader "Unlit/HighLightReflection" {Properties{_diffuse("diffuse",Co ...

  6. Unity Shader知识点(三)高光反射Shader

    前言 此文及专栏系是以Shader入门精要为基础整理的Unity Shader学习笔记,尽量以初学者视角还原(其实半年前我就是初学者),错误还需指正. 本篇是实操部分的第三个Shader,即高光反射S ...

  7. Unity Shader 高光反射光照模型

    高光反射光照模型计算公式如下: 需要四个参数:入射光线的颜色和强度,材质的高光反射系数,视角方向,反射方向. 反射方向可以由表面法线和光源方向计算而得: 也可以直接使用CG提供的计算反射方向的函数re ...

  8. Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型

    我们是如何看到这个世界的 从宏观上来说,渲染包含了两大部分 决定一个像素的可见性 决定这个像素上的关照计算 而光照模型就是用于决定一个像素上进行怎样的光照计算 通常来讲,我们要模拟真实的光照环境来生成 ...

  9. unity入门精要之第6 章 Unity 中的基础光照---实现高光反射光照模型

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 参考 前言 在6.2.4 节中,我们给出了基本光照模型中高光反射部分的计算公式: 从公式可以看出,要计算高光反射需要知道4 个参数:入射 ...

  10. shader基础学习摘要(三)高光反射

    高光反射 理论推导 代码实践 Phone光照模型 逐顶点 逐像素 Blinn-Phong光照模型 内置函数 理论推导 在6.2.4节中,我们给出了基本光照模型中高光反射部分的计算公式 高光反射求的夹角 ...

最新文章

  1. 线性代数投影法在线性回归中的应用
  2. 云计算的台前幕后 ——微云网络
  3. Bottle源码阅读(3) HeaderDict
  4. c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)
  5. jsoncpp在linux和windows下的编译及使用详解
  6. Pygame - Python游戏编程入门(1)
  7. 循环队列 队空、队满 条件
  8. 什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?
  9. Python学习16 正则表达式2 re模块
  10. LwIP应用开发笔记之十:LwIP带操作系统基本移植
  11. Vim 激荡 30 年发展史
  12. 大胆尝试随需消费的软件培训模式
  13. 基于java的铁路火车售票系统
  14. ETERM操作和错误集合
  15. 哈佛大学公开课《幸福课》笔记
  16. 通过L-evy飞行进行布谷鸟搜索
  17. 高防服务器的机房硬件防火墙类型和主要功能
  18. 高数篇:02费马定理
  19. 【自然语言处理】【文本风格迁移】基于风格实例的文本风格迁移
  20. fcpx绘制遮罩_FCPX插件6组画面冻结定帧静止转场介绍效果 Freeze Frame Transitions【资源分享1542】...

热门文章

  1. 关于matlab 画水平线
  2. fatal: unsafe repository is owned by someone else 的解决方法
  3. mysql 按照经验排名_根据以往经验整理的典型性能bug
  4. 什么是4k视频分辨率
  5. 我与北窗青年的2020丶
  6. android 状态栏高度多少像素,Android之获取屏幕的尺寸像素及获取状态栏标题栏高度...
  7. Dreamweaver CS6 破解安装
  8. python基础坑点
  9. 阴阳师服务器维护6,《阴阳师》手游6月10日维护更新公告
  10. OPTIONS方法禁用