【发布时间】:2016-06-15 11:50:33
【问题描述】:
我正在构建一个在 Metal 中渲染 2D 几何图形的应用程序。
现在,顶点的位置是从顶点函数中解决的。我想要的是从同一个顶点函数内部将解决的位置写回缓冲区。
我的印象是这是possible,尽管这是我第一次尝试这样做,即:
vertex VertexOut basic_vertex(device VertexIn *vertices [[ buffer(0) ]],
device VertexOut *solvedVertices [[ buffer(1) ]],
vid [[ vertex_id ]])
{
VertexIn in vertices[vid];
VertexOut out;
out.position = ... // Solve the position of the vertex
solvedVertices[vid] = out // Write to the buffer later to be read by CPU
return out;
}
我很高兴看到这个编译时错误:
好的,所以我想到了一些解决方案 - 我可以首先解决顶点位置 - 非光栅化 - 通过声明如下的顶点函数:
vertex void solve_vertex(device VertexIn *unsolved [[ buffer(0) ]],
device VertexOut *solved [[ buffer(1) ]],
vid [[ vertex_id ]])
{
solved[vid] = ...
}
然后将这些已解决的顶点通过管道传输到现在更简单的 - 光栅化 - 顶点函数。
另一种可行但似乎不太吸引人的解决方案是在计算函数中解决它们。
那么,在这种情况下,最好的方法是什么?从我的一点点研究中,我可以追踪到在Transform Feedback 中完成了同样的程序,但我没有运气(除了问题乞求时的link)在Apple的文档中找到示例/示例代码或网络上的其他地方,以便在遇到此类问题时获得最佳实践。
【问题讨论】:
-
你可以写入
constant缓冲区而不是device。 -
@Marius
constant地址空间是只读的。看这里 - Functions, Variables, and Qualifiers -
Metal 并没有通常理解的变换反馈;您发现的(使用带有写入缓冲区的顶点函数的非光栅化管道)是最接近的。计算版本基本上可以完成相同的工作,并且非常容易编写;我会尝试两者,看看哪个能给你更好的性能。我没有将此作为答案发布,因为(a)我没有经验证据支持这两种方法,并且(b)我希望您在调查后自行回答:)
-
好的,再次感谢@warrenm 的反馈。正如您所建议的,一旦我调查了不同的解决方案,我会自行回答。
-
@jameslintaylor 您是否发现使用计算管道比渲染管道更快/更慢?
标签: metal