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

在Unity中重新计算平面着色器的法线

是通过使用法线贴图来实现的。法线贴图是一种纹理图像,用于模拟平面表面的细微凹凸效果,从而增强渲染效果。

平面着色器的法线贴图可以通过以下步骤重新计算:

  1. 创建一个法线贴图:使用图像编辑软件(如Photoshop)创建一个法线贴图。法线贴图通常使用RGB通道来表示法线方向。每个像素的RGB值可以映射到法线的X、Y、Z分量。
  2. 将法线贴图应用到材质:在Unity中,将法线贴图应用到平面的材质上。可以通过创建一个新的材质或编辑现有材质来实现。
  3. 调整法线贴图的参数:根据需要,可以调整法线贴图的参数来控制平面表面的凹凸程度。常见的参数包括强度、平滑度和反转。
  4. 计算重新计算的法线:在渲染过程中,Unity会根据法线贴图的信息重新计算平面的法线。这样可以在渲染时模拟出平面表面的凹凸效果,使其看起来更加真实。

平面着色器的重新计算法线可以用于增强平面的视觉效果,使其看起来更加真实和有质感。它在游戏开发、虚拟现实、建筑可视化等领域都有广泛的应用。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

(解码 DXT5nm 法线) 2.3 缩放凹凸 由于我们将法线烘焙为纹理,因此无法片段着色器缩放它们。或者还是可以呢? 可以计算Z之前缩放法线X和Y分量。...向着色器添加凹凸缩放属性,就像Unity标准着色器一样。 ? 将此比例纳入我们正常计算。 ? 要获得与使用高度图时相同强度凹凸,请将比例减小到0.25。 ? ? ?...该名称是Mikkelsen切线空间简写。 为了使着色器与mikktspace同步,它必须在顶点程序接收归一化法线和切向量。然后对这些向量进行插值,而不对每个片段进行重新归一化。...但这并不能消除对同步工作流程需求。 4.4 逐顶点或者逐像素法线 如果要与Unity标准着色器保持一致,则必须计算每个顶点法线。这样做好处是我们不必片段着色器计算叉积。...这还不错,我们可以使用所需任何内插器索引,最大为最大值。 让我们将副法线计算放在自己函数。然后,可以顶点着色器或片段着色器中使用它。 ?

3.5K40

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

理想情况下,可以使用自定义材质 一个单一pass下,对任何网格进行平面着色和线框渲染。要创建这种材质,需要一个新着色器。我们将使用“渲染”系列第20部分最终着色器作为基础。...1.2 几何着色 除了使用导数指令之外,还有另一种方法可以确定三角形法线。使用实际三角形顶点来计算法线向量。这需要使用每个三角形而不是每个单独顶点或片段来完成工作。这就是几何着色器领域。...Unity着色器语法是CG和HLSL代码混合体。通常看起来像CG,但现在,它类似于HLSL。 1.3 逐三角形修改顶点法线 要找到三角形法线向量,请先提取其三个顶点世界位置。 ?...如果仅需要平面着色,则屏幕空间派生工具是实现该效果最便宜方法。然后,你还可以从网格数据删除法线Unity可以自动执行此操作),并且还可以删除法线插值器数据。...相反,通过代码插入我们自己函数,可以通过另一个文件重新连接其功能。 要覆盖My Lighting功能,必须在包含文件之前定义新代码。

2.3K21

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

为此,我们需要表面法线向量。 1.1 使用Mesh 法线 复制我们第一个着色器,并将其用作我们第一个照明着色器。使用此着色器创建材质并将其分配给场景某些立方体和球体。...为了测试,我们可以着色器可视化法线。 ? ? (把法线向量当做颜色值) 这些是直接接来自网格原始法线。立方体面看起来是平坦,因为每个面都是具有四个顶点单独四边形。...Unity通过float4x4 unity_ObjectToWorld变量着色器中使用此矩阵,该变量UnityShaderVariables定义。...因此,我们必须在片段着色器再次归一化法线。 ? ? (重新归一化法线) 尽管这会产生更好结果,但其实不做的话,误差通常也很小。如果你更重视性能,则可以不对片段着色器进行重新归一化。...Unity着色器不对观测方向插值吗? 会差值。Unity着色器顶点程序中计算视觉方向并对其进行插值。归一化是片段程序完成,或者功能不强硬件顶点程序完成。两种方法都可以。

