56 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: VirtualTexture学习笔记
							 | 
						|||
| 
								 | 
							
								date: 2023-07-29 12:26:09
							 | 
						|||
| 
								 | 
							
								excerpt: 
							 | 
						|||
| 
								 | 
							
								tags: VirtualTexture
							 | 
						|||
| 
								 | 
							
								rating: ⭐
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# 前言
							 | 
						|||
| 
								 | 
							
								学习文章:
							 | 
						|||
| 
								 | 
							
								- https://zhuanlan.zhihu.com/p/138484024
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**Streaming VT** = 显存优化,但需要额外消耗一些性能。
							 | 
						|||
| 
								 | 
							
								**Runtime VT** = 性能优化,可以预先将材质缓存到一张巨大的虚拟RT上,一般用于地形。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# VirtualTexture
							 | 
						|||
| 
								 | 
							
								## 1. Software Virtual Texture
							 | 
						|||
| 
								 | 
							
								在MegaTexture的基础上,id Software进一步提出了Virtual Texture的概念,这个概念取自于Virtual Memory,与虚拟内存类似的是,一个很大的Texture将不会全部加载到内存中,而是根据实际需求,将需要的部分加载。与虚拟内存不同的是,它不会阻塞执行,可以使用更高的mipmap来暂时显示,它对基于block的压缩贴图有很好的支持。 基本思路是,会将纹理的mipmap chain分割为相同大小的tile或page,这里的纹理叫虚纹理,然后通过某种映射,映射到一张内存中存在的纹理,这里的纹理是物理纹理,在游戏视野发生变化的时候,一部分物理纹理会被替换出去,一部分物理纹理会被加载。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								这样的机制不仅仅减少了带宽消耗和内存(显存)消耗,也带来了其他好处,比如有利于合批,而不用因为使用不同的Texture而打断合批,这样可以根据需求来组织几何使得更利于Culling,当然合批的好处是states change 变少。LightMap也可以预计算到一张大的Virtual Texture上,用来合批。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**其关键在于地址映射**,比如四叉树映射:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# RuntimeVirtualTexture
							 | 
						|||
| 
								 | 
							
								其主要目的是Cache材质计算结果。可以参考李文磊的视频:
							 | 
						|||
| 
								 | 
							
								https://www.bilibili.com/video/BV1KK411L7Rg/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=d47c0bb42f9c72fd7d74562185cee290
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								使用步骤:
							 | 
						|||
| 
								 | 
							
								1. 创建RuntimeVirtualTexture、RuntimeVirtualTextureActor、Landscape资产。
							 | 
						|||
| 
								 | 
							
								2. 在RuntimeVirtualTextureActor指定RuntimeVirtualTexture与Landscape资产,并且复制Landscape的Bound。
							 | 
						|||
| 
								 | 
							
								3. 在Landscape的RenderToVirtualTexture中指定RuntimeVirtualTexture资产。
							 | 
						|||
| 
								 | 
							
								4. 修改Landscape的材质,分别添加VirtualTexture Input、Export节点。 顺便也可以修改VirtualTexturePassType(某些需求只需要将结果渲染到VT中,无需在MainPass中渲染)。
							 | 
						|||
| 
								 | 
							
								5. 此时Landscape的材质大概率显示不正确,这时需要添加VirtualTextureOutputLevel来计算UV(为了匹配非VT情况,可以加入RuntimeVirtualTextureReplace节点进行判断。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#  UDIMs Virtual Texture(多象限虚拟贴图)
							 | 
						|||
| 
								 | 
							
								https://docs.unrealengine.com/5.0/en-US/streaming-virtual-texturing-in-unreal-engine/
							 | 
						|||
| 
								 | 
							
								参看UDIM Support章节。大致的方法就是把多个贴图按照`BaseName.####.[Support Image Format]`进行命名,####代表了坐标。将这些贴图放到同一目录,之后只需要导入1001坐标的贴图即可自动全部导入。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								工作流可以参考:
							 | 
						|||
| 
								 | 
							
								- https://www.youtube.com/watch?v=SkUW4JSYrEo
							 | 
						|||
| 
								 | 
							
								- https://www.youtube.com/watch?v=HhT9oEB7xks
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# 其他
							 | 
						|||
| 
								 | 
							
								## 贴图优化
							 | 
						|||
| 
								 | 
							
								具体参看:Managing the Texture Streaming Pool:https://www.youtube.com/watch?v=uk3W8Zhahdg
							 | 
						|||
| 
								 | 
							
								大致步骤:
							 | 
						|||
| 
								 | 
							
								- 使用Tools - Audit - Statistics查看贴图占用显存以及场景中的使用数量。
							 | 
						|||
| 
								 | 
							
								- 通过ViewMode - OptimizationViewModes - RequiredTextureResolution 查看贴图在场景中所需要的占用比例是否合适。
							 | 
						|||
| 
								 | 
							
								- 使用批量编辑功能修改Texture资产的MaximumTextureSize到指定Mipmap层级的分辨率即可。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								另一个种方式就是使用SVT。
							 |