Unity Shader-法线贴图(Normal Map)与视差贴图(Parallax Map)

LearnOpenGL——法线贴图、视差贴图学习笔记 我们将观察方向变化到切线空间中,所以P向量的x和y分量会与表面切线和副切线对齐,由于切线和副切线向量与表面纹理坐标的方向相同,我们可以用P的x和y元素作为纹理坐标的偏移量。目前,如果我们让平面竖直面对我们,此时效果正常,因为法线贴图中的法线方向指向z正方向并且平面的法线也指向z轴正方向。将法线向量的x、y、z元素储存到纹理中,代替颜色的r、g、b元素,因为法线向量的范围在[-1,1],所以我们要先将其映射到[0,1],变换为RGB颜色元素。法线向量从z轴方向也有向其他方向的偏差,颜色也就发生了轻微的变化。 阅读详情

简介


法线贴图技术至今一直是游戏增强画面效果的利器之一。随着移动设备的性能越来越好,曾经的在PC平台的各种高级技术在移动平台也都开始大规模使用了,法线贴图甚至是视差贴图已经开始在移动平台的游戏上使用了。 之前的一篇文章简单探究了一下法线贴图的原理以及在Unity下的实现,本篇就不多介绍了。本篇文章主要研究一下怎样增强法线贴图的效果,法线贴图的进阶版-视差贴图(Parallax Map)。

可调法线强度的shader


我们常用的法线效果,一般是用于增强一些细节,有时候我们想要的法线,实际用起来就会发现法线效果不强,尤其是较远的物体,比如地形,墙壁之类的场景物体,虽然加上了法线,但是由于镜头离得比较远,法线效果表现不出来。而这个时候我们一种方式是去找美术调整法线贴图,但是一方面调整贴图会比较花费美术的时间,一方面万一这张图用了多次,有的地方想要比较明显的法线效果,有的地方想要不明显的法线效果,这就比较蛋疼了。如果我们用灰度图转法线图的时候(Create from GrayScale),有个Bumpiness的选项,可以控制这张图的法线强度。但是很多时候,我们的法线图是美术直接在工具里面做好的,就没法转化了。如果我们能给一个参数,直接在材质里面调整法线的强度就好了。之前纠结了好几个小时,后来突然查到了 这个帖子,豁然开朗。
首先,我们从法线贴图中获取到的是这个采样点对应的法线方向,光滑的部分法线方向都为垂直于表面竖直向上的方向,也就是(0,0,1)的方向,而有凹凸的地方,法线就会有偏移值,换句话说,我们让法线贴图采样出来的方向越偏离(0,0,1)方向,就会越加强法线的效果。我们可以减小法线贴图的b值,但b通道越小,法线效果越强,不过这样不直观,换一种方式就是加强法线贴图的r,g值,给r,g通道乘以一个factor,换句话说可以直接乘以一个(factor,factor,1)向量,就达到了增强与减弱法线效果的目的。
下面附上可以直接调整法线强度的shader代码:

//Bump Map
//by:puppet_master
//2017.2.27
Shader "ApcShader/NormalMapX"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_MainTex("Base 2D", 2D) = "white"{}
		_BumpMap("Bump Map", 2D) = "bump"{}
		_BumpFactor ("Bump Scale", Range(0, 10.0)) = 1.0
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			sampler2D _BumpMap;
			float _BumpFactor;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				//转化纹理坐标
				float2 uv : TEXCOORD0;
				//tangent空间的光线方向
				float3 lightDir : TEXCOORD1;
			};

			//定义顶点shader
			v2f vert(appdata_tan v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面有个;
				TANGENT_SPACE_ROTATION;
				//ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
				o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
				//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
				//直接解出切线空间法线
				float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));
				//构建一个float3向量,用于与法线相乘得到更改后的法线值
				float3 normalFactor = float3(_BumpFactor, _BumpFactor, 1);
				//将factor与法线相乘并normalize
				float3 normal = normalize(tangentNormal * normalFactor);
				//normalize一下切线空间的光照方向
				float3 tangentLight = normalize(i.lightDir);
				//兰伯特光照
				fixed3 lambert = saturate(dot(normal, tangentLight));
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
				//进行纹理采样
				fixed4 color = tex2D(_MainTex, i.uv);
				return fixed4(diffuse * color.rgb, 1.0);
			}

			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	

			ENDCG
		}

	}
	//前面的Shader失效的话,使用默认的Diffuse
	FallBack "Diffuse"
}

我们给一张diffuse图以及一张法线图,这样我们就可以灵活地直接在材质上调整法线的强弱了。先来一张法线强度为0的情况,等同于不加法线:

强度为1时,等同于直接使用法线:

加强法线强度,设置为2时,法线效果非常更加明显:

虽然我们可以调整法线的强度,但是也不是就可以无休止地调整,当强度调整为10时,效果就有点吓人了....


视差贴图


法线贴图是通过改变要表现凹凸部分的表面的明暗值来让人有一种凹凸的感觉,但是这毕竟只是一种最初级的模拟,如果凹凸不需要特别明显,直接用法线贴图还好:

当我们想再增强法线的强度的时候,极限的情况也只能把凹陷的地方置为全黑,但是法线的强度并没有特别明显的提升:

而且上面的增强法线的shader,当法线效果增强到一定程度之后,就不仅仅会影响有凹凸的部分,还会导致非凹凸部分也被改变颜色,最后变得面目全非。所以这种做法只能算是一个“歪门邪道”(有时候这种歪门邪道还是很有用的)。

下面我们就来看一下正统一点的增强版本的法线效果,也就是视差贴图(Parallax Map)。视差贴图是真正通过改变采样点纹理坐标达到让法线效果看起来更加真实并且可以增强法线效果的目的。简单画了一张示意图解释一下视差贴图的原理:

上面是一个用法线模拟的凹凸表面,红色为我们的视线方向,视线的方向(切线空间的viewDir)是从A指向B,指向相机方向。如果表面真的有凹凸的话,那么视线方向应该和B点相交,但是实际上表面是平的,真实的交点是A点。我们在纹理坐标的层面来看一下,以uv的u轴为例,视线方向xyz转化到切线空间后,正好对应纹理坐标系上的u,v,以及垂直表面的方向。所以,为了让采样点更准确,我们需要调整实际采样时使用的纹理坐标,也就是给一个偏移值,在进行采样MainTex和BumpTex的时候,都加上相应的偏移。那么问题又来了,我们怎么知道这个偏移是多少,怎么控制这个偏移呢?首先,我们的视线方向是一直在改变的,也就是说我们可能从各个方向看这个凸起来的部分,比如我们从右边看(如上图),那么就需要向右边偏移一些;如果从左边看,那么就需要向左偏移一些;如果垂直看表面,那就不需要偏移了。所以,我们正好可以让视线方向转化到切线空间,之后视线方向的x,y轴就是我们uv需要偏移的方向了,这也就是所谓的视差。第二个问题就是我们不知道这个面的高度是多少,最简单的一种方式就是直接给一张高度图,黑色表示不需要凸起,白色表示需要凸起,这样我们进行采样的时候先采这张高度图,就知道这个点对应的高度,也就变相地知道我们需要偏移多少了,凸起越高偏移越多,凸起越低偏移越少(视线方向一致的情况下)。有了这两点,剩下的就再增加一个系数,来控制我们偏移的强度。那么最终我们需要的采样偏移值就等于tanViewDir.xy / tanViewDir.z * height * parallaxScale。这里用tanViewDir.xy / tanViewDir.z,通过切平面垂直的z分量来调整xy方向(uv方向)偏移的大小,也就是说当我们视角越平,uv偏移越大;视角越垂直于表面,uv偏移值越小。

