MicroSplat插件文档翻译【一】: Texture Cluster

MicroSplat

原文档: https://docs.google.com/document/d/1Yrx8-2yE5BUDLlnRKE_4sVCkPV68KJZ-Ez4XLhvef0Y/edit

以下翻译为机器翻译有错误请指正

Texture Cluster Module

请添加图片描述

"纹理集群"是我 ( 插件作者 Jason Booth ) 在创建MegaSplat时发明的一种技术。其核心思想是使用多种纹理并进行混合,而不是仅仅使用一种纹理。这样做的目的是为了消除在使用单一纹理时可能出现的重复图案(平铺伪像)。在MegaSplat中,由于其内部的技术特性,这种纹理混合的操作已经被自然地实现了,因此,这个"纹理集群"的技术在MegaSplat中几乎不需要额外的操作。

MicroSplat使用的混合技术与MegaSplat的非常不同,它使用的是传统的Unity Terrain工具,这些工具限制在32个纹理。然而,我们开发了一种新的技术来在MicroSplat中进行纹理集群。

请添加图片描述

一旦安装完毕,“Texture Cluster”(纹理集群)你就可以在"Shader Generator"部分看到"Texture Cluster"模式选项。你可以设置每个纹理使用2或3个变体,或者使用新的"Stochastic"模式。例如,你有一个由32个纹理组成的地形,你可以提供第二套32个纹理进行混合,或者还可以提供第三套。也就是说,虽然你仍然受限于使用32个控制纹理,但每个控制纹理都可以与其他2个纹理进行纹理集群,这样你就可以在单个地形上使用96个纹理。

Stochastic Mode

“Stochastic Mode” 是一种处理纹理的技术,它不需要额外的纹理。

这种模式最初是基于这篇论文

然而,这种技术需要对纹理进行自定义处理,并为每种压缩格式编写特殊的代码,这使得它变得非常复杂。

为了简化这个过程,开发了一种新的技术。这种技术的基本思想是,它将纹理在各种方向上与自身混合,以创建一个非重复的表面。这样,即使你只有一种纹理,也可以通过这种方法生成多种看起来不同的纹理。

然而,这种方法并不能提供全面的纹理集群解决方案所能提供的多样性,也就是说,它生成的纹理种类可能没有那么多。但是,这种方法的优点是,你只需要打开它,它就能工作,不需要你做任何额外的设置或准备工作。

Traditional (2 or 3 layer) Texture Clustering:

请添加图片描述

在着色器中,一旦启用了Texture Cluster部分,你就可以为其分配第二组或第三组纹理数组。稍后我们将讨论如何创建这些纹理数组。噪声(Cluster Noise)纹理用于控制纹理的图案,可以在地形上进行缩(Scale)放和偏移(Offset)。

Cluster Contrast可以控制不同纹理集群之间的混合程度。例如,你可以设置在地形类型之间进行柔和的混合,但在内部集群中进行尖锐的混合。

Noise Boost可以增强噪声纹理的效果。如果你提高了Noise Boost,那么纹理的混合会更加明显,或者说,纹理之间的切换会更加频繁。

这两个属性(Cluster ContrastNoise Boost)都可以在每个纹理的基础上进行调整。也就是说,你可以为每个纹理设置不同的值。但请注意,这些设置会应用到整个纹理集群。

Packing Textures

如果你启用了这个选项,你可能会发现你的地形变得非常白,这时你可能需要检查你的纹理设置,确保你已经正确地打包了纹理,并且这些纹理已经被正确地分配给了纹理集群。

请添加图片描述

如果你回到你的"Texture Array Config"(通常位于你的地形的"MegaSplatData"目录中),你会在配置中看到一个新的选项,这个选项允许你指定你计划为每个纹理使用多少种纹理变体。

请添加图片描述

一旦设置好,每个纹理选择区域将被替换为多行显示,用于你的纹理变体。一旦你完成了变体的设置,按下Update按钮将会导出多套纹理数组,然后你可以将它们分配给你的着色器。

请添加图片描述

配置和生成的数组需要分配给你的材质。这样,每个纹理都会根据噪声设置产生变化。

Performance

