シンプレックス ノイズについていくつか質問があります。Directx でシンプレックス ノイズを使用して地形を生成していますが、現在はクラスなどを使用して実行しています。多分これもテクスチャに使うと思うので、シェーダー実装に変更する必要はありますか?もしそうなら、これは簡単にできますか?
また、テクスチャには 3D ノイズと 2D ノイズのどちらを使用するのが良いですか?
シンプレックス ノイズについていくつか質問があります。Directx でシンプレックス ノイズを使用して地形を生成していますが、現在はクラスなどを使用して実行しています。多分これもテクスチャに使うと思うので、シェーダー実装に変更する必要はありますか?もしそうなら、これは簡単にできますか?
また、テクスチャには 3D ノイズと 2D ノイズのどちらを使用するのが良いですか?
ええ、本当にこの作業を GPU に移行する必要があります。それが GPU の得意分野です。
GPU のシンプレックス ノイズは解決済みの問題です。このテーマに関する優れた論文をここで見つけることができます。また、ここから実装を入手することもできます。
その実装は GLSL ですが、移植は単に vec3 と vec4 を float3 と float4 に変更するだけです。
それを使用してみると、ノイズ関数の最も高速な実装は、inigo quilez による Perlin ノイズの実装であることがわかりました (以下に示す実装は、shadertoy.com の Web サイトにあるコードから取得したものです。素晴らしいサイトです。ぜひチェックしてください!
#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に似ています)
ご覧のとおり、それは素晴らしいものであり、負の空間値 (xyz 軸の絶対値) を処理するように調整する必要があります...明らかに 3d であるため、y 軸で同じ形態を期待してください。
アプリケーションがノイズ メッシュとテクスチャを動的に使用していない場合は、現在メッシュに使用しているオフライン作成を維持する必要があります。ただし、メッシュとテクスチャを時間の経過とともに動的に変化させたい場合 (変形可能な地形を考えてください)、高い fps が重要な場合は、シェーダーの実装に変更する必要があります。それは可能ですが、あなたがそれを簡単だと主張できるレベルかどうかはわかりません. テレイン メッシュの場合はジオメトリ シェーダー (場合によってはストリームアウト) を使用し、テクスチャを作成するにはピクセル シェーダーを使用する必要があります。
テクスチャに 2D または 3D ノイズを使用するかどうかは、使用のニーズによって異なります。3D テクスチャは、力場やボクセル フィールドなどを表現するのに適しています。ただし、動的に作成するにはコストがかかります。テクスチャを通常のメッシュ マテリアルとして使用するだけの場合は、2D が適しています。