Unity Shader之自定义漫反射光照模型

Unity Shader自定义光照模型 前几天去一家公司面试,因为简历上写着“能写简单的Shader”,就被问了一个问题:怎么自定义一个光照模型? 直接懵逼了,隐隐约约能联想到的什么漫反射光+镜面反射光+环境光...难道是这个?光照模型就是#pragam surface surf Lambert里面的那个Lambert呗?这不都是写好的吗?还能自定义啊?!本着“程序是严谨的”的心态,宁可说不知道,也不能瞎说。。。 今天有空,抓紧学习 阅读详情

不积跬步,无以至千里;不积小流,无以成江海。(来自《劝学》- 荀子)

在优快云或者其他前辈的blog中大家都可以找到类似的教程
为什么我还要去写呢 , 主要是因为我想加入些自己的理解

发现文字真是个好东西,它可以引起人们的无限遐想,所以很多前辈都会推荐看书学习,也许正是因为这个原因吧。

本节重点
:如何在unity shader中实现可定义光照模型
注:unity3D在cginc中已经提供了很强大的光照模型函数,不过,一个好的项目,或者是一个好的游戏视觉冲击,需要的就不仅仅是这些了。

直接上代码了,注释将尽可能详细

shader"Cook Book Shader / Basic Diffuse"
{
    Properties
    {
        _MainTex("MainTex",2D) = "white"{}  
    }

    SubShader
    {
        //告诉系统在渲染非透明物体时调用这个着色器,当然也有在渲染透明物体时的设置,以后再说
        Tags{"RenderType" = "Opaque"}
        LOD 200

        CGPROGRAM
        //告诉着色器将采用basicdiffuse光照模型进行计算
        #pragma surface surf BasicDiffuse

        //声明一个光照模型函数,这里注意,函数名的格式是:Lighting + 你自定义的任何名字  以这里为例:Lighting + BasicDiffuse
        inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 LightDir,fixed atten)
        { 
            //max大家应该很清楚,就是取当前最大值
            //而dot函数是CG语言的内置数学函数,作用呢便是知道两个向量之间的角度是多少
            //a b 两个向量点积运算可以用公式:a b  = ||a|| ||b|| cos(a与b的夹角)
            //所以大家可以计算出,如果两个向量之间夹角是锐角,点积结果将大于0,反之将小于0,如果恰巧等于90度则点积结果为0

            //所以 在这里进行点积运算,max的作用便是限制点击函数的计算结果,确保计算结果永远大于0
            float DifLight = max(0,dot(s.Normal,LightDir));

            float4 col;
            //s.Albedo是surf函数处理后的输出,也就是说我们这个光照模型将在原基础上进行增强
            //这里的_LightColor0.rgb则来自unity,由Unity根据场景中的光源得到的,它在Lighting.cginc中声明的
            //然后再与刚才计算的光强系数(DifLight)和输入的衰减系数(atten)相乘
            col.rgb = s.Albedo  * _LightColor0.rgb * (DifLight * atten * 2);
            col.a = s.Alpha;

            return col;
        }


        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf(Input IN,inout SurfaceOutput o)
        {
            float4 c = tex2D(_MainTex,IN.uv_MainTex);

            o.Albedo = c.rgb;
            o.Alpha = c.a;

        }





        ENDCG

    }

    fallback"Diffuse"
}

在最后介绍下三种格式的光照模型函数

1.half4 LightingName1(SurfaceOutput s,half3 LightDir,half atten){}
该函数用于不需要视角方向的前向着色(也就是我们刚才用的)
2.half4 LightingName2(SurfaceOutput s,half3 LightDir,half3 viewDir,half atten){}
该函数用于需要视角方向的前向着色(多了个viewDir)
3.half4 LightingName3_PrePass(SurfaceOutput s, half4 Light){}
用于延迟着色

还是忘记了说明一些问题,下面进行补充吧
1.surfaceOutput:是表面着色器的标准输出结构,它的内容是这样的

