我正在尝试在Metal中实现体素锥追踪,算法中的一个步骤是使用几何着色器对几何体进行体素化。由于Metal没有几何着色器,因此我正在尝试使用计算着色器来模拟它们。我将顶点缓冲传递到计算着色器中,执行几何着色器通常要执行的操作,并将结果写入输出缓冲区。我还向间接缓冲区添加了一个绘制命令。我使用输出缓冲区作为我的顶点着色器的顶点缓冲区。这个方法很好用,但是我的顶点需要两倍的内存,一个用于顶点缓冲区,一个用于输出缓冲区。有没有办法直接将计算着色器的输出传递给顶点着色器而不将其存储在中间缓冲区中?我不需要保存计算着色器的输出缓冲区的内容。我只需要将结果传递给顶点着色器。这种情况是否可能?谢谢
编辑:
本质上,我正在尝试模拟来自GLSL的以下着色器:
对于每个三角形,我需要输出一个三角形,其顶点位于这些新位置。三角形的顶点来自一个顶点缓冲区,并使用索引缓冲区进行绘制。我计划添加代码以进行保守光栅化(只需略微增加三角形的大小),但这里没有显示。目前,在Metal计算着色器中,我使用索引缓冲区获取顶点,在上面的几何着色器中执行相同的代码,并将新顶点输出到另一个缓冲区中,然后我使用该缓冲区进行绘制。
编辑:
本质上,我正在尝试模拟来自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计算着色器中,我使用索引缓冲区获取顶点,在上面的几何着色器中执行相同的代码,并将新顶点输出到另一个缓冲区中,然后我使用该缓冲区进行绘制。