編寫計算着色器以用於Unity 4.我試圖獲得3d噪聲。計算着色器輸入浮點數3d數組
我們的目標是從我的C#代碼中獲取一個multidiminsional float3數組到我的計算着色器。這可能是直接的(使用某種聲明)還是隻能使用Texture3D對象來實現?
我目前有一個工作在單個float3點上的單工噪聲的實現,輸出一個float -1到1.我移植了計算着色器的代碼here。
我想通過將噪聲操作應用於數組中的每個float3點來擴展它以工作在float3的3D數組上(我假設在C#中最接近的比較將是Vector3[,,]
)。
我已經嘗試了一些其他的東西,但他們感到奇怪,完全錯過了使用並行方法的觀點。以上是我想象的應該看起來像。
我也設法得到Scrawk's實現作爲頂點着色器工作。 Scrawk使用Texture3D將3D float4數組添加到着色器中。但我無法從紋理中提取浮線。計算着色器是如何工作的?依靠紋理?我可能忽略了有關從紋理中獲取值的問題。這似乎是這個用戶在this post中獲取數據的方式。類似的問題,我的,但不是我正在尋找。
新增了一般的着色器,我覺得我錯過了一些關於計算着色器以及它們如何工作的基礎知識。我們的目標是(使用計算着色器(或者任何着色器最適合這種工作),使用推進立方體到GPU上進行噪聲生成和網格計算(我相信你已經猜到了)。
約束是統一4.
的免費試用版下面是我使用的C#代碼的骨架:
int volumeSize = 16;
compute.SetInt ("simplexSeed", 10);
// This will be a float[,,] array with our density values.
ComputeBuffer output = new ComputeBuffer (/*s ize goes here, no idea */, 16);
compute.SetBuffer (compute.FindKernel ("CSMain"), "Output", output);
// Buffer filled with float3[,,] equivalent, what ever that is in C#. Also what is 'Stride'?
// Haven't found anything exactly clear. I think it's the size of basic datatype we're using in the buffer?
ComputeBuffer voxelPositions = new ComputeBuffer (/* size goes here, no idea */, 16);
compute.SetBuffer (compute.FindKernel ("CSMain"), "VoxelPos", voxelPositions);
compute.Dispatch(0,16,16,16);
float[,,] res = new float[volumeSize, volumeSize, volumeSize];
output.GetData(res); // <=== populated with float density values
MarchingCubes.DoStuff(res); // <=== The goal (Obviously not implemented yet)
而這裏的計算着色器
#pragma kernel CSMain
uniform int simplexSeed;
RWStructuredBuffer<float3[,,]> VoxelPos; // I know these won't work, but it's what I'm trying
RWStructuredBuffer<float[,,]> Output; // to get in there.
float simplexNoise(float3 input)
{
/* ... A bunch of awesome stuff the pastebin guy did ...*/
return noise;
}
/** A bunch of other awesome stuff to support the simplexNoise function **/
/* .... */
/* Here's the entry point, with my (supposedly) supplied input kicking things off */
[numthreads(16,16,16)] // <== Not sure if this thread count is correct?
void CSMain (uint3 id : SV_DispatchThreadID)
{
Output[id.xyz] = simplexNoise(VoxelPos.xyz); // Where the action starts.
}
是的,我肯定會努力爭取數量線程的東西。是的,目標是體素地形:)似乎這是一個試火的最proc地形開發者的臉。我正在尋找3D陣列,因爲我想要一個點雲,而不是一個高度圖。這允許產生懸垂和洞穴等。我有一個在CPU上運行的實現,但生成塊時大約爲20 fps。那麼獲得多維浮點數據到計算着色器的唯一方法是使用Texture2D或Texture3D?還是有另一種類型的語法,我可以用於REStructuredBuffer? –
PandemoniumSyndicate
這可能有點讓我失望,但我認爲你會以錯誤的方式去做......像這樣生成數組是不可行的,這是一個2遍過程,首先生成「堆棧高度」到地面級別並填充「污垢」或其他內容,然後在同一陣列上運行一個過程(計算內核)以「挖掘隧道」。 – War
當然,總是GPU的寶石方法... http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html ...如果你正在使用,然後我叮叮噹噹,你可能會混淆密度函數與噪聲函數它們是相似的,但仍然是不同的功能。 – War