Написание вычислительного шейдера для использования в Unity 4. Я пытаюсь получить 3D-шум.Compute Shaders Input 3d array of floats
Цель состоит в том, чтобы получить мультидиллионный массив float3 в моем вычислительном шейдере из моего кода на C#. Возможно ли это в простой форме (с использованием какой-либо декларации) или может быть достигнуто только с помощью объектов Texture3D?
В настоящее время у меня есть реализация симплекс-шума, работающего над отдельными точками float3, выводящего один плавающий -1 в 1. Я портировал найденный код here для вычислительного шейдера.
Я хотел бы расширить это, чтобы работать над трехмерным массивом float3 (я полагаю, что самое близкое сравнение в C# было бы Vector3[,,]
), применяя операцию шума к каждой точке float3 в массиве.
Я пробовал несколько других вещей, но они чувствуют себя странно и полностью не понимают, что использовать параллельный подход. Выше было то, что я думаю, это должно выглядеть.
Мне также удалось получить Scrawk's Выполнение работы в виде вершинных шейдеров. Scrawk получил 3D-массив float4 в шейдер, используя Texture3D. Но я не смог извлечь поплавки из текстуры. Так работает Compute Shaders? Опираясь на текстуры? Вероятно, я упустил что-то, касающееся получения значений из Текстуры. Кажется, что этот пользователь получает данные в this post. Аналогичный вопрос мне, но не совсем то, что я ищу.
Новое в шейдерах в целом, и я чувствую, что мне не хватает чего-то довольно фундаментального в вычислительных шейдерах и как они работают. Цель состоит в том, чтобы (как я уверен, вы догадались) получить генерацию шума и вычисление сетки с помощью маршевых кубов на графическом процессоре с использованием Compute Shaders (или любой другой шейдер лучше всего подходит для такого рода работ).
Ограничения являются Free Trial издание единства 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)
И вот Compute Shader
#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.
}
Да, я определенно пытаюсь найти нужный материал. Да, цель - воксель :) Похоже, это лицо, которое проходит против всех участников проекта. Я собираюсь для 3D-массива, потому что я хочу облако точек, а не карту высот. Это позволяет создавать выступы и пещеры и т. Д. У меня есть реализация, выполняемая на процессоре, но она составляет около 20 кадров в секунду при генерации кусков. Таким образом, единственный способ получить многомерные данные с плавающей точкой в вычислительном шейдере - использовать Texture2D или Texture3D? Или есть другой синтаксис типа, который я могу использовать для типа REStructuredBuffer? –
PandemoniumSyndicate
Это, наверное, немного презумпция меня, но я думаю, что вы идете по этому пути не так. Генерация такого массива невозможна, это процесс с двумя проходами, сначала создайте «высоту стека» до земли уровень и заполнить «грязь» или что-то еще, затем запустите процедуру (вычислить ядро) в том же массиве, чтобы «выкопать туннели». – War
Разумеется, theres всегда привлекают драгоценные камни GPU ... http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html ... если вы используете это, тогда я хочу, чтобы вы могли ввести в заблуждение функцию плотности с функцией шума , они похожи, но все еще разные функции. – War