一个具有3种变体的纹理集群(Texture Cluster)将会采样3倍于同一着色器的非集群版本,并从3倍的纹理中采样。当与像Triplanar Texturing(也是3倍)和Distance Resample(2倍)这样的事物结合时,这可能会消耗更多的计算资源。然而,在MicroSplat中有许多工具可以帮助管理这个问题。你可以使用一个2种变体的集群,在许多情况下仍然可以获得高质量的集群。或者,将混合质量从Best改为BalancedFastest,可以大幅度减少采样次数。

可以这么说,为了得到最终的视觉效果,计算机需要从3种不同的纹理中取样,这就像是在3本不同的书中查找信息。这个过程需要消耗更多的计算资源,就像你需要花更多的时间在3本书中查找信息一样。我们可以选择只使用2种纹理,或者改变混合质量以减少采样次数。这就像是选择只在2本书中查找信息,或者改变我们查找信息的方式以提高效率。

质量基于(次采样)Texture Cluster 3Distance ResampleTriplanar总计(次采样)
最好8*3*2*3144
平衡6*3*2*3108
最快4*3*2*372
最好8*3禁用*372
平衡6*3禁用*354
最快4*3禁用*336
最好8*3禁用禁用24
平衡6*3禁用禁用18
最快4*3禁用禁用12

在高样本数量下,大多数着色器会受到带宽的限制,特别是当这些样本都来自不同的纹理或纹理的不同区域时。然而,如果带宽是瓶颈,纹理集群实际上可以帮助解决这个问题。

想象一下,我们设计我们的地形使用大纹理,比如2k纹理。由于它们的分辨率很高,我们可以将它们拉伸覆盖更大的区域,这有助于减少平铺伪像。但是在这个大小下,GPU必须访问大量的显存来绘制整个纹理。

使用纹理集群,我们可以从多个混合在一起的纹理创建一个表面,这个表面不会平铺,因为它在几个纹理之间不断变化。所以我们可以用3个1k纹理而不是1个2k纹理来创建这个表面,并覆盖更大的区域,而不会产生平铺伪像!这实际上减少了我们需要采样的总显存,从而减少了总带宽。

随机模式(Stochastic Mode)对每个像素需要3个样本,所以它的样本成本类似于一个3层纹理集群(但没有所有额外的显存)。


结束
上一篇 :MicroSplat系列翻译:核心篇
下一篇 :MicroSplat系列翻译【二】:曲面细分(Tessellation Module)

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用一个长宽不等的osg::Texture2D纹理时,需要计算每个顶点对应纹理的UV坐标。这可以通过以下公式来计算: 对于一个顶点的纹理坐标(u,v),其中u和v的值都应该在0到1之间,可以使用以下公式: u = (vertex.x - min_x) / (max_x - min_x) v = (vertex.y - min_y) / (max_y - min_y) 其中,vertex是当前顶点的位置,min_x、min_y、max_x和max_y是纹理在x和y方向上的最小和最大坐标。这些值可以通过osg::Texture2D::getImage()方法获得,然后使用getImage()->s()和getImage()->t()方法分别获得图像的宽度和高度。 代码示例: ``` osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D(); texture->setImage(image); float min_x = 0.0f, min_y = 0.0f, max_x = (float)image->s(), max_y = (float)image->t(); // 计算每个顶点对应的纹理坐标 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); osg::Vec2Array* texcoords = new osg::Vec2Array(vertices->size()); for(int i = 0; i < vertices->size(); i++) { osg::Vec3& vertex = (*vertices)[i]; (*texcoords)[i].set((vertex.x() - min_x) / (max_x - min_x), (vertex.y() - min_y) / (max_y - min_y)); } geometry->setTexCoordArray(0, texcoords); ``` 在上述示例中,geometry是一个osg::Geometry对象,它包含了需要进行纹理映射的顶点信息。我们首先使用osg::Texture2D::setImage()方法将纹理图像设置到纹理对象中,然后通过getImage()方法获取纹理图像的宽度和高度。接着,我们使用osg::Geometry对象的getVertexArray()方法获取顶点数组,并通过计算得到每个顶点对应的纹理坐标,最后将纹理坐标数组设置到geometry对象中的第0个纹理单元中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值