2.5K20

Unity Mesh基础系列(一)生成网格(程序生成)

材质球使用Unity标准着色器,它会开放一组设置参数来让你调整不同视觉效果。 向mesh添加大量细节一个快速方法是提供一个albedo maps。...由于三角形总是一个平面,所以不需要提供单独法线信息。但是,我们可以通过提供法线来达到一些“作弊”行为。现实,顶点是没有法线,但三角形有。...Mesh.RecalculateNormals 计算每个顶点法线是通过计算哪些三角形与该顶点相连,先确定这些平面三角形法线,对它们进行平均,最后对结果进行归一化处理。 ? ?...Unity着色器执行此计算方式要求我们使用−1。 因为我们是一个平面,所以所有的切线都指向相同方向,也就是右边。 ? ?...其实你还可以添加顶点颜色,虽然Unity标准着色器不使用它们。但你可以自己创建着色器里使用这些颜色,但这是另一个教程了。 如果你对这个章节熟练程度满意了,就可以转到 圆角立方体 教程了。

9K40

旋转矩阵(Rotation Matrix)推导及其应用

向量平移,比较简单。 缩放也较为简单 ? 矩阵如何进行计算呢?之前文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。谷歌图片搜索旋转矩阵时,看到这张动图,觉得表述很清晰了。 ?...三维旋转,需要先搞清楚正、负方向(使用是右手法则,二维平面增加一维z,它正方向朝向屏幕外)。 绕x轴进行旋转(yz平面顺时针旋转) ? ? 绕y轴进行旋转(zx平面顺时针旋转) ? ?...绕z轴进行旋转(xy平面顺时针旋转) ? ?...Unity2017使用 UnityObjectToClipPos 进行了替换,MVP也即是 模型(M)、视图(V)、透视(P)三个单词首字母简写。...上面这些是基础,只有掌握这些之后,再配置切线、法线、光照模型,写顶点着色器(Vertex Shader)时候才不至于懞圈

5.3K41

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

