我浏览了一些关于iOSMetalAPI的教程,他们提到Metal中的所有东西都是三角形。那么,如果我想画一个圆弧,我是否必须导入核心图形并使用它,或者是否有如何使用Metal做到这一点?谢谢。 最佳答案 GPU(除了一些极少数异常(exception))专门处理三角形。正方形只是两个相互对接的三角形。一个圆圈就是一组呈扇形排列的小三角形。每个形状都是由许多以适当模式排列的小三角形组成的。Metal以低级方式与GPU通信,因此现在您的工作是根据三角形组来表达形状。 关于ios-如何使用Me
我有一个运行速度非常慢的Metal应用程序,需要运行得更快。我相信问题是我创建了太多MTLCommandBuffer对象。我创建这么多MTLCommandBuffer对象的原因是我需要向像素着色器发送不同的统一值。我粘贴了一段代码来说明下面的问题。for(intobj_i=0;obj_imtlCommandBuffer=[metal_info.g_commandQueuecommandBuffer];idrenderCommand=[mtlCommandBufferrenderCommandEncoderWithDescriptor:]//glossingoverdetails,but
我有一个关于Metal中常量缓冲区的问题。让我们假设,我有类似的东西:...listofincludesgoeshere...usingnamespacemetal;structConstantBuffer{floatANY_VALUE;};structVS_INPUTS{float4i_pos_ms[[attribute(0)]];};structV2P_STRUCT{float4v_pos_out[[position]];};float3CalcSomething(){returnfloat3(ANY_VALUE,ANY_VALUE,ANY_VALUE);//!!!!!!!!}ve
我正在尝试设置和执行计算内核并将其输出提交给MTKView进行绘制。但是我遇到了以下崩溃:-[MTLDebugCommandBuffercomputeCommandEncoder]:889:failedassertion`encodinginprogress'下面的代码有什么问题?是否不支持使用相同的commandBuffer将计算着色器的输出馈送到渲染管线?funccomputeKernel(_texture:MTLTexture,commandBuffer:MTLCommandBuffer){letcomputeEncoder=commandBuffer.makeComputeCo
我有一个简单的管道描述符letp=MTLRenderPipelineDescriptor()...p.colorAttachments[0].pixelFormat=.bgra8Unorm背景是纯蓝色letbg=MTLClearColor(red:0,green:0,blue:1,alpha:1)letpass=MTLRenderPassDescriptor()pass.colorAttachments[0].loadAction=.clearpass.colorAttachments[0].clearColor=bg我只是在上面画了一个多边形,比如红色的:fragmenthalf4f
在iOS或OS/X中,MetalShaderLanguage内核函数中使用了哪些纹理坐标?例如,给定一个MTLTexture和uint2gid[[thread_position_in_grid]]就是gid.x和gid.y在0..1(x和y是float)或0..inTexture.get_width()(x和y是整数)之间。提前致谢 最佳答案 thread_position_in_grid是网格中的一个索引(整数),它采用您在dispatchThreadgroups:threadsPerThreadgroup:中指定的范围内的值。您
我在这里尝试AppleMetal矩阵乘法示例:https://developer.apple.com/library/ios/samplecode/MetalPartialSumsCompute/Introduction/Intro.html我得到奇怪的结果:对于测试[1]-[7],我得到Metal以大约0.05GFlops的速度运行。从测试[8]-[20]中,Metal开始以大约500GFlops的速度非常快。我在下面附上日志。我查看了代码,测试之间没有什么不同,它们都是大小相似的随机矩阵。看起来Metal在某些时候开始无缘无故地快速运行。知道发生了什么事吗?日志:2016-06-3
在OpenGLES中,可以使用lopw/mediump/highp为制服和属性设置精度。Metal中有这样的东西吗? 最佳答案 Metal着色语言支持half数据类型(参见thespec的第2.1节)。它在那里定义为:A16-bitfloating-point.ThehalfdatatypemustconformtotheIEEE754binary16storageformat.这使得它几乎等同于mediump。Metal中并没有真正等同于lowp的东西。然而,这并不是真正的损失,因为我相信支持Metal的iOSGPU无论如何都不会
我看到了使用Metal计算管道提高应用性能的机会。但是,我的初始测试显示计算管道慢得离谱(至少在旧设备上)。所以我做了一个示例项目来比较计算和渲染管道的性能。该程序采用2048x2048源纹理并将其转换为目标纹理中的灰度。在iPhone5S上,片段着色器完成转换需要3毫秒。但是,计算内核需要177毫秒才能完成同样的事情。那是59倍长!!!您对旧设备上的计算管道有何体验?这不是慢得离谱吗?这是我的片段和计算函数://GrayscaleFragmentFunctionfragmenthalf4grayscaleFragment(RasterizerDatain[[stage_in]],te
我想在Metal内核的线程组之间同步写入MTLBuffer。我尝试使用atomic_uint类型和atomic_fetch_add_explicit函数。这应该可行,但我的问题是我不知道如何解释CPU端的值。我更喜欢一种锁定机制,我可以使用它来同步从不同线程组写入同一缓冲区。是否存在不受原子类型约束的机制或其他一些解决方法? 最佳答案 我在16位float转换中遇到了类似的问题。您可以尝试通过从缓冲区中提取原始位来解释CPU端的值,与atomic_uint的内部格式进行比较,然后尝试使用获得的信息重新转换为您需要的数据类型。肯定是一