首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

本文重点: 1、创建自定义着色器GUI 2、混合金属和非金属 3、使用非统一平滑度 5、支持自发光表面 (温馨提示:本系列知识是循序渐进,推荐第一次阅读同学第一章看起,链接在文章底部) 这是关于渲染系列教程第九部分...在我们着色器调整细节纹理显示名称,以匹配标准着色器。 ? ? (次要贴图) 细节法线贴图工作原理与主法线贴图相同。奇怪是,标准着色器GUI不会隐藏细节凹凸比例。...例如,选择新材质,标准着色器GUI就会添加_EMISSION关键字。它们对我们着色器没有用,因此将其列表删除。...2.7 仅在需要时设置关键字 目前,我们通常在每次调用OnGUI时都设置材质关键字。逻辑上讲,只有在map属性被编辑,我们才需要这样做。...污渍比木板光滑,因此那里纹理浅。 ? (平滑度贴图) Unity标准着色器希望将平滑度存储在Alpha通道。实际上,可以实现,金属贴图和平滑贴图在同一纹理结合在一起。

3.3K10

进阶渲染系列(一)——平坦和线框着色(导数和几何体)

理想情况下,可以使用自定义材质 在一个单一pass下,对任何网格进行平面着色和线框渲染。要创建这种材质,需要一个新着色器。我们将使用“渲染”系列第20部分最终着色器作为基础。...如果仅需要平面着色,则屏幕空间派生工具是实现该效果最便宜方法。然后,你还可以网格数据删除法线(Unity可以自动执行此操作),并且还可以删除法线插值器数据。...通常,如果你不想使用自定义几何图形阶段,可以这样做。不过,我们将继续使用几何方法,因为线框渲染也将需要它。 2 渲染线框 处理完平面着色,我们继续渲染网格线框。...(较宽宽度,但有失真现象) 这样可以产生清晰线条,但也会在三角形拐角附近线条显示出锯齿失真现象。出现失真的原因是最近边缘在那些区域中突然改变,从而导致不连续导数。...现在可以配置着色器,但是属性尚未出现在我们自定义着色器GUI

2.4K21
您找到你想要的搜索结果了吗?
是的
没有找到

进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

为了使其明显,再次将法线用于反照率。 ? ? (切线空间中投影法线) 最终法向向量不正确。切线法线以其局部向上方向(远离表面)存储在Z通道,因此结果大部分为蓝色。...(具有混合偏移材质) 在权重归一化之前,先从权重减去偏移量,然后看会是什么样子。 ? ? (不正确偏移) 当混合权重保持为正时看起来不错,但是负权重会最终数据消除。...(所有混合设置,最小值VS最大值 情况) 5 自定义着色器GUI 我们没有使用为其他着色器创建着色器GUI类,因为它不适用于三向着色器。它依赖于我们三向着色器不具备属性。...给它一个OnGUI方法,在该方法它调用base.OnGUI,然后显示贴图比例尺属性。对贴图,混合和其他设置使用单独方法。 ? 声明该类为我们三向着色器自定义编辑器。 ? ?...7.3 三向光贴图 剩下要做就是声明我们三向着色器在其元通道需要法线和位置数据。完成,照明再次恢复,反照率将正确显示在场景视图中。 ? ?

2.2K30

表面着色器(Surface Shader)写法(一)

4.1UnpackNormal( )函数 UnpackNormal接受一个fixed4输入,并将其转换为所对应法线值(fixed3),并将其赋给输出Normal,就可以参与到光线运算完成接下来渲染工作了...关于surf两句新加代码在这里也讲一下。 上面已经提到过,Normalize函数,用于获取到viewDir坐标转成一个单位向量且方向不变,外面再与点法线做点积。...//凹凸纹理获取法线值 o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); //_RimColor...关于surf两句新加代码在这里也讲一下。 上面已经提到过,Normalize函数,用于获取到viewDir坐标转成一个单位向量且方向不变,外面再与点法线做点积。...//凹凸纹理获取法线值 o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); //_RimColor

1.8K10

Github霸榜:从零开始学3D着色器编程

