目录

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(点光源,聚光灯)非平行光的光照模型代码相关推荐

  1. 30岁想转行零基础学什么好(0基础转行学什么技术不晚)

    30岁没什么技术,想转行赚钱养家,除了工厂还有哪些工作推荐呢?今天班妹儿就整理出了,上啥班看视频找工作中3个不需要任何技术,适合大多数人改行的工作,特别是最后一个,强烈推荐30岁以上的女生试试. 1. ...

  2. 0基础该如何学Python?这些方法你必须了解

    往期好文推荐 学习Python不需要程基础? 0基础不用怕,从0到1轻松教你入门Python 由于python在人工智能,机器学习,大数据,数据分析,网络爬虫,全方位的技能特点,是非常适合初学者入门和 ...

  3. windows环境下32位汇编语言程序设计 90盘_Python 0基础详细教程 环境安装01

    Python语言有什么用,首先让大家了解Python语言的基本知识: Python语言是一种解释型,面向对象,动态数据类型的高级程序设计语言,Python语言是数据分析师的首选数据分析语言,通过数据挖 ...

  4. 《ActionScript 3.0基础教程》——1.4 对象参数

    本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第1章,第1.4节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...

  5. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  6. form表单中根据值判断是否disabled_Java 0基础入门 (Html表单、表单元素)

    上一篇:Java 0基础入门 (Html标签的使用) 表单在网页中主要负责数据采集功能. 一.表单实际应用场景 百度搜索 5173注册 如上两张图,图中的黑色线条是我画上去的,如果按照黑线,在Excl ...

  7. h5评论直接显示代码_全套H5教程免费学,让你0基础自学制作H5页面

    当前,H5页面已成为各大品牌及新闻媒体普遍采取的表现形式,它可以通过优质的内容.新颖的创意向用户推广产品.传播信息,并利用互联网的快速性,短时间内达到很高的浏览量和识别度.相较于H5而言,海报或视频设 ...

  8. 0基础学绘画怎么临摹

    0基础学板绘插画怎么临摹?今天给大家带来的是板绘插画临摹绘画教程,下面开始进入详细的板绘插画临摹绘画步骤讲解吧! 0基础学绘画怎么临摹: 第一步:用九宫格的方式先画出剪影,这是最基础的一步啦! 第二步 ...

  9. python 0基础容易学吗_Python0基础好学吗?

    我先不回答难或者不难,我先说说我的过程 我是大概19年初开始学的python.那时候我就剩一点点C语言的基础.因为我大学学的是软件工程.学过一些数据结构和算法.C语言. 毕业设计的时候,我用java非 ...

  10. 转行做美工设计有没有前途?0基础怎么学好美工设计?

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 转行做美工设计有没有前途?0基础怎么学好美工设计?随着电商时代的快速发展,美工的前景越来与越被看好,因此导致很多人加 ...

最新文章

  1. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺
  2. 苹果挂端口方法_一招教你,让光猫四个端口既能上网又能IPTV,不用再区分端口...
  3. java中常用的一些方法(一)
  4. 生产环境中on yarn模式是否采用yarn session
  5. java 共享锁_Java锁--共享锁和ReentrantReadWriteLock
  6. gojs实现最短路径寻址实例
  7. Matplotlib 中文用户指南 3.2 图像教程
  8. Python标准库glob用法精要
  9. ffmpeg 最简单的转码封装mp4文件
  10. 用友修改服务器名称,用友修改服务器地址
  11. apache设置域名绑定 以及绑定不起作用的排查.
  12. Python数据可视化库汇总整理
  13. 怎样高效地管理自己阅读过的文献资料?
  14. 2019年湖南省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书-A卷
  15. python3.7怎么设置字体大小,python字体大小如何设置
  16. 基于Arduino的密码+指纹智能锁(LCD1602显示器)
  17. 开篇记(好记性不如烂笔头)
  18. np.loadtxt加载数据集遇到ValueError: invalid literal for float(): 3.7194476e+06 -1.2636059e+05错误
  19. python安装hydra
  20. Linux系统内核优化

热门文章

  1. 家谱整站源码php_基于PHP语言的家谱网站的设计与实现.doc
  2. centos老是自动更换ip地址解决方案
  3. 搭建Flutter-iOS开发环境
  4. arcgis批量裁剪影像tif流程_【ArcGIS自定义脚本工具】批量裁剪中国多省份NDVI影像...
  5. python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
  6. 制作u盘winpe启动盘_干货| 如何制作U盘启动盘安装操作系统
  7. 7-3 人民币与美元汇率兑换程序 (10分)
  8. android设备刷机精灵,使用刷机精灵给安卓手机刷机教程
  9. java时间转换之天数计算
  10. 【其他】微信双开、多开的几种方法