0基础尝试实现UnityURP渲染管线的AdditionalLit(点光源,聚光灯)非平行光的光照模型代码
目录
0基础其实最好
代码的本质
代码的入口
代码分析
代码逻辑
代码实现
自行练习
0基础其实最好
其实不可能是0基础,但是0基础反而能习得上乘武功,就好像张三丰说的,忘了你爸吧
假如你现在开始看现在的Unity URP或Standard Shader
1-如果熟读乐乐姐的《入门精要》,那是2015年出版的,2013年开始写,写的那是一个优雅,而你再看现在Unity内部Shader,我保证你内伤。
2-如果你有多年程序经验,你会觉得看不明白的代码,肯定是好代码,但细心想想,这年头还看不明白的代码,本来只剩100年前的汇编语言,这个UniyShader排第二看不懂。
3-如果你会一点微积分,懂公式推理,熟悉微平面理论,我劝你放下,今天我们只谈买菜的功夫。
所以,先自宫,再往下看:
=================================================================
//关键代码uint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, positionWS);//踩坑之后,发现,还是自己写一个自定义渲染管线
//踩坑之后,发现,还是自己写一个自定义渲染管线
//踩坑之后,发现,还是自己写一个自定义渲染管线
代码的本质
天下武功,唯快不破;代码亦如此,就是一输入,然后一输出,别整那些花里胡哨的。
代码的入口
<找到Package目录下的Shader目录>
说说我是怎么发现这个入口的吧(反正自宫之后,现在大家都不懂Unity,不懂写代码,就一普通具备正常思维能力的人儿)
1.project 面板,右键,创建一个材质
2.材质面板,Shader选Universal RP ->Lit.shader
3.材质面板,上部(shader)右键->Edit Shader.
即可定位到 Lit Shader
代码分析
<一大堆代码,都不用看,就一句代码有用:Lit.shader这个文件引用了XXXXPass.hlsl这个文件>
600行代码,就这一句有用,《其他不用看》
代码逻辑
发现Spot lit 点光源的逻辑,就是在 LitForwradBase.hlsl 这文件
最终你会发现,是初始化了SurfaceData,然后把这个参数传给:
UniversalFragmentPBR()这个方法计算出最终的颜色
half4 LitPassFragment(Varyings input) : SV_Target
{ //.............SurfaceData surfaceData;InitializeStandardLitSurfaceData(input.uv, surfaceData);InputData inputData;InitializeInputData(input, surfaceData.normalTS, inputData);half4 color = UniversalFragmentPBR(inputData, surfaceData);
代码实现(核心代码)
#ifdef _ADDITIONAL_LIGHTSuint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, inputData.positionWS, shadowMask);#if defined(_SCREEN_SPACE_OCCLUSION)light.color *= aoFactor.directAmbientOcclusion;#endifcolor += LightingPhysicallyBased(brdfData, brdfDataClearCoat,light,inputData.normalWS, inputData.viewDirectionWS,surfaceData.clearCoatMask, specularHighlightsOff);}
#endif
自行练习
<试了一晚上,发现还是得用官方得brdf结构体,好处就是所有光都帮你算好了,公式给你封装,2行代码,可支持点光源,聚光灯,和Area光,而且还是Urp管线下,不好的地方就是代码没法写,一个代码整的不可扩展,真的,程序是一个专业活,TA和美术就不要写代码了,重写又不是,重构又重构不了>
贴出所有代码吧
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
SurfaceData surfaceData;InitializeStandardLitSurfaceData(i.uv, surfaceData);half3 colorAdd = half3(0,0,0);uint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, positionWS);//1.// float4 lightPositionWS = _AdditionalLightsPosition[lightIndex];// float3 lightVec = lightPositionWS - positionWS;// // 表面到光线的距离// float d = length(lightVec);// // 光的衰弱// float att = 1.0f / dot(0.1, float3(1.0f, d, d * d));//// colorAdd += light.color * att;//2.毫无根据,乱来的方法//colorAdd += IndirectColor * light.distanceAttenuation*30;//3.出处: // // https://zhuanlan.zhihu.com/p/368888374// //range是光源的有效范围// float4 lightPositionWS = _AdditionalLightsPosition[lightIndex];// float3 lightPosition = lightPositionWS.xyz;// //float range = lightPositionWS.w;//不是Matrix// float3 lightVector = lightPosition - positionWS;// //lightRangeSqr = -1.0 * lightRangeSqr / 0.36;//http://www.kittehface.com/2020/05/light-universal-render-pipeline-to.html// float range = 6;//搞了很久,没法搞到官方 urp 管线下的 lit range.......^@^&T^!!^*^!^!! // float rangeSqr = range * range;// float3 lightDir = normalize(lightVector);// float distanceToLightSqr = dot(lightVector,lightVector);// //距离衰减系数// //float atten = _AdditionalLightsAttenuation[lightIndex];// float atten = DistanceAtten(distanceToLightSqr,rangeSqr);//自定义方法// //float atten = DistanceAttenuation(distanceToLightSqr,rangeSqr);//官方方法// //高光项// //half3 specular = BlinnPhongSpecular(viewDir,normal,lightDir,property.shininess) * property.specularColor;// //漫反射项// //half3 diffuse = LambertDiffuse(normal,lightDir) * property.diffuseColor;// colorAdd += IndirectColor*atten;//4.依赖light.distanceAttenuation,但好像没什么卵用// // float3 lightVector = lightPositionOrDirection.xyz - worldPos * lightPositionOrDirection.w;// float3 lightDirection = normalize(lightVector);// float diffuse = saturate(dot(N, lightDirection));//// float rangeFade = dot(lightVector, lightVector) * light.distanceAttenuation;// rangeFade = saturate(1.0 - rangeFade * rangeFade);// rangeFade *= rangeFade;//// float distanceSqr = max(dot(lightVector, lightVector), 0.00001);// diffuse *= rangeFade / distanceSqr;// colorAdd += IndirectColor*diffuse;//5.use BRDF Struct(暂时)BRDFData brdfData;BRDFData brdfDataClearCoat = (BRDFData)0;// NOTE: can modify alphaInitializeBRDFData(surfaceData.albedo, surfaceData.metallic, surfaceData.specular, surfaceData.smoothness, surfaceData.alpha, brdfData);bool specularHighlightsOff = false;colorAdd += LightingPhysicallyBased(brdfData, brdfDataClearCoat,light,N, V,surfaceData.clearCoatMask, specularHighlightsOff);}
参考:
这位小哥讲URP“”实战“”,也讲的很清楚了
【Unity】Custom URP Shader(1)—— 让每个物体受不同强度的平行光照射 - 知乎
0基础尝试实现UnityURP渲染管线的AdditionalLit(点光源,聚光灯)非平行光的光照模型代码相关推荐
- 30岁想转行零基础学什么好(0基础转行学什么技术不晚)
30岁没什么技术,想转行赚钱养家,除了工厂还有哪些工作推荐呢?今天班妹儿就整理出了,上啥班看视频找工作中3个不需要任何技术,适合大多数人改行的工作,特别是最后一个,强烈推荐30岁以上的女生试试. 1. ...
- 0基础该如何学Python?这些方法你必须了解
往期好文推荐 学习Python不需要程基础? 0基础不用怕,从0到1轻松教你入门Python 由于python在人工智能,机器学习,大数据,数据分析,网络爬虫,全方位的技能特点,是非常适合初学者入门和 ...
- windows环境下32位汇编语言程序设计 90盘_Python 0基础详细教程 环境安装01
Python语言有什么用,首先让大家了解Python语言的基本知识: Python语言是一种解释型,面向对象,动态数据类型的高级程序设计语言,Python语言是数据分析师的首选数据分析语言,通过数据挖 ...
- 《ActionScript 3.0基础教程》——1.4 对象参数
本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第1章,第1.4节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...
- python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...
- form表单中根据值判断是否disabled_Java 0基础入门 (Html表单、表单元素)
上一篇:Java 0基础入门 (Html标签的使用) 表单在网页中主要负责数据采集功能. 一.表单实际应用场景 百度搜索 5173注册 如上两张图,图中的黑色线条是我画上去的,如果按照黑线,在Excl ...
- h5评论直接显示代码_全套H5教程免费学,让你0基础自学制作H5页面
当前,H5页面已成为各大品牌及新闻媒体普遍采取的表现形式,它可以通过优质的内容.新颖的创意向用户推广产品.传播信息,并利用互联网的快速性,短时间内达到很高的浏览量和识别度.相较于H5而言,海报或视频设 ...
- 0基础学绘画怎么临摹
0基础学板绘插画怎么临摹?今天给大家带来的是板绘插画临摹绘画教程,下面开始进入详细的板绘插画临摹绘画步骤讲解吧! 0基础学绘画怎么临摹: 第一步:用九宫格的方式先画出剪影,这是最基础的一步啦! 第二步 ...
- python 0基础容易学吗_Python0基础好学吗?
我先不回答难或者不难,我先说说我的过程 我是大概19年初开始学的python.那时候我就剩一点点C语言的基础.因为我大学学的是软件工程.学过一些数据结构和算法.C语言. 毕业设计的时候,我用java非 ...
- 转行做美工设计有没有前途?0基础怎么学好美工设计?
本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 转行做美工设计有没有前途?0基础怎么学好美工设计?随着电商时代的快速发展,美工的前景越来与越被看好,因此导致很多人加 ...
最新文章
- python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺
- 苹果挂端口方法_一招教你,让光猫四个端口既能上网又能IPTV,不用再区分端口...
- java中常用的一些方法(一)
- 生产环境中on yarn模式是否采用yarn session
- java 共享锁_Java锁--共享锁和ReentrantReadWriteLock
- gojs实现最短路径寻址实例
- Matplotlib 中文用户指南 3.2 图像教程
- Python标准库glob用法精要
- ffmpeg 最简单的转码封装mp4文件
- 用友修改服务器名称,用友修改服务器地址
- apache设置域名绑定 以及绑定不起作用的排查.
- Python数据可视化库汇总整理
- 怎样高效地管理自己阅读过的文献资料?
- 2019年湖南省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书-A卷
- python3.7怎么设置字体大小,python字体大小如何设置
- 基于Arduino的密码+指纹智能锁(LCD1602显示器)
- 开篇记(好记性不如烂笔头)
- np.loadtxt加载数据集遇到ValueError: invalid literal for float(): 3.7194476e+06 -1.2636059e+05错误
- python安装hydra
- Linux系统内核优化
热门文章
- 家谱整站源码php_基于PHP语言的家谱网站的设计与实现.doc
- centos老是自动更换ip地址解决方案
- 搭建Flutter-iOS开发环境
- arcgis批量裁剪影像tif流程_【ArcGIS自定义脚本工具】批量裁剪中国多省份NDVI影像...
- python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
- 制作u盘winpe启动盘_干货| 如何制作U盘启动盘安装操作系统
- 7-3 人民币与美元汇率兑换程序 (10分)
- android设备刷机精灵,使用刷机精灵给安卓手机刷机教程
- java时间转换之天数计算
- 【其他】微信双开、多开的几种方法