Directx 单纯形噪声着色器?
我有几个关于单纯形噪声的问题。我正在使用Simplex Noise在directx中生成地形,但我目前正在使用类之类的工具来生成地形。我可能也会将其用于纹理,所以有必要将其更改为着色器实现吗?如果是这样,这容易做到吗Directx 单纯形噪声着色器?,directx,shader,perlin-noise,simplex-noise,Directx,Shader,Perlin Noise,Simplex Noise,我有几个关于单纯形噪声的问题。我正在使用Simplex Noise在directx中生成地形,但我目前正在使用类之类的工具来生成地形。我可能也会将其用于纹理,所以有必要将其更改为着色器实现吗?如果是这样,这容易做到吗 另外,对于纹理,使用3D还是2D噪波更好 如果应用程序未动态使用噪波网格和纹理,则应保持当前用于网格的脱机创建。但是,如果您希望网格和纹理随时间动态更改(考虑可变形地形),那么如果高fps对您很重要,则有必要将其更改为着色器实现。这是可以做到的,但是我不确定你是否有能力声称这很容易
另外,对于纹理,使用3D还是2D噪波更好 如果应用程序未动态使用噪波网格和纹理,则应保持当前用于网格的脱机创建。但是,如果您希望网格和纹理随时间动态更改(考虑可变形地形),那么如果高fps对您很重要,则有必要将其更改为着色器实现。这是可以做到的,但是我不确定你是否有能力声称这很容易。对于地形网格的情况,它将涉及使用几何体着色器(可能是流出来的),以及使用像素着色器来创建纹理
至于对纹理使用2d或3d噪波,这取决于您的使用需求。3d纹理很适合表示力场、体素场等。但是动态创建3d纹理的成本很高。如果你只想将纹理用作常规的网格材质,那么2d就是最好的选择。是的,你真的应该将这项工作转移到GPU上,这是它最擅长的 GPU上的单纯形噪声是一个已解决的问题。你可以找到一篇关于这个主题的优秀论文,也可以从中获取一个实现 该实现是在GLSL中实现的,但移植它只是将vec3和vec4更改为float3和float4的问题 使用了它之后,我发现迄今为止最快的噪波函数实现是inigo quilez对柏林噪波的实现(下面提供的实现取自shadertoy.com网站上的代码。这是一个很棒的网站,请查看
#ifndef __noise_hlsl_
#define __noise_hlsl_
// hash based 3d value noise
// function taken from https://www.shadertoy.com/view/XslGRr
// Created by inigo quilez - iq/2013
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
// ported from GLSL to HLSL
float hash( float n )
{
return frac(sin(n)*43758.5453);
}
float noise( float3 x )
{
// The noise function returns a value in the range -1.0f -> 1.0f
float3 p = floor(x);
float3 f = frac(x);
f = f*f*(3.0-2.0*f);
float n = p.x + p.y*57.0 + 113.0*p.z;
return lerp(lerp(lerp( hash(n+0.0), hash(n+1.0),f.x),
lerp( hash(n+57.0), hash(n+58.0),f.x),f.y),
lerp(lerp( hash(n+113.0), hash(n+114.0),f.x),
lerp( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);
}
#endif
我想用上面答案的奇妙函数的图片来完成上面的答案,这样您就可以对它进行限定(它类似于libnoise库中的valuenoise) 正如您所见,它非常棒,需要调整以处理负空间值(绝对x y z轴)…显然它是3d的,所以在y轴上期望相同的形态
感谢您提供上述代码,尽管它在负值下不起作用,但它非常棒,我已经为它制作了一张图片,以便您能够获得资格,它类似于libnoise value noise:[IMG]