首页
学习
活动
专区
圈层
工具
发布

基础渲染系列(九)——复合材质

Unity 4.1通过扩展MaterialEditor添加了对自定义材质检查器的支持。你仍然可以执行此操作,但是ShaderGUI是在5.0中添加的。它的创建与材质有关。...(法线贴图 和凹凸比例) 当为材质指定了法线贴图时,标准着色器仅显示凹凸比例。也可以通过检查属性是否引用纹理来做到这一点。如果是这样的话,请显示凹凸比例。...2.5 调试关键字 可以使用调试检查器来验证我们的关键字是否已添加到材质中或从材质中删除。通过其选项卡栏右上方的下拉菜单将检查器切换到调试模式。...自定义关键字在“Shader Keywords”文本字段中显示为列表。 ? (调试检视器) 由于以前在材质中分配了着色器,因此你在此处会找到的所有着色器关键字。...在GetSmoothness中,从1开始。然后检查是否选择了反照率源。如果是的话,则将1替换为反照率图。否则,检查是否选择了金属源,如果是,则使用金属图。

4.2K10

基础渲染系列(十一)——透明度

最后,我们还必须将截止值添加到自定义着色器用户界面。标准着色器在反照率线下方显示了cutoff 值,我们也一样。就像我们对“Smoothness”所做的那样,我们将显示一个缩进的滑块。 ? ?...给此关键字添加一个着色器功能,包括基本pass和附加pass。 ? 在我们的自定义UI脚本中,添加RenderingMode枚举,在不透明和抠图渲染之间进行选择。 ?...因此,我们将使用UI设置自定义渲染队列,而不是使用标记,它会取代着色器的队列。通过在检查器处于调试模式下进行选择,可以找出材质的自定义渲染队列是什么。...它的默认值为-1,表示没有设置自定义值,因此应使用着色器的Queue标记。 ? (自定义渲染队列) 我们并不真正在乎队列的确切值。在将来的Unity版本中,它们甚至可能会更改。...此着色器标记本身不会执行任何操作。这是一个提示,告诉Unity它是哪种着色器。替换着色器使用它来确定是否应渲染对象。 什么是replacement着色器? 它可以否决使用哪种着色器渲染对象。

