【Unity Shader入门精要 第6章】基础光照(二)

1. 获取环境光

unity shader中可以通过 UNITY_LIGHTMODEL_AMBIENT获取当前环境光颜色信息。

fixed4 frag(v2f i) : SV_Target
{return UNITY_LIGHTMODEL_AMBIENT;
}

在这里插入图片描述

2. 漫反射

2.1 兰伯特模型

  • 创建Chapter_6_Diffuse_Lambert作为测试材质
  • 创建Chapter_6_Diffuse_Lambert作为测试shader,并赋给Chapter_6_Diffuse_Lambert材质
  • Pass中增加Tags{“LightMode” = “ForwardBase”},并添加引用 #include “Lighting.cginc”
  • 场景中创建胶囊体,将Chapter_6_Diffuse_Lambert材质赋给胶囊体
  • 场景中添加一盏平行光,并调整平行光角度

shader如下:

Shader "MyShader/Chapter_6/Chapter_6_Diffuse_Lambert"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;fixed4 color : COLOR0;};fixed4 _Diffuse;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 _lightDir = normalize(ObjSpaceLightDir(i.vertex));float3 _normal = normalize(i.normal);fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_normal, _lightDir));o.color = fixed4(_diffuse + _ambient, 1);return o;}fixed4 frag(v2f i) : SV_Target{return i.color;}ENDCG}}
}

shader效果如下:
在这里插入图片描述

2.2 半兰伯特模型

  • 将顶点着色器中的 fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_normal, _lightDir)); 修改为
    fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * (0.5 * dot(_normal, _lightDir) + 0.5);

效果如下:
在这里插入图片描述

2.3 逐像素的漫反射

  • 以兰伯特模型为基础,将光照计算改为在片元着色器中逐像素处理
  • 需要在顶点着色器中先将顶点的法线转换到世界空间
  • 然后在片元着色器中用插值得到的当前像素的法线方向与世界空间下的光源方向进行光照计算
  • 由于平行光不关心位置信息,因此对于平行光源,_WorldSpaceLightPos0.xyz存储的是光源的方向而不是位置

shader如下:

Shader "MyShader/Chapter_6/Chapter_6_Diffuse_LambertInFragment"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;float3 worldNormal : COLOR0;};fixed4 _Diffuse;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);o.worldNormal = mul(i.normal, (float3x3)unity_WorldToObject);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_worldNormal, _worldLight));return fixed4(_diffuse + _ambient, 1);}ENDCG}}
}

效果如下:
在这里插入图片描述
可见与逐顶点光照相比,阴影边缘明显更加平滑

3. 高光反射

3.1 逐顶点光照的Phong模型

shader如下:

Shader "MyShader/Chapter_6/Chapter_6_Specular_PhongInVertex"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 20}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;fixed4 color : COLOR0;};fixed4 _Diffuse;fixed4 _Specular;half _Gloss;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _lightDir = normalize(ObjSpaceLightDir(i.vertex));float3 _normalDir = normalize(i.normal);fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_lightDir, _normalDir));float3 _viewDir = normalize(ObjSpaceViewDir(i.vertex));float3 _reflDir = normalize(2 * dot(_lightDir, _normalDir) * _normalDir - _lightDir);fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow(saturate(dot(_viewDir, _reflDir)), _Gloss);o.color = fixed4(_diffuse + _specular + _ambient, 1);return o;}fixed4 frag(v2f i) : SV_Target{   return i.color;}ENDCG}}
}

效果如下:
在这里插入图片描述

3.2 逐像素光照的Phong模型

  • 这里用 reflect(-_worldLight, _worldNormal) 方法代替了原来手动计算反射光线的过程,二者结果是一样的
  • reflect方法要求传入的入射光方向是从光源指向照射点,因此需要将原来计算得到的光源方向先取反再传入

shader如下:

