По сути, я пытаюсь обработать трассировку лучей на моем вычислительном шейдере, и я проверил, что он работает и правильно выводит любой отдельный float3, я сделал гораздо более медленную реализацию, где отдельные пиксели визуализировались на GPU и копировались обратно в CPU. каждый раз, очень медленно, но это доказывало, что моя математика в функции трассировки лучей GPU была правильной и давала правильные результаты.
Однако у меня возникают трудности с выводом массива float3, поскольку RWStructuredBuffer несколько смущает меня
Вот мой RWStructuredBuffer
RWStructuredBuffer<float3> Data: register(u0);
Ничего особенного, но есть для справки
Вот моя функция в вычислительном шейдере, которую я вызываю с помощью Dispatch
groupshared uint things;
[numthreads(1, 1, 1)]
void RenderRay(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex)
{
float4 empty = { 0, 0, 0, 0 };
uint offset = 0;
float3 pixel;
float invWidth = 1 / float(width.x), invHeight = 1 / float(height.x);
float fov = 30, aspectratio = width.x / float(height.x);
float angle = tan(M_PI * 0.5 * fov / 180.);
GroupMemoryBarrierWithGroupSync();
for (uint y = 0; y < height.x; ++y)
{
if(y>0)
offset += height.x;
for (uint x = 0; x < width.x; ++x)
{
float xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
float yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
float4 raydirection = { xx, yy, -1, 0 };
normalize(raydirection);
pixel = trace(empty, raydirection, 0);
Data[0][x] = pixel;
}
}
GroupMemoryBarrierWithGroupSync();
Настройка Data [0] = pixel работала для попиксельной реализации, так как мне нужно было только вернуть одно значение, но я не могу добиться тех же результатов, пытаясь вывести все изображение сразу, так как не могу понять, как добавить их в массив
Запись этого звучит как глупая проблема, но, тем не менее, я застрял.
Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …