Metal emular shaders de geometria usando shaders de computação

Estou tentando implementar o rastreamento de cone voxel no Metal. Uma das etapas do algoritmo é voxelizar a geometria usando um sombreador de geometria. O metal não possui shaders de geometria, então eu estava pensando em emulá-los usando um shader de computação. Passo meu buffer de vértice no shader de computação, faço o que um shader de geometria normalmente faria e gravo o resultado em um buffer de saída. Também adiciono um comando draw a um buffer indireto. Eu uso o buffer de saída como o buffer de vértice para meu shader de vértice. Isso funciona bem, mas preciso do dobro de memória para meus vértices, um para o buffer de vértice e outro para o buffer de saída. Existe alguma maneira de transmitir diretamente a saída do shader de computação para o shader de vértice sem armazená-lo em um buffer intermediário? Não preciso salvar o conteúdo do buffer de saída do shader de computação. Eu só preciso dar os resultados para o vertex shader.

Isso é possível? obrigado

EDITAR

Basicamente, estou tentando emular o seguinte sombreador do 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();
}

Para cada triângulo, preciso gerar um triângulo com vértices nessas novas posições. Os vértices triangulares vêm de um buffer de vértice e são desenhados usando um buffer de índice. Também planejo adicionar código que fará uma rasterização conservadora (apenas aumente o tamanho do triângulo em um pouco), mas não é mostrado aqui. Atualmente, o que estou fazendo no sombreador de computação Metal é usar o buffer de índice para obter o vértice, fazer o mesmo código no sombreador de geometria acima e emitir o novo vértice em outro buffer que eu uso para desenhar.

questionAnswers(1)

yourAnswerToTheQuestion