О, неважно. Я должен иметь возможность просто использовать drawPrimitives с количеством вершин в качестве индекса.
аюсь реализовать отслеживание воксельных конусов в металле. Одним из шагов в алгоритме является вокселизация геометрии с помощью геометрического шейдера. В металле нет геометрических шейдеров, поэтому я пытался эмулировать их с помощью компьютерного шейдера. Я передаю свой буфер вершин в вычислительный шейдер, делаю то, что обычно делает геометрический шейдер, и записываю результат в выходной буфер. Я также добавляю команду рисования в косвенный буфер. Я использую выходной буфер в качестве буфера вершин для моего вершинного шейдера. Это работает нормально, но мне нужно вдвое больше памяти для моих вершин, один для буфера вершин и один для буфера вывода. Есть ли способ напрямую передать выходные данные вычислительного шейдера в вершинный шейдер, не сохраняя его в промежуточном буфере? Мне не нужно сохранять содержимое буфера вывода вычислительного шейдера. Мне просто нужно дать результаты вершинному шейдеру.
Это возможно? Спасибо
РЕДАКТИРОВАТЬ
По сути, я пытаюсь эмулировать следующий шейдер из glsl:
#version 450
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
layout(location = 0) in vec3 in_position[];
layout(location = 1) in vec3 in_normal[];
layout(location = 2) in vec2 in_uv[];
layout(location = 0) out vec3 out_position;
layout(location = 1) out vec3 out_normal;
layout(location = 2) out vec2 out_uv;
void main()
{
vec3 p = abs(cross(in_position[1] - in_position[0], in_position[2] - in_position[0]));
for (uint i = 0; i < 3; ++i)
{
out_position = in_position[i];
out_normal = in_normal[i];
out_uv = in_uv[i];
if (p.z > p.x && p.z > p.y)
{
gl_Position = vec4(out_position.x, out_position.y, 0, 1);
}
else if (p.x > p.y && p.x > p.z)
{
gl_Position = vec4(out_position.y, out_position.z, 0, 1);
}
else
{
gl_Position = vec4(out_position.x, out_position.z, 0, 1);
}
EmitVertex();
}
EndPrimitive();
}
Для каждого треугольника мне нужно вывести треугольник с вершинами в этих новых позициях. Вершины треугольника происходят из буфера вершин и рисуются с использованием индексного буфера. Я также планирую добавить код, который будет выполнять консервативную растеризацию (просто немного увеличит размер треугольника), но здесь это не показано. В настоящее время то, что я делаю в шейдере вычислений Metal, использует буфер индекса для получения вершины, выполняет тот же код в геометрическом шейдере выше и выводит новую вершину в другой буфер, который я затем использую для рисования.