Shader,是运行在GPU上程序,中文称为着色器。它主要用途是对三维物体进行着色处理,对光与影进行计算,以及控制纹理颜色呈现等,最终,将游戏引擎几何数据转化为屏幕上模型、场景以及特效。...模型空间 相对于原点 (0,0,0) 而自定义起始坐标点。 ? 世界空间 世界空间就是当所有物体一起绘制、仍然相对于原点、更大一个坐标系。可以防止模型出现扎堆儿情况。 ?...U和V范围0到1。每个顶点都获得一个UV坐标,并在顶点着色器输出。 ? ? 完成lighting涉及到计算和组合环境光、漫反射光、镜面光和发射光方面。示例代码使用Phong lighting。...描边 描边着色器需要一个输入纹理,用于检测边缘颜色。此输入纹理候选者包括材质漫反射颜色、漫反射贴图颜色、顶点法线,甚至法线贴图颜色。 ?...Panda3D提供了一个很好数据结构,可以保存所有fog参数,你也可以手动将其传递给着色器。 Bloom有时候也叫Glow效果,中文一般叫做“全屏泛光”,可以使得发光物体看起来逼真。 ?

2K50

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

1.3 法线插值 尽管法线向量在顶点程序为单位长,但跨三角形线性插值会影响其长度。我们可以通过渲染一个和向量长度之间差(放大十倍以使其明显)来可视化该错误。 ? ?...(放大了插值误差) 可以通过标准化LitPassFragment法线向量来平滑插值,减少失真。仅查看法线矢量时,这种差异并不十分明显,但用于照明时会明显。 ? ?...(插值法线向量) 1.4 表面属性 在着色器照明是模拟光击中一个表面之后相互作用,这意味着我们需要追踪表面的属性。现在我们有一个法向量和一个基色。...5.1 自定义 ShaderGUI 在Lit着色器主块添加一个CustomEditor“ CustomShaderGUI”语句。 ?...由于此代码对于所有预设都是相同,因此请将其放在PresetButton方法,该方法返回是否应应用预设。 ? 默认不透明模式开始为每个预设创建一个单独方法。设置适当激活属性。 ?

5.5K40

Unity通用渲染管线(URP)系列(八)——复杂贴图(Masks, Details, and Normals)

添加对MODS遮罩贴图支持。 介绍次要细节贴图。 执行切线空间法线贴图。 这是有关创建自定义可编程渲染管道系列教程第八部分。通过增加对遮罩,细节和法线贴图支持,可以创建复杂表面。...导入将其“纹理类型”设置为“法线贴图”。 ? (法线贴图) 该贴图遵循标准切线空间法线贴图约定,即将上轴(在这种情况下称为Z)存储在B通道,而右XY轴和前XY轴则存储在RG。...但是,当使用高压缩质量时,Unity喜欢BC7压缩。此模式工作原理相同,但每个通道位数可能会有所不同。因此,不需要移动X通道。...(细节化法线) 5 可选贴图 并非每种材质都需要用到我们当前支持所有贴图。未分配贴图意味着结果不会修改,但是着色器仍使用默认纹理来完成所有工作。...5.1 法线贴图 我们法线贴图开始,这是最昂贵功能。添加一个着色器属性切换开关,链接到适当关键字。 ? ? ?

4.1K40

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

1.2 遮挡UI 因为我们有一个自定义着色器GUI,所以必须将新属性手动添加到着色器UI。因此,向MyLightingShaderGUI.DoMain添加DoOcclusion步骤。 ?...不必总是将反照率与细节相乘,而是基于蒙版在未修改和修改反照率之间进行插值。就像所有其他属性一样,将反照率检索放入其自身函数。 ? 2.3 法线细节 还需要对法线向量进行相同调整。...着色器变体数量现在已经增加了很多。但是,要激活材质关键字,必须通过检查器更改所有相关贴图。否则,着色器GUI将无法正确设置关键字。创建新材质时这不是问题,但是在更改需要刷新现有材质。...如果在删除贴图材质变得太亮,则表示仍包含该代码。或者,在代码添加一个临时#else块,这将使显而易见变化。 接下来,我们必须处理法线贴图。在这种情况下,我们有四种可能配置。...修改,更改贴图或凹凸比例法线将显示在所有材质。 ? (两个材质带有法线) 4.2 设置过多关键字 不幸是,我们刚刚创造了另一个问题。考虑选择两种材质。

2.3K30

Unity高级开发-Shader开发(3)-Shader编程

使用片段着色器主要目的是可以在比较低层级上进行复杂(或者针对目标设备更高效)开发。 2、shader结构: 着色器:本身就是一段代码,专业性非常强代码。就是指着色器有哪些输入。...这些子着色器由运行平台选择。它包含:1.属性定义、2.多个或者至少一个子着色器、3.还有一个处理结果即回滚。而回滚就是计算着色时,用来处理所有的子着色器不能运行情况。...) 3-Transparent :用于渲染透明物体(往前顺序渲染) 4-Overlay : 最后渲染,用来渲染叠加效果(如镜头光晕等) 2:RenderType tag : 渲染类型 主要告诉系统什么类型要怎么显示...较高着色器编译目标允许使用现代GPU功能 具体参考文档Unity User Manual (5.6)/Graphics/Graphics Reference/Shader Reference/Writing...CGSamplerCUBE 和 Sampler RECT类型 顶点数据获取: appdata_base :包含顶点位置,法线和纹理坐标 appdata_tan:包含顶点位置,切线,法线和纹理坐标

1.8K20

基础渲染系列(六)——凹凸

上一部分增加了对复杂照明支持。这次,我们将创建复杂表面的错觉。 本教程是使用Unity 5.4.0f3制作。 ?...,这种近似导数方法称为有限差分法。这样,我们可以在任何点构造切向量, ? 。 1.4 切线到法线 我们着色器δ可以使用什么值?...这正是我们想要,但是需要将“Bumpiness”更改为更低值,例如0.05。 ? ? (从高度图中生成法线图) 应用导入设置,Unity将计算法线贴图。...因此,使用DXT5nm时,我们只能检索法线前两个分量。 ? 我们必须其他两个通道推断出第三个通道。因为法线是单位向量, ? ? 理论上讲,结果应等于原始Z分量。...现在我们可以将凹凸法线切线空间转换为世界空间。 ? 我们还可以摆脱显式YZ交换,将其与空间转换结合起来。 ? ? (转换法线) 构造副法线时,还有一个附加细节。

3.5K40

第5章-着色基础-5.3-实现着色模型

出于这个原因,法线需要在像素着色器重新归一化(缩放到长度 1)。但是,顶点着色器生成法线长度仍然很重要。如果顶点之间法线长度变化很大,例如,作为顶点混合副作用,这将扭曲插值。...这个例子是在一个简单WebGL2应用程序实现,该应用程序是Tarek Sherif[1623]“Phong-shaded Cube”WebGL2示例修改而来,但同样原则也适用于复杂框架...如果图形API提供这种类型着色器代码模块化作为核心功能,那将会很方便。遗憾是,与CPU代码不同,GPU着色器不允许代码片段编译链接。每个着色器阶段程序被编译为一个单元。...这些策略包括以下内容: 代码重用——在共享文件实现函数,使用#include预处理器指令需要它们任何着色器访问这些函数。...Destiny着色器系统[1750]是此类问题代表性解决方案。它使用专有的预处理器层,该层采用以自定义着色语言方言编写着色器。这允许编写与平台无关材质,并自动翻译成不同着色语言和实现。

3.7K10

Unity 水、流体、波纹基础系列(一)——纹理变形(Texture Distortion )

这样可以轻松地任何角度查看它。 ? ? (Distortion Flow材质在四边形上) 1.2 让UV流动 流体UV坐标的代码是通用,因此我们将其放在单独Flow.cginc包含文件。...(带有流体 贴图材质) 为流体贴图添加一个变量,并对其进行采样以获得流向量。然后通过将其用作于albedo进行临时可视化。 ? ? (平铺流体向量) 纹理是线性数据,因此在场景显得亮。...如果我们也黑色开始并且在开始时在纹理淡入淡出,那么当整个表面为黑色时再马上重置。尽管这很明显,但至少没有突然视觉不连续。...(使用高度平方) 4.4 高度缩放 使用导数而不是法向量另一个好处是可以轻松缩放它们。导数法线将与调整曲面匹配。这使得可以正确地缩放波浪高度。...它们不需要加1,设置取决于您希望最终法线强度和所需多样性。 ? ? (常数加调制强度) 4.5 流量速度+ 与其在着色器中计算流速,不如将其存储在流程图中。

3.9K21

【Shader】Shader官方示例

我们将为添加属性 块着色器,因此我们在材质获得了一个纹理选择器。其他更改在下面以粗体显示。...: 每个顶点计算自定义数据 使用顶点修改器函数,还可以在顶点着色器中计算自定义数据,然后将其按像素传递给Surface Shader函数。...o.Albedo *= IN.customColor; } ENDCG } Fallback "Diffuse" } 在此示例customColor设置为法线绝对值...: 实际用途可能是计算内置输入变量不提供任何每顶点数据; 或优化着色器计算。...雾需要影响最终计算像素着色器颜色,这正是finalcolor修改器所做。 这是一个根据距离屏幕中心距离应用雾色调着色器。这将顶点修改器与自定义顶点数据(fog)和最终颜色修改器组合在一起。

89840

【笔记】《计算机图形学》(17)——使用图形硬件

显示缓冲与屏幕像素是一一对应, 设置目的是防止由于屏幕刷新间隔内画面还没有渲染好引起画面撕裂情况, Cycle of Refresh 刷新循环 将显示缓冲数据刷新到屏幕上就需要两个相同缓冲区...着色器一瞥 现代图形API都采用可自定义两个着色器来控制渲染管线顶点处理和片元处理两个过程, 着色器是一个用类C语言编写小程序, 也有自己变量和出入口....将着色器载入到GPU显存 glCompileShader 在GPU上编译着色器 着色器编译完成, 和其它程序一样, 我们需要将其和其它着色器链接在一起才能生效...., 我们可以得到漂亮Phong光影效果, 由于着色器程序很多比较复杂且难以调试, 一种好习惯是尽可能多地用辅助着色器可视化一些中间数据例如模型表面的法线方向, 下面的着色器就是很常用法线着色器,...main(void) { // 核心就是这里将法线(-1,1)转换到(0,1)然后用RGB进行显示 // 尽管这是个很简单着色器但是由于法线信息在渲染中非常重要因此专门完整写出此着色器

1.5K30

Shader经验分享

o.worldNormal = mul(v.normal, (float3x3)_World2Object);顶点法向量模型空间转换到世界空间精确算法,公式是用_Object2World该矩阵逆转置矩阵去转换法线...转置矩阵 UNITY_MATRIX_IT_MV UNITY_MATRIX_MV逆转置矩阵,用于将法线模型空间转换到观察空间 _Object2World将顶点方向矢量模型空间变换到世界空间...Deferred:延时渲染,该Pass会渲染G-buffer ShadowCaster:把物体深度信息渲染到阴影映射纹理或深度纹理 PrepassBase:遗留延迟渲染,该pass会渲染法线和高光反射指数部分...(o);//用于在顶点着色器中计算上一步声明阴影纹理坐标 并传向ps阶段。...Unity会将光照衰减和阴影相乘存在第一个参数,并自动声明atten变量。

2K40

基础渲染系列(四)——光照(Unity)

我们可以得到它们并将它们直接传递给片段着色器。 ? 为了测试,我们可以在着色器可视化法线。 ? ? (把法线向量当做颜色值) 这些是直接接来自网格原始法线。...将此矩阵与顶点着色器法线相乘,以将其转换为世界空间。并且由于法线是一个向量表示方向,所以需要忽略位置。也就是说,第四齐次坐标必须为零。 ? 或者,我们可以只乘以矩阵3×3部分。...编译代码具有相同结果,因为编译器将消除所有与常数零相乘内容。 ? ? (物体空间转换为世界空间) 现在,法线已经世界空间中了,但是某些法线看起来比其他法线亮。...那是因为它们也得到了同比缩放。因此,我们必须在转换对再其进行归一化。 ? ? (归一化法线) 虽然我们再次对向量进行了归一化,但是对于没有统一比例尺对象,它们看起来很奇怪。...因此,我们必须在片段着色器再次归一化法线。 ? ? (重新归一化法线) 尽管这会产生更好结果,但其实不做的话,误差通常也很小。如果你更重视性能,则可以不对片段着色器进行重新归一化。

2.5K20

Unity Shader常用函数,标签,指令,宏总结(持续更新)

==》世界空间,多用于顶点着色器 UnityObjectToWorldNormal(v.normal); 法线:模型空间 ==》世界空间,多用于顶点着色器,float3(归一化fixed3) UnityWorldSpaceLightDir...(o); 用于在顶点着色器中计算阴影纹理坐标,并输出到结构体,o为输出结构体; 因为这个宏中使用了v.vertex和a.pos,故须保证:1.顶点着色器输入结构体名为v;2.输入结构体顶点变量名为...vertex;3.输出结构体顶点变量名为pos SHADOW_ATTENUATION(i); 用于在片元着色器通过阴影纹理采样坐标计算阴影值,i为输入结构体 #include "AutoLight.cginc...; 因为这个宏中使用了v.vertex和v.normal,故须保证:1.顶点着色器输入结构体名为v;2.输入结构体顶点变量名为vertex;3.输出结构体包含法线信息且名为normal V2F_SHADOW_CASTER...; 用于在片元着色器输入结构体定义阴影投射所需变量,主要包含是深度图和阴影映射纹理等声明 SHADOW_CASTER_FRAGMENT(i) 片元着色器对阴影投射结果进行计算,并输出到深度图和阴影映射纹理

1.8K10

UnityShader 表面着色器简单例程集合

这些文章闲置在我个人博客,一年将过,师弟也到了学shader时候,这些例程虽然很简单,刚接触shader时却可以练练手,所以个人博客搬了出来。...它使得shader书写门槛降低,使shader技术容易使用。表面着色器一些特性如下: SurfaceShader可以看成是一个光照VS/FS生成器,它减少了开发者重复编写代码工作。...2.表面着色器自定义光照函数BasicDiffuse 前面我们介绍了表面着色器特性以及它三要素,也就是 编译指令 自定义输入结构 输出结构 编译指令: #pragma surface surfaceFunction...我们通过声明INTERNAL_DATA来访问修改法线信息,然后使用WorldReflectionVector (IN, o.Normal)去查找Cubemap对应反射信息。...注意两张法线贴图导入Unity,需要将它们类型Texture转为Normal map。这背后发生了什么,我以后再说。

3.1K61

基础渲染系列(十六)——静态光照

本文重点: 1、渲染到光照贴图,并从中采样 2、让烘焙光和法线一起正常生效 3、使用光探针组 (温馨提示:本系列知识是循序渐进,推荐第一次阅读同学第一章看起) 这是关于渲染系列教程第16部分。...你资产名称将显示在“Lightmap Parameters”下拉列表。 ? ? (对透明四边形使用自定义参数) 将对象标记为透明还可以更改其对间接照明作用。...因此,将所需变量和函数“My Lighting”复制到“My Lightmapping”。为此,我们仅需要顶点位置和uv坐标。不使用法线和切线,但是需要顶点着色器光照贴图坐标。 ?...转换值为1减去平滑度值平方。平滑度到粗糙度平方映射最终会产生比线性转换更好结果。 ? ? (调整了反照率) 4 定向光照贴图 光照贴图器仅使用几何图形顶点数据,不考虑法线贴图。...然后,我们可以使用法线向量执行点积运算,以找到漫反射因子并将其应用于颜色。但是方向贴图实际上并不包含单位长度方向,它要复杂一些。

3.5K20

shader 4 杂 一些和函数名词、数据结构

mul: 矩阵乘法 UnpackNormal: U3D标准法线解压函数; 在UnityCG.cginc。...这个函数格式应该是这样:void surf (InputIN,inout SurfaceOutput o),Input是你自定义结构。...首先我们来理解“语义”,这个词真正含义,事实上,准确地说我们应该把它叫“绑定语义”(Binding Semantics),Binding这个词我们就能想像得到,POSITION这个语义,它就是用来把...让我们来回答開始时提出问题:哪里来,到哪里处。 1、哪里来。...dot, 点乘, 得到是标量。 相应分量相乘和值。 标量与向量相乘, 是将向量每一个分量乘以标量得到新向量。 (向量放缩了。) mul, 矩阵乘法; 矩阵乘以向量、 或者矩阵相乘。

36320
领券