struct SurfaceOutput   
{  
    half3 Albedo;            //也就是纹理颜色值(r,g,b),上述shader中可以看出它的作用   
    half3 Normal;            //法线,法向量(x, y, z)  , 上述中也用到了
    half3 Emission;          //自发光颜色值(r, g,b)   
    half Specular;           //镜面反射度   
    half Gloss;              //光泽度  
    half Alpha;              //透明度 ,上述中也用到了 
}; 

2.表面着色器必须放在SubShader块内,而不是指定在某个pass内,因为,表面着色器将在多重通道内编译自己。

【Unity Shader】 Lambert(兰伯特)光照模型 Unity Shader Lambert光照模型与漫反射 一、漫反射简介 漫反射的特点 二、漫反射光照模型-Lambert(兰伯特)光照模型 Lambert 余弦定理 三、自定义UnityShader实现漫反射(Diffuse)效果 写法 效果展示 参考 Unity Shader Lambert光照模型与漫反射 一、漫反射简介 一束平行光入射到凹凸不平的表面... 阅读详情

相关推荐

【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇

我的唠叨不知不觉,从发表第一篇关于《Unity Shaders and Effects Cookbook》已经快十个月了。一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免有种急躁感。从一开始几乎只有我一个人在奋斗,到现在时不时有人学习留言或者发邮件鼓励我,能有人和我一起学习我已经很开心了。谢谢所有鼓励和支持我的人~我先说下我的博客里这个系列的特点~首先声明,这不是纯翻译,我的插图绝

candycat 2万+

【Unity SurfaceShader】学习笔记(八)光照模型

