Unity Shader------Specular(高光反射)计算
高光反射公式:
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(高光反射)计算相关推荐
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
- specular图使用方法_Unity| Specular高光反射初探(上)
哈喽,上次我们有分享过Diffuse漫反射的基本光照原理Unity | Diffuse Light漫反射光照,现在我们来聊一下另外一个反射,specular镜面或者高光反射. 在OpenGL中,光照使 ...
- Shader实现高光反射
高光反射又叫做镜面反射:用于模拟有光泽物体的上面出现的光点.高光反射的颜色相比于物体的颜色会更倾向与光的颜色.(漫反射:模拟光源对物体的方向性影响.) 首先是Phong光照模型: 公式: v是视角方向 ...
- Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数
1 高光反射光照模型计算公式 从公式可以看出,要计算高光反射需要知道 4 个参数:入射光线的颜色和强度c,材质的光反射系数 m,视角方向v以及反射方向r.其中,反射方向r可以由表面法线n和光源i计算得 ...
- Unity Shader标准光照模型——高光反射
高光反射 顶点高光反射 Shader "Unlit/HighLightReflection" {Properties{_diffuse("diffuse",Co ...
- Unity Shader知识点(三)高光反射Shader
前言 此文及专栏系是以Shader入门精要为基础整理的Unity Shader学习笔记,尽量以初学者视角还原(其实半年前我就是初学者),错误还需指正. 本篇是实操部分的第三个Shader,即高光反射S ...
- Unity Shader 高光反射光照模型
高光反射光照模型计算公式如下: 需要四个参数:入射光线的颜色和强度,材质的高光反射系数,视角方向,反射方向. 反射方向可以由表面法线和光源方向计算而得: 也可以直接使用CG提供的计算反射方向的函数re ...
- Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型
我们是如何看到这个世界的 从宏观上来说,渲染包含了两大部分 决定一个像素的可见性 决定这个像素上的关照计算 而光照模型就是用于决定一个像素上进行怎样的光照计算 通常来讲,我们要模拟真实的光照环境来生成 ...
- unity入门精要之第6 章 Unity 中的基础光照---实现高光反射光照模型
Unity系列文章目录 文章目录 Unity系列文章目录 前言 参考 前言 在6.2.4 节中,我们给出了基本光照模型中高光反射部分的计算公式: 从公式可以看出,要计算高光反射需要知道4 个参数:入射 ...
- shader基础学习摘要(三)高光反射
高光反射 理论推导 代码实践 Phone光照模型 逐顶点 逐像素 Blinn-Phong光照模型 内置函数 理论推导 在6.2.4节中,我们给出了基本光照模型中高光反射部分的计算公式 高光反射求的夹角 ...
最新文章
- 线性代数投影法在线性回归中的应用
- 云计算的台前幕后 ——微云网络
- Bottle源码阅读(3) HeaderDict
- c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)
- jsoncpp在linux和windows下的编译及使用详解
- Pygame - Python游戏编程入门(1)
- 循环队列 队空、队满 条件
- 什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?
- Python学习16 正则表达式2 re模块
- LwIP应用开发笔记之十:LwIP带操作系统基本移植
- Vim 激荡 30 年发展史
- 大胆尝试随需消费的软件培训模式
- 基于java的铁路火车售票系统
- ETERM操作和错误集合
- 哈佛大学公开课《幸福课》笔记
- 通过L-evy飞行进行布谷鸟搜索
- 高防服务器的机房硬件防火墙类型和主要功能
- 高数篇:02费马定理
- 【自然语言处理】【文本风格迁移】基于风格实例的文本风格迁移
- fcpx绘制遮罩_FCPX插件6组画面冻结定帧静止转场介绍效果 Freeze Frame Transitions【资源分享1542】...