而对于有一个月以上shaderLab编程经验同学来说,这篇文章可以不用看了:-) 1.表面着色器概述 表面着色器只存在于Unity,算是Unity微创新自创一套着色器标准。...fmod函数是对浮点数求余计算,它返回x/y余数。实例返回范围是0-8间小数。...②Unity表明着色器对立方贴图存取 我们知道一个2D纹理可以通过一个2D纹理坐标集来纹理查询颜色值,之前文章我们也对2D纹理进行纹理存取: float4 col = tex2D(_MainTex...然而在Unity表面着色器,我们使用简单这一句就完成了纹理存取一系列事情。...法线贴图理论详解以及shader使用 00:09 2015/08/12 于工学一号馆312 在这小节里,我们将介绍如何使用法线贴图来一个平面上做出凹凸效果。

3.1K61

基础渲染系列(十五)——延迟光照

(我们自己延迟光照玩法) 1 灯光着色器 我们“第13章,延迟着色”添加了对延迟渲染路径支持。我们要做只是填充G缓冲区,让灯光稍后渲染。而本教程简要说明了Unity如何添加这些灯光。...实际上,它们就是图像效果(Image Effect),例如上一教程延迟雾着色器。我们从一个简单着色器开始,先用黑色覆盖所有内容。 ? 指示Unity渲染延迟光源时使用此着色器。 ?...可以使用在UnityCG定义ComputeScreenPos,该函数产生齐次坐标,就像剪辑空间坐标一样,因此需要使用float4来存储它们。 ? 片段程序,我们可以计算最终2D坐标。...我们“渲染13,延迟着色器”教程填充了相同缓冲区。现在我们开始向他们读取。需要反照率,镜面反射色,平滑度和法线。 ?...发生这种情况是因为聚光灯世界位置计算不正确。当我们在场景某个地方渲染金字塔时,没有一个方便全屏四边形,其光线存储正常通道。相反,MyVertexProgram必须从顶点位置获取射线。

3.3K10

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

该贴图称为遮罩贴图,其各个通道遮盖了不同着色器属性。我们使用与UnityHDRP相同格式,后者是MODS映射。此代表金属,遮挡,细节和平滑度,以该顺序存储RGBA通道。...各个功能可以需要时检索遮罩。GetMetallic执行此操作,通过乘法使用遮罩贴图R通道计算其结果。 ? ? (只有金色电路是金属) 金属贴图通常是二进制。...4.1 采样法线 要对法线进行采样,我们必须向着色器添加一个法线贴图纹理属性,默认情况下,bump 会代表一个平面贴图。还要添加一个普通比例属性,以便我们可以控制贴图强度。 ? ?...XY存储RG或AG,具体取决于纹理格式。这将改变纹理外观,但是Unity编辑器仅显示原始贴图预览和缩略图。 法线贴图是否更改取决于目标平台。...我们可以通过GetMask简单地返回1来避免对掩码进行采样。这假定遮罩切换为常数,因此不会在着色器引起分支。 ? 我们着色器为其添加一个切换开关。 ?

4.1K40

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

出于这个原因,法线需要在像素着色器重新归一化(缩放到长度 1)。但是,顶点着色器生成法线长度仍然很重要。如果顶点之间法线长度变化很大,例如,作为顶点混合副作用,这将扭曲插值。...原则上,平面着色可以几何着色器执行,但最近实现通常使用顶点着色器。这是通过将每个图元属性与其第一个顶点相关联并禁用顶点值插值来完成。...这个像素着色器使用了几个内置GLSL函数。reflect()函数由第二个向量定义平面反射一个向量,在这种情况下是光向量,在这种情况下是表面法线。...可能变体数量可能要大得多,例如,Unity渲染系统有接近1000亿种可能变体着色器。仅编译实际使用变体,但必须重新设计着色器编译系统以处理大量可能变体[1439]。...虚幻引擎[1802]具有不同“材质域”,包括用于计算着色模型参数表面域和用于计算为给定光源调制 标量值光函数域。Unity[1437]也存在类似的“表面着色器”结构。

3.7K10

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

(idx) 声明阴影纹理采样坐标,用于顶点着色器输出结构体,idx为下一个可用插值寄存器(TEXCOORD)索引值 TRANSFER_SHADOW(o); 用于顶点着色器计算阴影纹理坐标,并输出到结构体...(i); 用于片元着色器通过阴影纹理采样坐标计算阴影值,i为输入结构体 #include "AutoLight.cginc" 包含计算阴影所用宏,例如上述三种 阴影投射: TRANSFER_SHADOW_CASTER_NORMALOFFSET...(o) 用于顶点着色器计算阴影裁剪空间中位置,并把结果输出到结构体,o为输出结构体; 因为这个宏中使用了v.vertex和v.normal,故须保证:1.顶点着色器输入结构体名为v;2.输入结构体顶点变量名为...vertex;3.输出结构体包含法线信息且名为normal V2F_SHADOW_CASTER; 用于片元着色器输入结构体定义阴影投射所需变量,主要包含是深度图和阴影映射纹理等声明 SHADOW_CASTER_FRAGMENT...(i) 片元着色器对阴影投射结果进行计算,并输出到深度图和阴影映射纹理,i为输入结构体

1.8K10

Shader经验分享

---------- 光照: 1.逐顶点光照:顶点着色器阶段计算光照,效率高但是效果不好,边缘像素映射时候插值可能会产生锯齿。...2.逐像素光照:片元着色器阶段计算光照,计算量大,但是边缘表现效果好。 3.半兰伯特模型:处理无光照地方,也让其有光,不然可能是全黑。经验模型。...(o);//用于顶点着色器计算上一步声明阴影纹理坐标 并传向ps阶段。...Unity会将光照衰减和阴影相乘后存在第一个参数,并自动声明atten变量。...(0)//unity对顶点进行自动处理 SHADOW_CASTER_FRAGMENT(i)//unity自动完成阴影投射部分,把结果输出到深度图和阴影映射纹理 --ds2阴影采用是屏幕后处理方式去计算阴影

2K40

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

本教程使用Unity 2017.4.1f1制作 ? (不需要顶点UV坐标或切向量) 1 没有UV坐标的纹理 执行纹理映射通常方法是使用网格每个顶点存储UV坐标。但这不是唯一方法。...为了使它尽可能通用,我们包含文件不应关心如何获取这些属性,而是需要一种提供表面特性通用方法。可以使用类似于Unity表面着色器方法,依靠函数来设置所有表面属性。...1.4 没有切线空间 请注意,与Unity表面着色器方法不同,我们在世界空间而不是切线空间中使用法线向量。如果要在SURFACE_FUNCTION中使用切线空间法线贴图,则必须自己明确地执行此操作。...因此,不需要检查法线Y分量是否为正,可以省略。 这将生成一个着色器,对Y投影常规贴图或顶部贴图进行采样。我们案例,我们大理石上获得了一个电路层。可以是草,沙或雪。 ?...通常不需要这些向量,因此我们可以不需要时跳过对它们计算,而只需使用伪常量即可。

2.2K30

Unity通用渲染管线(URP)系列(十)——点光和聚光灯阴影(Perspective Shadows)

我们可以通过全局着色器属性(我们将其命名为_ShadowPancaking)告诉着色器是否激活了pancaking。阴影追踪其标识符。 ?...(纹素随着灯光距离增加) 纹素随着距灯光平面的距离呈线性增加,灯光平面是将世界散布前面或后面的平面。...因此,我们可以计算纹理像素大小,从而计算出距离1处法线偏差,并将其发送到着色器,在此处将其缩放到适当大小。...我们通过GetOtherShadow获取表面到光矢量和点方向点积来找到与平面的距离。用它来缩放法向偏差。 ? ?...平面法线必须指向与面相反方向,就像聚光灯方向指向灯光一样。 ? ? ?

3.3K40

Unity可编程渲染管线系列(三)光照(单通道 正向渲染)

现在,我们可以使用新着色器创建一个受光不透明材质,尽管它仍然与不受光变体完全一样。 ? (不受光着色器资产) 1.2 法线向量 为了计算定向光贡献,我们需要知道表面法线。...因此,我们必须向顶点输入和输出结构都添加法线向量。有关如何计算照明详细说明,请参见渲染4,第一个照明。 ? LitPassVertex中将法线从对象空间转换为世界空间。...(显示原始世界空间法线向量) 1.3 漫反射光 漫射光贡献取决于光入射到表面的角度,该角度是通过计算表面法线点积与光出射方向得出,从而消除了负结果。定向光情况下,光矢量是恒定。...然后,着色器,可以使用点积,乘法,加法,饱和度以及最后平方来计算点淡入淡出因子。然后使用结果调制漫射光。 ? ?...以及MyPipelinemaxVisibleLights。 ? 重新编译后,Unity将警告我们我们已经超出了先前数组大小。不幸是,不可能仅在着色器更改固定数组大小。

2.2K20

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

目录 · 1 光照 · 1.1 受光着色器 · 1.2 法线向量 · 1.3 法线插值 · 1.4 表面属性 · 1.5 计算光照...但是,使用GPU实例化时,它作用更大,因为必须将一组UNITY_MATRIX_I_M矩阵发送到GPU。不需要时避免多余计算是值得。...(不正确和正确法线转换) 为了验证是否LitPassFragment获得正确法线向量,我们可以将其用作颜色看看。 ? ? (世界空间法线向量) 负值无法显示,因此将其限制为零。...可以,但是表面不在乎法线定义空间。它可以在任何适当3D空间中执行光照计算。因此,我们保留了定义空间不填。填充数据时,我们仅需各处使用相同空间即可。...2.2 光照函数 Lighting 添加GetIncomingLight函数,以计算给定表面和光入射数量。对于任意方向光,我们都需要用表面的法线和方向进行点乘(可以使用dot函数)。

5.5K40

基础渲染系列(十三)——延迟着色

要渲染物体,着色器必须获取网格数据,将其转换为正确空间,对其进行插值,检索和导出表面属性,并计算照明度。前向着色器必须对受光对象每个像素光重复所有这些操作。...(白色法线Unity检测到我们着色器具有延迟pass,因此它包含在延迟阶段使用我们着色器不透明对象和剪切对象。当然,透明对象仍将在透明阶段渲染。...2.4 Buffer 2 第三个G缓冲区包含世界空间法线向量。它们存储ARGB2101010纹理RGB通道。这意味着每个坐标使用10位存储,而不是通常8位,这使它们更加精确。...调整CreateLight同时,我们也要摆脱light.ndotl计算Unity不赞成使用该结构字段和DotClamped函数。 ? 我们已经关闭了方向光,但是我们仍然需要包含自发光。...这是通过关键字添加一个基于UNITY_HDR_ON多编译指令来完成。 ? 现在,我们可以定义了此关键字后转换颜色数据。对数编码是使用公式2-C完成,其中C是原始颜色。

2.7K20

【Shader】Shader官方示例

我们将为添加属性 块着色器,因此我们材质获得了一个纹理选择器。其他更改在下面以粗体显示。...,则需要稍微复杂一些:INTERNAL_DATA需要添加到Input结构,以及WorldReflectionVector用于写入“正常”输出后计算每像素反射向量函数。...: 每个顶点计算自定义数据 使用顶点修改器函数,还可以顶点着色器计算自定义数据,然后将其按像素传递给Surface Shader函数。...: 更实际用途可能是计算内置输入变量不提供任何每顶点数据; 或优化着色器计算。...例如,可以GameObject顶点处计算Rim光照,而不是每像素Surface Shader中进行计算。 最终颜色修改器 可以使用“最终颜色修改器”功能来修改由着色器计算最终颜色。

88840

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

使用片段着色器主要目的是可以比较低层级上进行更复杂(或者针对目标设备更高效)开发。 2、shader结构: 着色器:本身就是一段代码,专业性非常强代码。就是指着色器有哪些输入。...这些子着色器由运行平台选择。它包含:1.属性定义、2.多个或者至少一个子着色器、3.还有一个处理后结果即回滚。而回滚就是计算着色时,用来处理所有的子着色器不能运行情况。...,name是给开发者给这个值起可以代码访问名字,display name则是材质面板上显示名字 颜色和向量 name(“display name”,Color) = (number,number...可以把所需要参与计算数据都放到这个Input结构,传入surf函数使用; UV mapping作用是将一个2D贴图上点按照一定规则映射到3D模型上,是3D渲染中最常见一种顶点处理手段。...纹理对应CGSamplerCUBE 和 Sampler RECT类型 顶点数据获取: appdata_base :包含顶点位置,法线和纹理坐标 appdata_tan:包含顶点位置,切线,法线和纹理坐标

1.8K20

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

因此,请复制该方法并进行所需更改。尽管DoMetallic没有贴图情况下会显示滑块,但我们需要在此做相反操作。另外,Unity标准着色器使用遮挡贴图G颜色通道,因此我们也将这样做。...当处于全强度时,结果恰好是贴图中结果。我们可以通过基于滑块1和贴图之间进行插值来实现。 ? 要将阴影应用于灯光,需要将遮挡因素纳入CreateLight内部计算。 ? ? ?...为了增加种类,它还减少甚至完全消除电路板下部区域。而且,无论板子上打出什么凹痕,细节都会被抹去。 ? (细节遮罩) Unity标准着色器使用细节蒙版Alpha通道,因此我们也使用该通道。...(细节遮罩) 3 更多关键字 我们一直使用着色器功能来启用着色器代码,该代码可以采样并在我们光照方程包含各种贴图。Unity标准着色器也可以做到这一点。这就是超级着色器想法。...或者,代码添加一个临时#else块,这将使显而易见变化。 接下来,我们必须处理法线贴图。在这种情况下,我们有四种可能配置。没有法线贴图,只有主贴图,只有细节贴图,或者都没有。

2.3K30

ABC动画插件Alembic从浅入深(Unity3D)

然后我们将.abc动画文件导入到UnityAssets任意文件夹,会发现文件导入之后就变成了Unity可识别的prefabs文件: StreamingAssets文件夹中会同步生成一个...abc导入Unity之后格式 接着我们看一下导入abc文件格式: Normals :是使用.abc文件法线,这是根据顶点位置来设定计算。...默认“Compute If Missing”是.abc文件如果有法线就使用,没有的话就计算,大部分情况下这样应该没有问题。 Tangents:是计算切线设定。...因为abc文件没有切线,所以是计算还是不计算有两种选择。但是,切线计算需要法线和UV,如果欠缺这些,“Tangents”和“Compute”也不能进行计算。...Alembic/Standard着色器普通Standard着色器基础上添加基于上述velocitymotion vector生成着色器

2.3K10
领券