补坑:基于2D贴图的3D噪声——偏移(37,17)

最近需要做球面随机地形,然后想起之前写的体积云相关https://blog.csdn.net/qq_41524721/article/details/101516784?spm=1001.2014.3001.5501顺便重温了iq大神的U管视频教程和神殿代码

神殿的地面就是fbm4做的随机地形:

这就是我需要的。noise3D然后再fbm4。

由于体积云那篇的代码也是一样的noise3D,fbm4,而且我记得我当时上传了那张专门为3D噪声而有特殊偏移的noise2D贴图,所以准备直接照搬到项目里

noise3D有实时计算和基于贴图。

其中,实时计算是理论上更精确的Noise。在一般需求里,其实基于贴图的noise够用了,基本没有区别。

但我的项目是SDFTrace建模的无限细节游戏,具体效果还是有差别的:

远看:实时计算的noise3D

 

远看:基于贴图的noise3D

近看:实时计算的noise3D

近看:基于贴图的noise3D

 当然,效果差异除了noise3D精度不一样,还跟我的SDFTrace算法有关。

但最主要的是,实时计算的noise3D太耗了,吃不消。

 所以准备用基于贴图的noise3D。

当我准备拿之前体积云那篇的noise3D直接用时,发现当时上传的偏移图是糊的...

糊的图直接拿来用,产生的3D空间噪声是不连续的。网上找ShaderToy那张原图也找不到。

没办法,直接用Unity.c#写CPU代码生成了。这里重新上传一下:

g通道=r通道+(37,17)

但这样还是不对,我的代码几乎是照抄的,那问题就只能出在我自己写的SampleLevel里了:

float noise_texBase(in float3 x)
{
	float3 p = floor(x);
	float3 f = frac(x);
	f = f * f*(3.0 - 2.0*f);
	float2 uv = (p.xy + float2(37.0, 17.0)*p.z) + f.xy;
	float2 rg = NoiseRGBTex.SampleLevel(noise_point_repeat_sampler, (uv + 0.5)/256, 0).yx;
	return lerp(rg.x, rg.y, f.z);
}

 我拿2D结果看了一下,发现noise生成出来是离散的,那估计不能用point去sample,还是得用bilinear。于是noise_point_repeat_sampler换noise_linear_repeat_sampler。这种SamplerState名是Unity特殊规定的,具体不表。

 这下终于好了。

想想我也是nc,既然是用作noise,肯定是要随便缩放采样的,怎么可能用point。

基于贴图的效果,虽然没有实时计算的完美,但也算另一种风格,有点像机刻出来的粗糙感。

实时计算可能有优化的空间,但是应该属于可发paper级别了,先做其他功能...

————————————————————

后期补充

在SDF建模的应用场景下,应用基于贴图的noise3D,适当放宽估计normal用的eplision,可以在近处获得接近实时noise的效果。(不过此时更大的画质问题是trace精度。)

 

 

 

 

### 噪声贴图的扰动效果及其实现方法 噪声贴图是一种常见的纹理技术,广泛应用于游戏开发和视觉特效领域。它可以通过程序化生成的方式模拟自然界的复杂现象,例如云层、火焰、水流等动态效果。以下是关于噪声贴图及其扰动实现的具体介绍: #### 1. 噪声贴图的基础概念 噪声贴图通常由算法生成,最常见的是Perlin Noise或Simplex Noise[^2]。这些算法能够创建平滑过渡的随机图案,适用于多种场景中的细节增强。 - **Perlin Noise**: 这种类型的噪声是由Ken Perlin发明的一种梯度噪声函数,具有良好的连续性和可控性。 - **Simplex Noise**: 它是对Perlin Noise的一个改进版本,在计算效率上有显著提升,尤其适合高维空间的应用。 这两种噪声都可以用来作为基础数据源来驱动UV坐标的变化,从而达到扰动的目的。 #### 2. UV扰动的基本原理 为了实现基于噪声贴图的UV扰动,可以采用如下方式: - 使用Shader编程语言(如HLSL/CG用于Unity Shader Graph),定义一个依赖时间变量或其他参数变化而改变的新UV映射关系。 - 将此新UV应用到材质上的原始纹理采样位置上,使得最终显示出来的图像看起来像是移动或者变形了一样。 具体来说,在ASE( Amplify Shader Editor )环境中构建这样的逻辑相对直观简单。你可以利用Vector节点输入Noise Texture的结果,并将其乘以某个缩放因子以及加上Time节点输出的时间值一起作用于主Texure Sample之前的位置偏移处理阶段[^3]。 ```csharp // HLSL Code Example for UV Distortion with Noise Map float4 GetDistortedUV(float2 baseUV, float timeFactor){ // Load noise texture at current uv location. float distortionValue = tex2D(_NoiseMap, baseUV).r; // Scale and offset the result based on user parameters & elapsed game time. float distortedX = (distortionValue * _StrengthX) + (_SpeedX * timeFactor); float distortedY = (distortionValue * _StrengthY) + (_SpeedY * timeFactor); return float4(baseUV.x + distortedX ,baseUV.y + distortedY ,0,0); } ``` 以上代码片段展示了如何在一个自定义函数中获取经过扭曲后的UV坐标。其中`_NoiseMap`, `_StrengthX/Y`, 和 `_SpeedX/Y`都是可调节属性,允许艺术家灵活控制整体表现形式。 #### 3. 应用实例分析 当我们将上述理论付诸实践时,可能会得到类似于闪电划过天空或是水面波光粼粼之类的生动画面。这是因为恰当设置下的噪声扰动能很好地模仿自然界里那些不可预测却又遵循一定规律的现象。 例如,对于闪电效果而言,快速变动且局部集中的高强度扰动配合特定颜色渐变就能营造出逼真的电弧感;而对于水体仿真,则可能需要更柔和连贯些的整体位移模式再加上反射折射等因素共同决定最后呈现给观众的模样[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值