下面附上视差贴图的shader代码:
//ParallaxMap
//by:puppet_master
//2017.3.10
Shader "ApcShader/ParallaxMap"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_MainTex("Base 2D", 2D) = "white"{}
		_BumpMap("Bump Map", 2D) = "bump"{}
		_HeightMap("Height Map", 2D) = "black"{}
		_HeightFactor ("Height Scale", Range(0, 0.1)) = 0.05
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			sampler2D _BumpMap;
			float _HeightFactor;
			sampler2D _HeightMap;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				//转化纹理坐标
				float2 uv : TEXCOORD0;
				//tangent空间的光线方向
				float3 lightDir : TEXCOORD1;
				//需要视线方向
				float3 viewDir : TEXCOORD2;
			};

			//计算uv偏移值
			inline float2 CaculateParallaxUV(v2f i)
			{
				//采样heightmap
				float height = tex2D(_HeightMap, i.uv).r;
				//normalize view Dir
				float3 viewDir = normalize(i.viewDir);
				//偏移值 = 切线空间的视线方向.xy(uv空间下的视线方向)* height * 控制系数
				float2 offset = viewDir.xy / viewDir.z * height * _HeightFactor;
				return offset;
			}

			//定义顶点shader
			v2f vert(appdata_tan v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面有个;
				TANGENT_SPACE_ROTATION;
				//ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
				o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
				//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				//计算观察方向
				o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex));
				return o;
			}

			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
				float2 uvOffset = CaculateParallaxUV(i);
				i.uv += uvOffset;
				//直接解出切线空间法线
				float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));
				//normalize一下切线空间的光照方向
				float3 tangentLight = normalize(i.lightDir);
				//兰伯特光照
				fixed3 lambert = saturate(dot(tangentNormal, tangentLight));
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
				//进行纹理采样
				fixed4 color = tex2D(_MainTex, i.uv);
				return fixed4(diffuse * color.rgb, 1.0);
			}

			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	

			ENDCG
		}

	}
		//前面的Shader失效的话,使用默认的Diffuse
		FallBack "Diffuse"
}

对于视差贴图,除了法线图之外,我们增加了一个HeightMap的贴图,其实只有一个通道,也可以直接放在NormapMap的A通道中,贴图中黑色表示平坦,白色表示凸起。如下图所示:

视差贴图效果如下:

在近距离的时候,法线图是经不起细看的,但是视差贴图效果却仍然很好,而且能看到凸起的细节:

俗话说得好,没有对比就没有伤害,我们对比一下没有法线,普通法线以及视差贴图的效果:


不过视差贴图也不是可以无限扩大凹凸程度的,因为毕竟视差贴图也只是近似的模拟,将采样点向真正的采样点靠近。还有一些更加高级的视差贴图,比如POM,以及带自阴影的视差贴图。不过这些贴图技术基本不可能在现在的移动设备上跑,因为需要逐像素计算一些迭代的计算,暂时没有再往深研究,最后附上一些关于视差贴图的参考链接(推荐第一个的那篇翻译文章,非常详细的讲解了各种视差贴图):


原文地址:http://blog.youkuaiyun.com/puppet_master/article/details/57125379

