О, неважно. Я должен иметь возможность просто использовать 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, использует буфер индекса для получения вершины, выполняет тот же код в геометрическом шейдере выше и выводит новую вершину в другой буфер, который я затем использую для рисования.

Ответы на вопрос(1)

Ваш ответ на вопрос