编写要在 Unity 4 中使用的计算着色器。我正在尝试获得 3d 噪声。
目标是从我的 C# 代码中将一个多维 float3 数组放入我的计算着色器中。这是否可能以直接的方式(使用某种声明)或只能使用 Texture3D 对象来实现?
我目前有一个在单个 float3 点上工作的单纯形噪声的实现,输出单个浮点数 -1 到 1。我移植了此处为计算着色器找到的代码。
我想通过对数组中的Vector3[,,]
每个 float3 点应用噪声操作来扩展它以处理 float3 的 3D 数组(我想 C# 中最接近的比较是 )。
我尝试了其他一些方法,但它们感觉很奇怪并且完全错过了使用并行方法的意义。以上是我想象的应该是什么样子。
我还设法让Scrawk 的实现作为顶点着色器工作。Srawk 使用 Texture3D 将 3D float4 数组放入着色器。但我无法从纹理中提取浮动。计算着色器也是这样工作的吗?依赖纹理?我可能忽略了一些关于从纹理中获取值的问题。这似乎是该用户在这篇文章中获取数据的方式。与我的类似问题,但不是我想要的。
一般来说,着色器是新手,我觉得我错过了一些关于计算着色器及其工作原理的非常基本的东西。目标是(我相信您已经猜到了)使用 Compute Shaders(或任何最适合此类工作的着色器)使用行进立方体在 GPU 上生成噪声和网格计算。
约束是 Unity 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.
}