菜鸡shader:L11 UV动画之平移、旋转、缩放及混合应用 Tags {//算出要增加的角度 float theta = _RotateRange * sin(frac(_Time . z * _RotateSpeed) * TWO_PI);//转化为弧度 float radY = radians(theta);//算出该弧度的sin和cos值 sincos(radY , sinY , cosY); 阅读详情

相关推荐

Unity3D内置Shader私房课(一)视差Parallax

在Unity内建Shader的DefaultResourcesExtra的目录中,可以看到Normal-Parallax.shader这个文件。可以使用这个shader配合法线贴图创建视差效果来更好的表现对象表面的凹凸。

凯奥斯的注释 6807

【unity shader】unity实现learn-opengl的视差贴图Parallax Mapping

unity shader复刻learn-opengl的视差贴图

又渲染又建模的一般通过工科绘画人的BLOG 1285

Unity法线贴图全解析:从核心原理到实战优化

在计算机图形学中,光照模型是渲染真实感画面的基础,其核心在于计算光线与物体表面法线的交互。法线贴图技术通过存储和替换每个像素的法线向量,在不增加模型几何复杂度的前提下,高效模拟出丰富的表面细节,如凹凸、划痕和纹理。这项技术极大地提升了实时渲染的视觉质量与性能平衡,是游戏开发、影视特效等领域的核心技术。其原理涉及将三维法线向量编码到RGB颜色通道,并在切线空间中进行坐标变换,以支持模型动画与复用。理解法线贴图的制作、导入设置,以及处理常见的OpenGL与DirectX格式差异,是将其成功应用于Unity等引擎

weixin_30323631的博客 637

视差贴图

1. 视差贴图 Parallax Mapping 1.1 视差贴图 理论介绍 1.1.1 位移贴图 — Displacement Mapping 1.1.2 法线贴图 – Normal Mapping 1.1.3 视差贴图 — Parallax Mapping 1.2 视差贴图 代码实现 1.3 示例代码 1.4 存在的问题 2. 浮雕贴图 Relief Mapping 2.1 浮...

u014767384的博客 3182

Unity Height Map视差偏移映射:从原理到Shader Graph实现

在实时渲染中,法线贴图是增强表面细节的基础技术,它通过改变像素法线方向模拟光照凹凸感。然而,法线贴图无法产生视差效果,即观察角度变化时表面细节不发生位移。视差偏移映射技术则通过高度图提供的深度信息,动态扭曲纹理采样坐标,在视觉上模拟表面凹凸带来的视差效应。这项技术的核心价值在于以极低的性能开销,为静态或中远景物体增加几何深度感,相比真正增加几何的曲面细分或复杂的光线步进追踪,它更适合移动端、VR及需要大量实例化的场景。在Unity Standard Shader中,Height Map参数正是这一技术的实现

weixin_30455023的博客 394

Unity材质渲染进阶:Occlusion Map环境光遮蔽贴图原理与实战应用

在实时渲染中,环境光遮蔽(Ambient Occlusion)是一种用于模拟物体表面因几何结构相互遮挡而产生的柔和阴影的技术,它能显著增强场景的体积感和真实感。其核心原理是通过计算表面点被周围几何体遮挡的环境光比例,来近似光线在缝隙、凹陷等复杂区域的衰减。这项技术的价值在于,它能以极低的性能开销,弥补实时全局光照(GI)在捕捉微观遮蔽细节上的不足,有效解决模型缝隙过亮、细节模糊和物体接触面生硬等常见渲染问题。在游戏开发、建筑可视化等应用场景中,通过烘焙生成Occlusion Map(遮挡贴图)并集成到标准着

weixin_33834137的博客 369

Unity高级纹理技术:法线贴图、遮罩纹理与视差映射实战解析

在计算机图形学中,纹理映射是增强3D模型表面细节的核心技术。其原理是通过将2D图像映射到3D模型表面,为模型提供颜色、光泽、凹凸等视觉属性。从基础的颜色纹理到高级纹理,这一技术演进极大地提升了渲染的真实感和效率。高级纹理技术通过存储法线、高度、材质遮罩等非颜色信息,实现了以较低性能开销模拟复杂表面细节的目标,具有极高的技术价值。在游戏开发、影视特效和实时渲染等应用场景中,高级纹理是实现次世代PBR材质和影视级视觉效果的关键。本文将深入解析法线贴图、遮罩纹理和视差映射等核心高级纹理类型,通过Shader实战编

aodiyi6351的博客 286

Unity PBR材质核心贴图原理与实战指南:从Albedo到Emission

基于物理的渲染(PBR)是现代实时图形渲染的基石技术,它通过一套遵循物理光学规律的模型,确保物体在任何光照下都能呈现符合现实直觉的视觉效果。其核心原理基于微表面理论和能量守恒,通过一系列贴图数据(如Albedo、Metallic、Normal)来精确描述表面的微观几何与反射属性,从而在Shader中进行复杂的BRDF计算。这项技术的价值在于,它统一了美术制作与程序渲染的规范,极大地提升了视觉真实感与资源复用性,已成为游戏、影视、数字孪生等领域的行业标准。在应用上,PBR材质工作流(尤其是金属度/粗糙度工作流

weixin_30243533的博客 382

【shaderforge学习笔记】 Parallax节点(视差节点)

shaderforge Parallax节点 一、官方说明 Parallax节点输出的uv是输入的uv经过视差偏移的得到结果,其中视差偏移程由[Hei]指定,[Hei]在计算偏移量时有两个相关参数:深度[Dep]和基准高度[Ref]。 高度图0(白色)对应的部位会凸出来。 高度图1(黑色)对应的部位会凹进去。 二、节点输入 1.UV 物体的uv坐标信息,shade

赞美月亮的专栏 3386

Substance Designer与Unity Shader实现丝绸PBR材质全流程解析

在计算机图形学与实时渲染领域,基于物理的渲染(PBR)已成为表现真实材质的主流技术方案。其核心原理是通过一组描述表面光学属性的贴图(如反照率、粗糙度、法线),结合遵循物理规律的光照模型,来模拟光线与物体表面的交互。PBR的技术价值在于提供了标准化、可预测的材质制作流程,极大地提升了渲染的真实感与美术资产的生产效率。在游戏开发、影视动画等应用场景中,PBR流程常用于制作金属、石材、布料等各类复杂材质。其中,丝绸材质因其独特的光学特性——各向异性高光,成为PBR流程中的一个经典挑战。本文聚焦于使用Substan

weixin_34082854的博客 396

ShaderGraph视差映射节点深度解析:从原理到实战的视觉立体化方案

在实时渲染领域,法线贴图是模拟表面凹凸细节的基石技术,它通过扰动像素法线影响光照,以极低成本增强模型表面细节表现力。然而,其固有局限在于无法随视角变化产生真实的视差位移与遮挡关系,导致轮廓“平面化”。视差映射技术应运而生,其核心原理是依据高度图信息和视线方向,动态偏移纹理采样UV坐标,从而在屏幕空间模拟出几何体的凹凸遮挡效果,实现了从“光影模拟”到“几何感知”的跨越。这项技术的核心价值在于,它能在不增加模型顶点数的前提下,显著提升砖墙、路面、织物等表面的立体感与视觉沉浸感,是移动端及性能敏感项目中实现次表面

weixin_30372371的博客 452

Unity高级纹理技术全解析:从法线贴图到性能优化实战

在计算机图形学中,纹理映射是提升3D模型视觉真实感的核心技术。其原理是通过将2D图像映射到3D模型表面,为几何体赋予颜色、细节和材质属性。这项技术的价值在于,它能以极低的性能开销模拟复杂的表面细节,避免模型几何复杂度的爆炸式增长。在游戏开发、影视特效和实时渲染等应用场景中,纹理技术是平衡画质与性能的关键。本文聚焦Unity引擎中的高级纹理应用,深入探讨法线贴图如何通过存储切线空间向量模拟凹凸细节,以及视差映射如何利用高度图创造深度错觉。通过解析遮罩纹理的通道复用逻辑和立方体贴图的环境反射原理,并结合Shad

aizexi2652的博客 253

Unity星球渲染实战:从PBR材质到多层Shader实现月球与地球

在计算机图形学与游戏开发中,基于物理的渲染(PBR)是构建真实感材质的核心技术。其原理在于模拟光线与物体表面的物理交互,通过反照率、法线、粗糙度等贴图通道精确描述材质属性,从而在渲染管线中实现逼真的光影效果。这项技术的价值在于为数字内容创作提供了标准化的高质量渲染方案,广泛应用于游戏、影视、模拟仿真等领域。本文聚焦于一个典型应用场景——虚拟天体渲染,通过拆解月球与地球这两个极具代表性的案例,深入探讨如何运用PBR工作流与多层Shader架构,解决高反差表面细节还原、动态云层融合以及大气散射模拟等工程挑战,最

weixin_33690963的博客 540

【URP】Unity[陡峭视差贴图]原理剖析实践

《Unity URP陡峭视差贴图技术解析》介绍了进阶的Steep Parallax Mapping技术,通过分层采样高度图解决标准视差贴图在陡峭表面(如岩石、冰缝)的UV偏移失真问题。该技术采用5-15层动态采样,利用光线步进算法精确计算视线与高度图的交点,显著提升遮挡效果和陡峭表面适应性。文章详细讲解了Unity URP实现方案,包括切线空间转换、动态分层采样机制和Shader代码实现,并对比了标准与陡峭视差贴图在采样次数、表现效果和适用平台上的差异。建议在PC/主机平台结合法线贴图使用,控制高度缩放参数

设计 AI 玩游戏🎮 384

跨模型的 API 调用与集成:使用 Spring AI 构建可移植的 API 代码,支持多个 AI 模型(如 OpenAI、Anthropic 等)的调用

Spring AI 是 Spring 生态系统中的一部分,旨在提供一种简单、可扩展的方式来集成人工智能模型。Spring AI 使得开发者可以使用现有的 Spring 体系结构方便地访问多种 AI 模型和服务,例如 OpenAI、Anthropic、HuggingFace 等。

秋元的博客 2404

告别图像畸变:手把手教你用HALCON的`gen_image_to_world_plane_map`做高精度视觉测量

本文详细解析了HALCON的`gen_image_to_world_plane_map`算子在工业视觉测量中的应用,通过精确的几何变换消除透视畸变,提升测量精度。文章涵盖相机标定、世界坐标系建立、实战应用及性能优化,适用于液晶屏质检、金属板检测等场景,帮助工程师实现高精度视觉测量。

weixin_28718487的博客 422

Unity URP中视差遮挡贴图技术实现与优化

视差遮挡贴图(Parallax Occlusion Mapping)是计算机图形学中提升材质真实感的关键技术,通过动态计算像素遮挡关系突破传统法线贴图的几何表现局限。其核心原理采用射线步进采样高度图,结合视角相关的动态偏移计算,在片段着色器中实现多层次纹理采样和自阴影效果生成。这项技术在游戏开发、VR场景构建等需要高精度表面细节的领域具有重要价值,特别是在移动端URP渲染管线中,能以2-3FPS的性能代价换取显著的视觉提升。针对Unity URP管线的特殊实现需要注意GBuffer通道处理、动态LOD控制等

weixin_30535843的博客 326

全网最全 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

昨天(2024年7月23日)我们分享了学生及科研人员电脑配置推荐 | 笔记本+外置显卡配置,性能足够支持完成你博士论文文本内容,那么今天我们就分享一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置的教程,我们使用一文来解决大家在做生信时遇到安装系统、配置环境的问题。在此文中,我们尽快可能给出一套全网最全的教程。目标是解决新手小白同学查资源的困惑和难题。但是,每个童鞋遇到的问题不一样,此教程也不可能把你遇到的每个问题都归纳在其中。我们也希望,

BioinfoDu 2260

地面PBR纹理贴图全攻略:通道解析与Unity实战

PBR(基于物理的渲染)通过模拟真实光线与材质的交互,使同一套贴图在不同引擎中呈现一致效果。其核心包括反照率、法线、粗糙度、金属度和AO等多个通道,每个通道承载着特定的物理属性。在游戏场景和建筑可视化中,地面材质因暴露面积大、观察距离近,对细节要求极高,4K纹理能有效提升近距离观感。然而,仅有高分辨率贴图还不够,正确的导入设置、法线方向、粗糙度反转以及Tiling调节同样关键。以Unity为例,系统讲解地面PBR纹理的通道原理、不同地面类型的使用策略、4K贴图的性能优化与常见问题排查,帮助开发者快速搭建真实

weixin_34198881的博客 517

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

堆内存管理核心逻辑 超详细复习笔记

本文详细解析了堆内存管理的核心逻辑,包括初始化、分配和释放三个关键环节。系统通过全局堆管理结构体和链表机制实现动态内存管理:初始化时标记整块内存为空闲;分配时遍历链表查找合适空闲块并进行分割;释放时定位内存块头并重新标记为空闲,支持相邻块合并以减少碎片。文章对比了链表式管理和线性分配的优缺点,指出链表式更灵活但实现复杂,线性分配简单但无法释放。最后总结了常见错误(如指针回推错误、碎片问题)和扩展知识(不同内存管理算法)。这套机制是理解嵌入式系统和RTOS内存管理的基础。

2502_92009732的博客 1196
上一篇: Unity Shader-法线贴图(Normal)及其原理
下一篇: 置换贴图,法线贴图,凹凸贴图的区别
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值