4.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Unity基础教程系列(七)——可配置形状(Variety of Randomness)

    不是,但是也没有令人信服的理由对其进行保护。当直接与类外的枚举一起使用时,例如对于自定义编辑器,可能需要将其公开。...现在我们可以在ConfigureSpawn中检查移动方向是否设置为向上。如果是的话,请使用transform.up,否则请继续使用transform.forward。 ? ?...(空行) 因为我们没有在OnGUI中做任何事情,所以什么也没画。但是默认属性为其自身保留了一行,因此我们的生成配置的检查器已经缩小到所需的大小。...在绘制属性之前,Unity编辑器会检查是否存在适用于附加到其上的的drawer。如果是这样,它将使用那个。否则,它将检查是否存在适用于属性类型的drawer并使用该drawer。...Unity将负责检测更改并为我们支持撤消和重做。 ? 接下来,我们需要知道要显示的滑块的限制,该限制存储在属性中。我们可以通过PropertyDrawer的attribute属性访问它。

    3.4K30

    Unity基础教程系列(新)(四)——测量性能(MS and FPS)

    它可以可视化在一个帧中花费了多少时间。它显示了每个帧都以PlayerLoop开始,后者花费了大部分时间调用RunBehaviourUpdate。...(分析构建后的版本 DRP和URP) 因为没有编辑器开销,所以Build之后的性能应比Unity编辑器中的播放模式更好。Profiler确实将不再显示编辑器循环部分。...发生这种情况是因为Unity可以利用并行性在渲染线程完成之前启动主线程上下一帧的更新循环。我们将在下一部分稍后再讨论。...(可配置的显示模式) 然后,当我们在Update中刷新显示时,请检查模式是否设置为FPS。如果是,请执行我们已经在做的事情。否则,将FPS标头替换为MS并使用反参数。...返回到Graph,为过渡模式添加配置选项,可以是循环或随机的。再次使用自定义枚举字段执行此操作。 ? 选择下一个功能时,请检查转换模式是否设置为循环。

    4.6K21

    Unity通用渲染管线(URP)系列(十四)——多相机(Camera Blending & Rendering Layers)

    现在,我们可以在CameraRenderer.Render的开头获取相机的CustomRenderPipelineCamera组件。为了支持没有自定义设置的相机,我们将检查组件是否存在。...因此透明度是可行的,但Bloom不可以叠加,除非显示纹理,否则像素完美的双线性过滤将使相机的黑色背景颜色在透明边缘周围显示为黑色轮廓。 为了支持其他混合模式,我们需要创建一个自定义UI着色器。...(使用预乘alpha混合自定义UI着色器的Raw UI图像。) 在哪里可以找到默认的UI着色器源代码? 转到Unity的档案下载,找到所需的Unity版本,然后从任一下拉菜单中选择“内置着色器”。...在继续渲染图层之前,让我们在灯光的检查器中将其剔除掩码设置为除“ Everything”以外的其他内容时显示警告。可以通过其cullingMask整数属性(其中-1代表所有层)来提供灯光的剔除掩码。...我们需要从设置中获取相关属性,确保处理多重选择的混合值,掩码获取为整数,将其显示,然后将更改后的值分配回该属性。这是默认灯光检查器版本所缺少的最后一步。

    10.2K22

    Unity通用渲染管线(URP)系列(一)——自定义渲染管线(Taking Control of Rendering)

    选择一个Draw Call后,可以在帧调试器的ShaderProperties部分中检查此矩阵。 目前来说,unity_MatrixVP矩阵始终相同。...我们可以使用命令缓冲区注入给Profiler注入样本,这些样本将同时显示在Profiler和帧调试器中。通过在适当的位置插入BeginSample和EndSample就可以完成。...3 编辑器渲染 自定义的RP正确地绘制了Unlit对象,但我们还可以做一些事情来改进在Unity编辑器中的使用。...为此,我们总是在方法的前面声明部分加partial,类似于抽象的方法声明。其实可以在类定义的任何部分这样做,所以让我们把它放在编辑器部分。完整的方法声明也必须标记为partial。 ?...(场景没有gizmos) 我们可以通过调用UnityEditor.Handles.ShouldRenderGizmos来检查是否应该绘制gizmos。

    18.5K136

    Unity基础教程系列(十二)——更复杂的关卡(Spawn,Kill,and Life Zones)

    它是一个检查对象是否可以强制转换为特定类型的运算符。如果是,则执行cast。如果不是,则结果为空。 可以使用is操作符来检查是否可以进行类型转换,如果True,则进行类型转换,但这需要进行冗余检查。...因为我们将在Unity编辑器中使用这个属性,levelObjects数组可能还不存在,所以我们也必须检查这个。 ? 接下来,在编辑器文件夹中为GameLevel创建一个自定义检查器类。...如果是这的话,请在默认检查器下方显示错误消息,以使其在视觉上显而易见。这是通过使用字符串和错误消息类型调用EditorGUILayout.HelpBox来完成的。 ? ?...将其列入List将表明在运行过程中进行更改是可以的,这不是我们设计的方式。 通过使用标签调用GUILayout.Button,在我们的自定义检查器中的错误消息下方添加一个按钮。...这是将类(或结构)定义拆分为多个部分(存储在不同文件中)的一种方法。唯一的目的是组织代码。典型的用例是将自动生成的代码与手动编写的代码分开。就编译器而言,它们都是同一类定义的一部分。

    2.1K51

    Unity基础教程系列(新)(一)——游戏对象和脚本(Creating+a+Clock)

    创建之后,它将添加到项目列表中,并在相应版本的Unity编辑器中打开。 是否可以使用其他渲染管线创建项目? 可以,唯一的区别是该项目在其默认场景中将包含更多内容,并且你的材质将有所不同。...C#是用于Unity脚本的编程语言,发音为C-sharp。让我们立即将其放置在新的Scripts文件夹中,以保持项目整洁。 ? ? (Clock脚本) 选择脚本后,检查器将显示其内容。...现在,我们可以将自定义组件添加到Unity中的Clock游戏对象中。可以通过将脚本资产拖动到对象上,也可以通过对象检查器底部的Add Component 按钮来完成。 ?...字段可序列化后,Unity将对其进行检测并将其显示在Clock游戏对象的Clock组件的检查器窗口中。 ?...请注意,我们的Clock组件在检查器中的名称前面获得了一个切换开关。这使我们可以禁用它,从而阻止Unity调用其Update方法。 ?

    5.4K20

    Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)

    枚举器接口 IEnumerator 包含3个方法: Current:返回集合当前位置的对象 MoveNext:把枚举器位置移到集合的下一个元素,它返回一个bool值,表示新的位置是否超过索引 Reset...原因很简单,数组Array它是一个可枚举的类(enumerable),一个可枚举类提供了一个枚举器(enumerator),枚举器可以依次访问数组里的元素,也就是之前提过的Current属性返回集合当前位置的对象...当然我们也可以创建自己的可被枚举的类,需要为它提供自定义的枚举器,只需实现IEnumerator接口即可。...要解惑yield这是第二个阶段:能知道枚举器是怎样工作的。 如果你很清楚上诉两个阶段的内部原理之后,要理解Unity中的Coroutine是非常简单的,你会了解为什么它是伪的“多线程”。...本章内容对多线程开了个头,我将在下篇文章中说说怎样在Unity中使用和管理多线程。 源代码托管在Github上,点击此了解

    1.6K60

    Unity开发游戏的技术框架

    在Unity中的应用:Model: 游戏数据、业务逻辑(如玩家生命值、背包数据、任务系统)。View: Unity的UI元素(Canvas, Text, Image等),负责显示Model的数据。...在Unity中的应用: 用于实现撤销/重做功能、游戏行为记录、网络同步(将玩家操作封装成命令发送)。4.State Machine (状态机):特点: 管理对象在不同状态之间的转换和行为。...在Unity中的应用: 角色动画状态机、敌人AI行为状态机、游戏流程状态机(如游戏开始、进行中、暂停、结束)。...可以是简单的枚举,也可以是复杂的层级状态机(Hierarchical State Machine, HSM)或行为树(Behavior Tree)。...Message Brokers / Event Bus: 如UniRx (Reactive Extensions for Unity) 或简单的自定义事件管理器,用于实现解耦的组件间通信。

    66310

    Unity基础教程系列(九)——形状行为(Modular Functionality)

    本文重点: 1、定义形状的抽象和具体行为 2、只在需要的时候才包含行为 3、创建通用的方法和类 4、试用条件编译 5、给枚举添加方法 6、让形状摆动起来 本教程是CatLikeCoding系列的一部分,...如果要继续使用Unity组件,则一旦将行为添加到形状中,就无法将其删除。可以使用该限制,例如,不破坏未使用的组件,并在以后需要时添加它们之前检查它们是否已经存在。...根据是否定义了在#if之后写入的符号来做出决定。可以通过#define指令定义符号,但是也可以通过代码编辑器或其他应用程序将符号传递给编译器。...这个时候,Unity确保在编译我们的代码以供在编辑器中使用时定义UNITY_EDITOR符号。同样的方法也可以用于检查Unity版本以及代码针对哪个目标平台进行编译。...虽然我们不能直接将方法放在枚举类型中,但可以使用扩展方法间接地进行操作。

    1.7K40

    Unity通用渲染管线(URP)系列(十三)——颜色分级(Playing with Colors)

    (Split toning 设置) 将两种颜色都发送到PostFXStack中的着色器,将它们保留在伽玛空间中。平衡值可以存储在一种颜色的第四部分中,缩放到-1~1范围。 ?...Unity没有可包含在编辑器中的默认色盘编辑器部件。URP和HDRP都包含自己的(尽管等效)版本。区域的GUI也是自定义的。 将这三种颜色发送到GPU,转换为线性空间。...区域范围可以打包在单个向量中。 ? 在着色器中,我们将颜色分别乘以三种独立的颜色,每种颜色按其自身的权重进行缩放,对结果求和。权重基于亮度。...但是,我们不会在检查器中强制执行此操作,就像我们不强制让开始一定在结束前面一样。 ? ?...Color Curves是一个功能强大的工具,可用于多种效果,包括使除单一颜色之外的所有颜色均饱和。但是,它依赖于自定义曲线编辑器,需要重做很多工作。因此,它不在本教程中。

    4.9K31

    Unity性能调优手册3:分析工具,Profile,FrameDebugger,MemoryProfiler,HeapExplorer

    Unity Profiler是一个很好的工具,可以粗略地查看性能,因为有各种各样的模块可用。 可以将这些模块配置为在分析器上显示或不显示。但是,没有显示的模块不会被测量。...你可以看到哪个着色器是用什么属性处理的。 在查看此屏幕时,请记住以下内容进行分析。 •是否有不必要的指令?...Memory UsageOverview 显示每个对象的差异。 在树映射表中,一个Diff项被添加到Header中。差异可以是以下类型 通过查看这些信息,可以检查内存是在增加还是在减少。...需要Unity 2022.1或更高版本,但现在可以在列表视图和对象信息(如Unity子系统)中查看TreeMaps。其他新功能包括检查可能的重复对象的能力。...在下面的部分中,我们将重点关注类别细节的重要部分。 对象 当Native Memory 为“调查”时,该区域显示c++对象。在托管内存的情况下,c#对象将显示在这个区域。

    3.2K22

    Unity通用渲染管线(URP)系列(三)——方向光(Direct Illumination)

    (不正确和正确的法线转换) 为了验证是否在LitPassFragment中获得正确的法线向量,我们可以将其用作颜色看看。 ? ? (世界空间的法线向量) 负值无法显示,因此将其限制为零。...你可以通过着色器检视面板中的“Compile and show code ”按钮来检查编译器的工作。...这告诉Unity编辑器使用CustomShaderGUI类的实例来绘制使用Lit着色器的材质的检查器。为该类创建脚本资产,并将其放入新的Custom RP / Editor文件夹中。...5.2 设置属性和关键字 要完成任务,我们需要访问三项内容,并将其存储在字段中。首先是材质编辑器,它是负责显示和编辑材质的基础编辑器对象。...我们将其命名为“Transparent ”,因为它用于具有正确照明的半透明表面。 ? 在OnGUI的末尾调用预设方法,使它们显示在默认检查器下方。 ? ?

    6.4K40

    Unity通用渲染管线(URP)系列(二)——Draw Calls(Shaders and Batches)

    所以我们就不再包括它的内容了。简单来说就是,我们只想在它还没有被定义过的时候,插入代码。在定义宏之前使用#ifndef指令检查是否包含过。 ?...但是,这仅适用于兼容的着色器,而我们的Unlit着色器则无效。你可以通过在检查器中选择它来进行验证。有一个SRP Batcher行指示不兼容,并在下方给出了一个原因。 ?...在OnValidate中执行此操作,以便结果立即显示在编辑器中。 ? OnValidate什么时候调用? 加载或更改组件后,将在Unity编辑器中调用OnValidate。...这将使Unity生成我们的着色器的两个变体,一个具有GPU实例化支持,一个不具有GPU实例化支持。材质检查器中还出现了一个切换选项,使我们可以选择每种材质要使用的版本。 ?...必须告诉Unity根据关键字是否已定义来编译着色器的不同版本。为此,我们将#pragma shader_feature _CLIPPING添加到其Pass中的指令中。 ?

    7.2K51

    LayaAir开始在GitHub实时提交了,2.3版支持多光源渲染, 3D效果华丽提升!3D导出插件支持Unity2018了!

    另外LayaNative的调试器,也会更新到最新版本,支持iOS最新的系统,解决部分iOS手机无法成功安装调试器的问题。...开发者直接在新的Unity2018插件模式下导出资源即可,(注意:3D插件最好要对应引擎的版本,虽然新版引擎可以兼容旧版插件导出的资源,但新版引擎的配套功能只有在新插件中才可以使用。...另外有一处Unity 5.6.x升级到Unity2018.x的注意事项,那就是在导出光照贴图时需要将Unity中PlayerSetting的LightmapEncode切换为normal模式,才会正常。...开发者还可以在自定义Shader中轻松的接入多光源渲染函数(具体可参考引擎官方Shader),使得LayaAir引擎在实时渲染质量上又迈出了一步。 ?...,其后,我们不断的推出大版本更新,逐步完成了规划中大部分计划中的引擎能力。

    1.8K30

    Unity 中 C#脚本里的方括号声明(含常用声明介绍)

    最近开始学unity,对于一些基础知识,还是习惯边码边写文章的形式来学习。 在js中,中括号是定义数组的,在c#中,中括号是进行声明的(c#中用{}定义数组),而声明中最常见的是序列化属性。...在序列化期间,对象将其当前状态写入到临时或持久性存储区,之后便可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。...结构、枚举、委托"声明有效,能在编辑器面板显示类的属性(可修改) [Serializable]public class myClass{public int a=0;public int b=1;}[SerializeField...]void MoveTo111 (){} range‍ 成员属性 在 Inspector 面板中显示一个滑动条。...Color cc; 在编辑器中要显示下选项可以用序列化的枚举声明,代码如下: //枚举的下拉表达 [Serializable] public enum days{a,b,c} [SerializeField

    3K10

    游戏开发设计模式之单例模式

    具体实现是先检查实例是否存在,如果不存在再进行同步操作。...在Unity中,单例模式与其他设计模式(如工厂模式、建造者模式)的结合使用案例。 在Unity中,单例模式与其他设计模式(如工厂模式、建造者模式)的结合使用案例可以从多个角度进行探讨。...为了防御反射对单例的破坏,可以采用以下几种策略: 使用枚举:将单例类声明为枚举,这样可以防止通过反射创建新的实例,因为枚举是不可变的,且Java不支持反射操作枚举类型。...静态内部类:在静态内部类中实现单例,这样可以利用Java的私有构造器保护机制,因为静态内部类的实例化只能在类加载时进行,且不能被外部反射调用。...双重检查锁定(Double-Check Locking) :在单例模式中使用双重检查锁定,即在初始化实例时先检查是否已经存在实例,如果不存在,则再进行同步操作创建实例。

    38510

    Unity3D之键盘输入

    获取按键状态 Unity的Input类提供了几个方法来获取按键的状态。 GetKey:GetKey方法用于检测指定按键是否被按住。...检测特殊按键 Unity的KeyCode枚举提供了许多常用的键码,以便帮助您检测特殊按键。...KeyCode.LeftShift:左Shift键 KeyCode.RightShift:右Shift键 KeyCode.LeftControl:左Ctrl键 KeyCode.RightControl:右Ctrl键 您可以使用这些键码来检测用户是否按下了特定的按键...自定义键位 如果您希望为按键输入设置自定义键位,您可以在Unity编辑器的"Edit"菜单下的"Project Settings"中找到"Input"选项。...在此处,您可以定义和配置输入轴(Axes)和按键(Keys)。通过添加、修改或删除自定义键位,您可以完全控制您的键盘输入设置。

    1.2K20

    3D场景编辑导出-LayaAir引擎Unity插件使用详解

    一、3D场景编辑器的研发规划 有开发者问过LayaAir引擎是否会有自己的3D场景编辑器,首先可以肯定的讲,一定会有。3D编辑器是LayaAir3.x引擎规划的基础组成部分(3.x正在研发中)。...在Unity里导入这个自定义的LayaAir功能包的过程,我们可以视为安装了一个LayaAir引擎资源导出的Unity插件。本小节会针对这个过程进行详细介绍。...场景中需要至少有一个Camera,调整好角度位置,在符合LayaAir引擎插件使用规范的情况下,基于LayaAir引擎的预览运行效果将会与Unity运行结果一致,如果不一样,需要检查是否使用了引擎不支持的功能...4.1 Inspector面板的基础属性 在Unity的Inspector面板中,可以查看和编辑Unity编辑器中几乎所有内容,下面我们先了解一下Inspector面板的基础通用属性。 ?...在上图中的Unity粒子渲染器属性里,LayaAir导出支持情况如下: Unity的粒子渲染器属性 LayaAir是否支持导出的说明 Render Mode(渲染模式) 部分支持(包括:Billboard

    5.4K41
    领券