Shader "MyShader/Chapter_6/Chapter_6_Specular_PhongInFragment"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 20}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;float3 worldNormal : COLOR0;float3 worldPos : COLOR1;};fixed4 _Diffuse;fixed4 _Specular;half _Gloss;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);o.worldNormal = mul(i.normal, (float3x3)unity_WorldToObject);o.worldPos = mul(unity_ObjectToWorld, i.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_worldNormal, _worldLight));float3 _viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);
//                float3 _reflDir = normalize(2 * dot(_worldNormal, _worldLight) * _worldNormal - _worldLight);float3 _reflDir = normalize(reflect(-_worldLight, _worldNormal));fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow(saturate(dot(_viewDir, _reflDir)), _Gloss);return fixed4(_diffuse + _specular + _ambient, 1);}ENDCG}}
}

效果如下:
在这里插入图片描述

3.3 逐像素光照的Blinn-Phong模型

shader如下:

Shader "MyShader/Chapter_6/Chapter_6_Specular_BlinnPhongInFragment"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 20}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;float3 worldNormal : COLOR0;float3 worldPos : COLOR1;};fixed4 _Diffuse;fixed4 _Specular;half _Gloss;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);o.worldNormal = mul(i.normal, (float3x3)unity_WorldToObject);o.worldPos = mul(unity_ObjectToWorld, i.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed3 _diffuse = _LightColor0.rgb * _Diffuse.xyz * saturate(dot(_worldNormal, _worldLight));float3 _worldView = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);float3 _h = normalize(_worldLight + _worldView);fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow(saturate(dot(_h, _worldNormal)), _Gloss);return fixed4(_diffuse + _specular + _ambient, 1);}ENDCG}}
}

效果如下:
在这里插入图片描述
相同Gloss下感觉Blinn-Phong好像要更发散一些,逐顶点的Blinn-Phong就不做了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ollama api只能局域网访问,该怎么破?

安装ollama: ollama离线安装,在CPU运行它所支持的那些量化的模型-CSDN博客文章浏览阅读178次,点赞2次,收藏6次。ollama离线安装,在CPU运行它所支持的哪些量化的模型 总共需要修改两个点,第一:Ollama下载地址;第二:Ollama安装包存放目录。第二处修改,修改ollama安装目…

洛谷官方提单——【入门4】数组——python

洛谷官方提单——【入门4】数组 小鱼比可爱题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码 小鱼的数字游戏题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定 代码 【深基5.例3】冰雹猜想题目描述输入格式输出格式样例 #1样例输入 …

matlab打开文件对话框

