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.