【图形学】30 前向渲染多光照场景代码理解

来源:《UNITY SHADER入门精要》

文章目录

    • 1、代码理解

1、代码理解

  我们现在要注意光源的 5 个属性:位置、方向、颜色、强度、衰减
  在理解代码之前,我们依然需要熟悉我们的理论,主要我们要设置两个 Pass,注意它们的不同的特性,和要做的事情。

在这里插入图片描述

  注意,据书中所说,注意两个 Pass 中的 #pragma multi_complie_fwdbase 命令和 #pragma multi_complie_fwdadd 命令,在官方文档中没有说明,但是,实验表明,只有使用了这两个编译指令,我们才可以在相关的 Pass 访问到光照变量、、光照衰减值等等的变量。

Shader "Unity Shaders Book/Chapter 9/Forward Rendering" {Properties {_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Gloss ("Gloss", Range(8.0, 256)) = 20}SubShader {Tags { "RenderType"="Opaque" }Pass {// Pass for ambient light & first pixel light (directional light)Tags { "LightMode"="ForwardBase" }CGPROGRAM// Apparently need to add this declaration #pragma multi_compile_fwdbase	

  第 17 句,我们使用了 #pragma 编译命令。#pragma multicomplie_fwdbase 确保我们在 Shader 中使用光照衰减等光照变量可以被正确赋值。这个 Pass 我们称之为 BasePass,正如我们之前概念里提到的那样。

			#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);fixed atten = 1.0;return fixed4(ambient + (diffuse + specular) * atten, 1.0);}ENDCG}

  所有的工作都在片元着色器中完成,顶点着色器只是在做了最简单的坐标转换而已。我们这里依然使用了 _LightColor0 来获取光源的强度和 _WorldSpaceLightPos0 来获取场景中的位置。平行光的强度不会衰减,所以,我们这里 atten 赋值为1。
  如果一个场景中包含了多个平行光,Unity 会选择最亮的平行光传递给 Base Pass 进行逐像素处理,其他的平行光会按照逐顶点活在 Additional Pass 中按照住像素的方式处理。

		Pass {// Pass for other pixel lightsTags { "LightMode"="ForwardAdd" }Blend One OneCGPROGRAM// Apparently need to add this declaration#pragma multi_compile_fwdadd

  我们第二个 Pass ,按照理论知识,第 3 行,我们定义为 Addtional Pass,为此,我们首先需要设置 Pass 的渲染路径标签:"LightMode" = "ForwardAdd"
  第 5 行,我们使用 Blend One One 命令来对结果进行混合,而亲测,选择更容易理解的 Blend SrcAlpha DstAlpha 也能得到正确的效果。
  第10 行,我们还要给给出宏指令 #prgma multi_complie_fwdadd 指令,这样才能保证我们在 Addtional Pass 中获得正确的光照变量。

			#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}

  同样,顶点着色器做的事情几乎就是常规的操作。

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);#ifdef USING_DIRECTIONAL_LIGHTfixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);#elsefixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz);#endiffixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);#ifdef USING_DIRECTIONAL_LIGHTfixed atten = 1.0;#else#if defined (POINT)float3 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1)).xyz;fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;#elif defined (SPOT)float4 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1));fixed atten = (lightCoord.z > 0) * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;#elsefixed atten = 1.0;#endif#endifreturn fixed4((diffuse + specular) * atten, 1.0);
}			ENDCG}}FallBack "Specular"
}

  代码中共分为两个部分,第一个部分,第 3-13 行,我们进行第一个部分的处理:
  首先,我们仍然使用 _LightColor0 来得到光源的颜色和强度。我们使用 宏定义 #ifdef USING_DIRECTIONAL_LIGHT 来确定当前是否是平行光。因为,如果 Pass 处理的光源是萍乡光,那么 Unity 底层就会定义 USING_DIRECTIONAL_LIGHT。如果是平行光,那么可以直接使用 _WorldSpaceLightPos0.xyz 得到光源方向。如果是点光源或者聚光灯的话,那么 _WorldSpaceLightPos0.xyz表示的是世界空间下光源的位置。

  第二个部分,第 15-27 行,我们处理不同光源的衰减,如果是平行光的话,那 atten = 1 那就不衰减。如果是点光源或聚光灯,处理更加复杂,本来会涉及大量的开根号、除法等运算,但是为了节省效率,Unity 选择了使用一张纹理作为查找表(Lookup Table, LUT),对这个表取样,以获得光源的衰减值。


  例子中的场景有 5 个光源,其中 1 个是平行光,其他 4 个都是点光源。平行光会按照 Base Pass 逐像素的方式处理,其他四个点光源都会按照 Addtional Pass 中逐像素的方式处理,每一个光源都会调用一次 Additional Pass。
  但是如果我们手动把场景中的所有光源设置为 Not Important 那么,因为没有在 Bass Pass 中计算逐顶点 和 SH光源,因此场景中的 4 个点光源实际上不会对物体造成任何影响。

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

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

