ios – 使用金属调用顶点着色器的次数是多少?

ios – 使用金属调用顶点着色器的次数是多少?,第1张

概述我一直在学习一些基本的金属渲染,我坚持一些基本的概念: 我知道我们可以使用以下命令将顶点数据发送到着色器: renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) 然后我们可以在着色器中检索它: vertex float4 basic_vertex(const device VertexIn* vertexIn [[ buf 我一直在学习一些基本的金属渲染,我坚持一些基本的概念:

我知道我们可以使用以下命令将顶点数据发送到着色器:

renderEncoder.setVertexBuffer(vertexBuffer,offset: 0,index: 0)

然后我们可以在着色器中检索它:

vertex @R_404_5987@4 basic_vertex(const device VertexIn* vertexIn [[ buffer(0) ]],unsigned int vID [[ vertex_ID ]])

据我了解,每个顶点都会调用一次顶点函数,每次调用时顶点函数都会更新以包含顶点索引.

问题是,从哪里来的vertex_ID?

我可以向着色器发送更多不同大小的数据:

renderEncoder.setVertexBuffer(vertexBuffer,index: 0)renderEncoder.setVertexBuffer(vertexBuffer2,index: 1)

如果vertexBuffer有3个元素,而vertexBuffer2有10个元素……顶点函数被调用了多少次? 10?

谢谢!

解决方法 这是由您在渲染命令编码器上进行的绘制调用确定的.采用最简单的绘制方法:

drawPrimitives(type:vertexStart:vertexCount:)

vertexCount确定调用顶点函数的次数.传递给顶点函数的顶点ID是从vertexStart到vertexStart vertexCount – 1的范围内的顶点ID.

如果你考虑另一种绘制方法:

drawPrimitives(type:vertexStart:vertexCount:instanceCount:)

这涉及相同范围的顶点ID.但是,它会调用顶点函数vertexCount * instanceCount次.将存在具有顶点ID为vertexStart的instanceCount调用.对于这些调用,实例ID的范围从0到instanceCount – 1.同样,将存在instanceCount调用,其顶点ID为vertexStart 1(假设vertexCount> = 2),其中一个实例ID在[0..instanceCount-1]中.等等.

其他绘制方法有各种其他选项,但它们通常不会影响顶点函数的调用次数.例如,baseInstance会更改实例ID的范围,但不会更改其大小.

各种drawIndexedPrimitives()方法从缓冲区获取特定的顶点ID,而不是枚举范围中的所有顶点ID.该缓冲区可以在多个位置包含给定的顶点ID.对于这种情况,我认为没有定义是否可以针对相同的顶点ID和实例ID多次调用顶点函数. Metal可能会试图避免重复工作,但实际上最好只是为索引缓冲区中的每个索引调用顶点函数更快,即使多个这样的索引最终是相同的顶点ID.

传递给顶点处理阶段的缓冲区中的顶点和数据之间的关系完全取决于您.您根本不必传递任何缓冲区.例如,顶点函数可以仅从顶点ID和实例ID完全计算地生成顶点信息.

当然,对于至少一些缓冲区来说,包含使用顶点ID索引的每顶点数据的数组是很常见的.其他缓冲区可能是对所有顶点都相同的统一数据(也就是说,您不使用顶点ID索引到该缓冲区).但金属本身并不知道这一点.

总结

以上是内存溢出为你收集整理的ios – 使用金属调用顶点着色器的次数是多少?全部内容,希望文章能够帮你解决ios – 使用金属调用顶点着色器的次数是多少?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1073314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存