在使用matlab GUI制作时,为了便于用户交互使用,经常设置文件打开对话框,让用户根据实际需要选择打开的文件。下面以打开一张图片为例,matlab代码如下: [temp_filepath,temp_filename]uigetfile(*.jpg,请选择要打开的图…

从心理学角度看,GPT 对人有什么影响?

开启个性化AI体验:深入了解GPT的无限可能 导言 GPT 与我们日常生活的融合标志着技术进步的重大飞跃,为提高效率和创新提供了前所未有的机遇。然而,当我们与这些智能系统日益紧密地交织在一起时,探索它们对个人产生的细微的心理影响…

电子杂志制作攻略,轻松打造高质量数字出版物

随着数字科技的飞速发展,电子杂志作为一种新型的数字出版物,已经越来越受到人们的青睐。它不仅具有丰富的内容、多样的形式,还具有便捷的传播和阅读方式。如今,电子杂志已经逐渐成为企业、媒体和个人展示自身品牌、传播信息的重要…

下载驱动包提示 通常不会下载 未验证的下载

打开设置 添加允许站点 如果还是下载不了,那只能换资源了

发那科数控机床远程监控数据上云

发那科数控机床远程监控数据上云 在当今数字化、网络化的工业生产环境中,发那科数控机床作为全球领先的高端制造设备之一,其远程监控数据上云已成为实现智能制造、提升生产效率和优化资源管理的重要手段。本文将深入探讨发那科数控机床远程监控数据上云…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式,也就是异步网络模式,允许事件驱动…

axios异步操作第一篇

1 同步请求和异步请求 客户端给java后台程序发送请求,发送请求的方式有两种: 同步请求 同步请求发送方式: 1 浏览器地址栏,输入url:http://localhost:8080/web-app/xxxServlet 2 3 删除 4 javascript:location.hr…

运营商的mpls专线

在当今高速发展的数字化时代,网络已成为企业发展不可或缺的基础设施。作为企业网络 连接的重要组成部分,MPLS专线在运营商的推动下逐渐成为了企业选择的首选。 MPLS(Multi-Protocol Label Switching)是一种基于标签的交换技术&am…

探索渲染农场的高性能奥秘

在当今数字化的时代,渲染农场正逐渐成为许多行业不可或缺的强大工具。那么,为什么我们说渲染农场是高性能的计算机系统呢?让我们深入剖析其中关键要点。 “渲染农场”拥有大规模的计算资源。它由众多高性能的计算机节点组成,这些…

理解伽马分布

伽马分布 关键词:Gamma Distribution 文章目录 一、说明二、Gamma 分布的基础概念2.1 Gamma 分布的物理意义2.2 对比泊松与伽马分布2.3 伽马分布参数 三、具有伽马分布的高效牙科调度四、后记 一、说明 在本文中,我们将探讨统计学中的基本概率分布之一…

【C++】命名空间、缺省参数、函数重载、引用

文章目录 1.认识命名空间2.命名空间的使用3.C的输入和输出4.缺省参数4.1缺省参数的概念4.2缺省参数的分类 5.函数重载6.引用6.1引用的概念6.2引用的特性6.3常引用(重点题目)6.4引用和指针的区别 1.认识命名空间 C总计63个关键字,C语言32个关键字 下面让我们学习一…

周进院长受邀出席2024第四届屈光手术国际论坛获多项荣誉称号!

周进院长受邀出席2024第四届屈光手术国际论坛获“全国首批EVOICL(V5)新技术临床应用专家”等多项荣誉称号! 5月10-12日,由爱尔眼科医院集团主办、长沙爱尔眼科医院协办的2024第四届屈光手术国际论坛(IRSS 2024&#x…

618洗地机怎么选?热门洗地机选购指南,拒绝踩雷

洗地机是一种智能化的清洁工具,具有超强的清洁能力,能轻松应对各种地面污渍,无论是干污还是湿污。其一键操作设计简便易上手,省去了传统清洁方式的繁琐步骤,节省了时间和精力。高端型号更配备智能感应功能,…

ARP中间人

文章目录 ARP中间人ARP协议介绍使用kali进行ARP毒化使用kali进行ARP中间人使用kali进行ARP钓鱼ARP攻击防御ARP总结 ARP中间人 ARP协议介绍 维基百科ARP介绍 ARP(地址解析协议)在网络通信中扮演着至关重要的角色,它通过将网络层地址&#x…

吴恩达机器学习笔记:第 10 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 10 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 10 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更…

大模型LLM 结合联网搜索增强isou

参考: https://isou.chat/ https://github.com/yokingma/search_with_ai 安装github下载,运行docker compose 如果一直报下面错误: 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开: http://192.16***…

教练预约管理小程序开发源码现成案例(小程序、APP、H5圆源码搭建)

随着人们对身体健康越来越重视,对强身健体、健康个性化生活的需求日益增加,健身已成为时尚生活的标志。 然而,没有时间去健身房却成了很多上班族的痛点。健身房作为一项既能缓解工作压力又能缓解学业压力的运动,正好满足了当代人…

每日OJ题_贪心算法四⑦_力扣1054. 距离相等的条形码

目录 力扣1054. 距离相等的条形码 解析代码 力扣1054. 距离相等的条形码 1054. 距离相等的条形码 难度 中等 在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等…