相关文章

OpenGL的3D场景模型大作业

【题目】 opengl 3D环境开发 本文标题:OpenGL的3D场景模型大作业 本文链接:https://xygeng.cn/post/84.html 作者授权:除特别说明外,本文由 庚哥哥 原创编译并授权 木芽博客 刊载发布。 版权声明:本文不使用任何协议…

RealityCapture场景建模笔记

Unity Photogrammetry Workflow 5.2.8 着色和贴纹理(Colorize or Texture)5.2.10. 网格输出(Mesh export)输出附有颜色信息的Mesh/点云 5.2.8 着色和贴纹理(Colorize or Texture) 选择哪个选项将取决于重建…

美国藤校Top30大学对IB成绩的要求

众所周知,IB体系是目前全球认可度比较高的国际课程。那么,用IBDP成绩申请美国TOP30大学需要什么样的成绩? 小智今天来带大家好好研究下美国TOP30大学对IB成绩的要求。 普林斯顿大学 Princeton University 普林斯顿大学对于IB成绩没有具体要…

2023 chatgptAPI查询 原生PHP+html+js+css代码

资源介绍 单文件不压缩6KB不到,总150行原生PHP html js css代码实现查询chatgptAPI,并打字效果展现回复内容(sse流式消息) 使用注意填写自己的APIKEY,推荐美国服务器或者主机部署。适合个人自用。单文件源码! 使用源码请先到官方申请apiKey…

推荐自媒体和文案相关神器(短视频与公众号)

一、新片场 介绍:新片场汇聚全球原创优质视频及创作人,提供4K、无广告、无水印视频观看,专业的视频艺术学习教程,正版视觉素材交易等,与百万创作人一起成长 网址:https://www.xinpianchang.com/ 图片&am…

自媒体人必看的几个文案网站,让文案创作更有色

作为自媒体人,无论是图文类还是视频类的,文案都是必不可少的,写出火爆的文案能为我们的内容增添色彩,当然这不可能一蹴而就,需要我们平时多看优质文案,尝试自己进行创作。 文案狗 文案狗是一个文案创意小工…

自媒体人绝对要知道的6款软件工具!免费文案、配音不在话下

NO.1丨喵盐配音(小程序) 喵盐配音,它是我近期使用次数较多的配音小程序。这是一款专注于文字转语音的智能语音合成小程序,不需要下载,v小橙序搜索在线使用。其拥有200多个抖音热门发音人,支持普通话、英语、…

chatgpt赋能python:Python代码报错?别慌!这些处理技巧教你轻松解决

Python代码报错?别慌!这些处理技巧教你轻松解决 作为一名有10年python编程经验的工程师,我深知遇到代码报错时的无助感。代码中报错似乎总会出现在最需要正常运行的时候。但是,不要慌!在这篇文章中,我将分…

商汤科技2020笔试题

题型分为20道选择题和3道编程大题。 1.选择题 struct1与struct2的区别 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配…

四面楚歌,商汤科技该如何在AI领域破局

