Directx 单纯形噪声着色器?

Directx 单纯形噪声着色器?,directx,shader,perlin-noise,simplex-noise,Directx,Shader,Perlin Noise,Simplex Noise,我有几个关于单纯形噪声的问题。我正在使用Simplex Noise在directx中生成地形,但我目前正在使用类之类的工具来生成地形。我可能也会将其用于纹理,所以有必要将其更改为着色器实现吗?如果是这样,这容易做到吗 另外,对于纹理,使用3D还是2D噪波更好 如果应用程序未动态使用噪波网格和纹理,则应保持当前用于网格的脱机创建。但是,如果您希望网格和纹理随时间动态更改(考虑可变形地形),那么如果高fps对您很重要,则有必要将其更改为着色器实现。这是可以做到的,但是我不确定你是否有能力声称这很容易

我有几个关于单纯形噪声的问题。我正在使用Simplex Noise在directx中生成地形,但我目前正在使用类之类的工具来生成地形。我可能也会将其用于纹理,所以有必要将其更改为着色器实现吗?如果是这样,这容易做到吗


另外,对于纹理,使用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]