Simplex Noise着色器?

时间:2013-03-26 01:59:39

标签: directx shader perlin-noise simplex-noise

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

另外,对于纹理来说,使用3D或2D噪音会更好吗?

3 个答案:

答案 0 :(得分:3)

是的,你真的应该将这项工作转移到GPU,这是它最擅长的。

GPU上的单工噪声是一个已解决的问题。你可以找到一篇关于这个主题的优秀论文here,或者你可以从here中获取一个实现。

这个实现是在GLSL中,但移植它只是改变vec3& amp; vec4是浮动3和浮动4的。

使用过后,我发现到目前为止最快的噪声功能实现是由inigo quilez实现的Perlin噪声(下面提供的实现来自于shadowrtoy.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

答案 1 :(得分:1)

我想用以上答案的奇妙功能完成上述答案,这样你就可以获得它的资格(它类似于libnoise图书馆的价值)

你可以看到它真棒,它需要适应处理负空间值(绝对x y z轴)......显然它是3d所以期望在y轴上有相同的形态。

enter image description here

enter image description here

答案 2 :(得分:-2)

如果您的应用程序没有动态使用噪声网格和纹理,那么您应该保留当前用于网格的离线创建。但是,如果您希望网格和纹理随时间动态变化(想想可变形地形),那么如果高fps对您很重要,则需要将其更改为着色器实现。它可以做到,但我不确定你声称它容易的能力水平。它将涉及使用几何着色器(可能是流出)用于地形网格的情况,并使用像素着色器来创建纹理。

对于纹理使用2d或3d噪声,这取决于您的使用需求。 3d纹理有助于表示像力场,体素场等等。但它们是昂贵的动态创建。如果您只想将纹理用作常规网格材质,则可以使用2d。

相关问题