https://www.toutiao.com/a6663198506368369159/ 文/于斌 在经历了多轮业内数额第一的融资之后,国内人工智能创业公司商汤科技再次传出了融资消息。这次据悉准备融资20亿美元。此前在经过软银中国投资10亿美元之后,商汤科技的估值已经达到60亿美元&…

商汤科技面试准备

商汤科技面试准备 秋招收到了东软医疗算法,明略科技算法,云从算法的Offer 但是在我沉淀了整个求职季之后 心心念念的商汤,终终终终终终终终终于给我发起面试邀请了 商汤一直是我最想进的企业,没有之一 一些长久以来,秋…

要做中国OpenAI的很多,但智源要打造大模型领域的Linux

衡宇 发自 凹非寺量子位 | 公众号 QbitAI “要做中国的OpenAI!”“要打造中国版ChatGPT!”ChatGPT的火以燎原之势蔓延到每一个角落。 人们目光的焦点聚集到这个具体的现象级应用,或者其它大模型支撑的类ChatGPT产品上。大模型似乎成为了人人都…

通过配置不当的微软app劫持Bing 搜索结果,获得4万美元漏洞奖励

聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 一款配置不当的微软应用可使任何人登录并实时修改 Bing.com 搜索结果以及注入 XSS 攻击,攻陷 Office 365 用户的账号。 Wiz公司的研究人员发现了该问题并将其描述为“BingBang”…

解读ChatGPT背后的技术重点:RLHF、IFT、CoT、红蓝对抗

近段时间,ChatGPT 横空出世并获得巨大成功,使得 RLHF、SFT、IFT、CoT 等这些晦涩的缩写开始出现在普罗大众的讨论中。这些晦涩的首字母缩略词究竟是什么意思?为什么它们如此重要?我们调查了相关的所有重要论文,以对这些…

谷歌优化扩散模型!在三星手机上运行Stable Diffusion,12秒内出图!

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【扩散模型】微信技术交流群 转载自:机器之心 | 编辑:陈萍、小舟 Speed Is All You Need:谷歌提出针对 Stable Diffusion 一些优化建议&am…

再次加入OpenAI,特斯拉前AI总监Andrej Karpathy刚刚官宣!

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>CV微信技术交流群 转载自:机器之心 官宣回归OpenAI,特斯拉前AI高级总监Andrej Karpathy的下家定了。 刚刚,特斯拉前 AI 高级总监 Andrej K…

行业前沿 | 畅想AIGC技术研究与应用实践(一)

AIGC的火热之势已经蔓延到各行各业,技术浪潮冲击下,关于AIGC创业、AIGC未来发展方向以及AIGC的应用实践等,企业、投资者以及技术产品专家们有着不一样的思考。 近日,数美科技联合AMD举办的AIGC沙龙活动,邀请了经纬创投…

用GPT-4一天赚440元/ PyTorch2.0稳定版正式发布/ 谷歌眼镜彻底告别舞台…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 嗯咳咳~今天是3月16日星期()。 V我50(Doge)带你看看科技圈都发生了哪些大事。 周鸿祎:GPT要消灭人类 周鸿祎又语出惊人!前脚GPT-4刚刚发布&#xff0…

互动福利|免费试用阿里云端TuGraph图数据库,还有GoPro、filco键盘、苹果HomePod mini等你拿!...

想要对数据关系进行 更好的数据可视化? 更高效的数据处理? 更精准的数据分析? 更快的查询速度? 来试试图数据库吧! 为鼓励更多用户探索应用图数据库,TuGraph联合阿里云计算巢,开放限量免费…

用AI给娃定制绘本 #麻瓜+AI混合工作流试验 9

这次试着用AI给娃定制一本绘本,目的是解决一个问题——娃很喜欢国际象棋,但在下棋的时候又很怕输……过程中尽量少人工参与,先看半成品,再说工作流。 这个画风,有点像娃喜欢的《工作细胞》。 主要流程 第一步&#xff…