LitSphere(Matcap) 发光球体光照模型就是将发光球体的纹理映射在球体上,来实现光照效果。这可以创造一些效果细腻的发光球体效果,但是它不受光照影响,改变光照的方向,球体的光照效果不变。如果要在固定视角的场景里制作细腻的球体光照,这会是一个不错的选择。 准备小球纹理贴图: 定义Properties: Properties { _MainTint ("Diffuse Tint", Color) = (1,1,1,1) .

第7维度 - 日常笔记 742

Playwright自动化测试实战:攻克日历时间控件三大策略与Java实现

在Web自动化测试领域,元素定位与交互模拟是核心技术基础,其原理在于通过程序精确识别并操作页面中的DOM元素,以模拟真实用户行为。这项技术的核心价值在于提升测试效率、确保交互逻辑的覆盖度与可靠性,广泛应用于电商、金融、OA等系统的功能验证。日历时间控件作为典型的复杂交互组件,常涉及动态弹出层、多级导航与状态同步,是自动化测试中的常见难点。本文聚焦于使用Playwright工具,针对此类控件深入剖析了三种核心解决策略:从最高效的直接赋值、到全面模拟用户交互的主流方法,再到利用组件特性的混合定位方案,并结合Ja

weixin_28835551的博客 311

Shader学习笔记(三)自定义光照模型,经典光照模型Lambert与HalfLambert

Unity Shader自定义光照模型,经典光照模型Lambert与HalfLambert

henger_的博客 3005

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4701

OpenClaw实战四|内容创作全流程AI助理:自动撰稿+智能剪辑+多平台发布,一人顶一个内容团队

AI替代的是「写稿、剪辑、发布」这种流水线工作,真正让你解放出来,去做选题、创意、人设、变现这些高价值的事。OpenClaw这套内容创作全流程AI助理,最大的价值不是「帮你发内容」,而是让一个人,拥有一个内容团队的产能。不管是个人博主、小团队,还是企业新媒体,都能用零代码的方式,快速搭建属于自己的自动化内容矩阵。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 589

【Unity Shaders】学习笔记之为创建自定义慢反射光照模型(五)

一、简介   Lambert的光照模型是一个很经典的漫反射模型,光强与入射光的方向和反射点处表面法向夹角的余弦成正比。简单解释就是一个点的反射光强是和该点的法线向量和入射光向量和强度和夹角有关系的,其结果就是这两个向量的点积。光照模型的计算是在surf方法的表面着色之后,根据输入的光照条件,对原来的颜色在这种光照下的表现进行计算,最后输出新的颜色值给渲染单元完成在屏幕的绘制自定义光照模型,需要先

程序员小毛驴的博客 2181

Flink实战(101):双流join(三)双流中实现Inner Join、Left Join与Right Join

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 简介 之前文章中提到JoinedStream与CoGroupedStream,例如下列代码: dataStream.join(otherStream) .where(0).equalTo(1) .window(TumblingEventTimeWindows.of(Time.seconds(3))) .apply { ... } 由于joinedStream与

微信搜:import_bigdata,大数据领域硬核原创作者 737

Unity Shader(三)创建自定义漫反射光照模型

在上一节的代码上进行修改,如下: Shader "Custom/BasicDiffuse" { Properties { _EmissiveColor("Emissive Color",color) = (1,1,1,1) _AmbientColor("Ambient Color",color) = (1,1,1,1) _MySliderValue("This is a Sli...

JPF29 524

带有HSE组件的S32系列芯片中各子系统如何依次启动?

仔细阐述了上电后各个子系统的启动顺序,并给出了详细的启动步骤流程图。

车载系统攻城狮 1702

【Python深度学习】做深度学习训练时,如果数据集太大,无法一次性加载进GPU,应该如何做?

方法核心思想优点缺点适用场景实现复杂度小批量训练(Mini-Batch Training)与数据加载器(DataLoader)将数据集划分为小批量,每次只加载一个小批量到GPU中进行训练。- 易于实现- 是深度学习的标准做法- 支持多进程加载- 内存可能成为瓶颈- 需要调整批量大小避免内存不足适用于大部分场景低数据分片与分布式训练(Data Sharding & Distributed Training)将数据集分片,每个GPU或节点处理其中一部分数据,分布式训练。

若北辰 1143

Unity Shader 高光反射光照模型-Blinn-Phong

光照模型-Blinn-Phong Shader "Unlit/BlinnPhongLevel" { Properties { _Diffuse("Diffuse",Color) = (1,1,1,1) _Specular("Specular", Color) = (1, 1, 1, 1) _Gloss("Gloss", Range...

songhuanfei2017的博客 213

突破Cloudflare 5秒盾!Python爬虫+GPT分析JS混淆实战(附完整代码)

这篇文章的核心观点其实不是“怎么过CF”,而是如何把LLM嵌入逆向工程的工作流。AI不会取代逆向工程师,但它正在重新定义逆向工程师的工作方式。过去我们80%的时间花在读懂混淆代码上,现在这部分可以外包给GPT,我们把精力集中在架构判断、异常处理和系统设计这些真正需要人类直觉的地方。技术会变,CF的防护会升级,GPT的能力也会迭代。但这种“人机协作拆解复杂问题”的方法论,比任何具体的绕过技巧都更有长期价值。参考资料Cloudflare Bot Management官方文档。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 535

Unity3D游戏开发从零单排(十) - 进击的Shader续

自定义光照模型在这之前首先来了解一下SurfaceOutput这个结构体,它是一个包含大多数描述一个物体表面渲染特征的结构,具体结构如下:struct SurfaceOutput { half3 Albedo;//纹理颜色 half3 Normal;//法线 half3 Emission;//自发光,不受照明的影响 half Specular;//高光指数 half Gloss;//光泽

爱冒险的技术宅 3097

ThingsBoard教程(七):模拟设备遥测

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了六篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 上一篇我们讲解了如何使用设备管理来对设备进行增删改查,和设备配置的一些基本概念,本篇文章就带大

知无涯 4580

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Shader-(顶点实现)漫反射相关;自定义颜色

漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) )  点积cosθ = 光方向· 法线方向    //max表示小于0时取最大值0 只有定义了正确的LightMode才能得到一些Unity的内置光照变量    Tags{ "LightMode"="ForwardBase" } 包含unity的内置的文件,才可以使用unity内置的一些变量         ...

qq_42459006的博客 576

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

创建自定义漫反射光照模型

Shader "Custom/aaa" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaq...

weixin_34101784的博客 192

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《Unity Shader》 6.4.2 逐像素光照

Chapter6-DiffusePixelLevel的代码和6.4.1小节中的非常相似,因此我们首先把6.4.1节中的代码直接粘贴到Chapter6-DiffusePixelLevel中,并进行如下修改。在本书资源中,该Shader名为Chapter6-DiffusePixelLevel。把新的Shader赋给第2步中创建的材质。(2)新建一个材质。在本书资源中,该材质名为DiffusePixelLevelMat。(4)把第2步中创建的材质赋给胶囊体。(1)使用6.4.1节中使用的场景。

jtymyxmz的博客 362

Unity Shader学习记录第一章

No.1学习对象为[大神冯乐乐的优快云](https://blog.youkuaiyun.com/candycat1992/category_9262054.html)本节主要学习了属性 Properties三种自定义光照模型函数漫反射光照模型半兰伯特光照模型渐变图实现双向反射分布优化的光照模型tex2D函数 dot函数等代码记录如下 学习对象为大神冯乐乐的优快云 本节主要学习了 属性 Properti...

qq_30058057的博客 246

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)——自定义光照模式

上篇文章中我们已经说到,表面着色器将分为两次讲解,上一篇文章中介绍了表面着色器的基本概念和一些写法,用内置的兰伯特光照模式来进行Surface Shader的书写,而本文将介绍Surface Shader+自定义的光照模式的写法

学习者专栏 2446

Unity表面着色器自定义光照模型:从原理到实战实现风格化与PBR渲染

在计算机图形学中,光照模型是决定三维物体表面如何与光线交互、从而生成最终颜色的核心算法。其原理基于物理学中的光线反射、折射定律以及能量守恒,通过数学公式模拟光与材质的相互作用。掌握自定义光照模型的技术价值在于,它使开发者能够突破引擎内置渲染管线的限制,实现从写实到风格化的任意视觉表现,是技术美术(TA)和图形程序员的必备技能。在游戏开发、影视特效和实时可视化等应用场景中,自定义光照模型是实现独特艺术风格(如卡通渲染、丝绸质感)和优化特定平台渲染性能的关键。本文聚焦于Unity表面着色器(Surface Sh

cqwf95925的博客 431

UnityShader之六 表面着色器-自定义光照模式

UnityShader系列文章转载于 @浅墨_毛星云,为本人的学习笔记,转载请注明出处。 文章链接:https://blog.youkuaiyun.com/poem_qianmo/article/details/42611531 漫反射         漫反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点...

m0_37884055的博客 1285

unity3D 教程宝典之Shader篇:第十六讲自定义光照模型

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院                        Shader第十六讲 自定义光照模型 十四讲我们实现了基本的SurfaceShader,十五讲讲了光照模型的基础知识。这一讲说的是如何写光照模型。 自定义光照模型主要分为4步: (0)架设框架,填写需要的参数 (1)计算漫反射强度 (2)计算镜面反射强度 (3

进击的Unity3d 818

漫反射

Shader "Custom/CustomDiffuse" { Properties { _Color ("Color", Color) = (1,1,1,1) } SubShader { Tags { "LigthMode"="ForwardBase" } Pass { CGPROGRAM float4 _Color; #pragma vertex vert #

l_jinxiong的专栏 720

urp下实现blinnPhong基础光照模型

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' Shader "Custom/testLightShader" { Properties { _Diffuse("Diffuse", Color) = (1,1,1,1) _Specular("Specular", Color) = (1,1,1,1) _Gloss("Gloss", Range(8.0,...

570
上一篇: 3D数学基础之矩阵初探
下一篇: UnityShader官方案例讲解——SurfaceShader(1)
测试账号0001
博客等级 码龄10年 13粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值