草庐IT

ios - Metal 最佳实践 - 在渲染期间更改渲染管道描述符

在我的渲染管道中,我想使用一些着色器,并且在某些情况下修改MTLRenderPipelineDescriptor对象上的参数(例如,更改混合函数)。在我看来,我有2个选择:为每个参数组合(顶点着色器、片段着色器、混合等)创建并预编译一个MTLRenderPipelineState。我可以有很多这样的状态对象,因为可能有很多组合。在渲染过程中创建并编译新的MTLRenderPipelineState对象。哪个选项更好?我还缺少其他选项吗? 最佳答案 对于最佳实践(和最佳性能),您应该遵循选项1。在TransientandNon-tra

ios - 如何使用 Metal 将纹理缓冲区数据传递给着色器?

我想在计算着色器中将纹理数据作为一维数组处理。我读到最好的方法是将其作为缓冲区而不是1D纹理传递。我正在加载纹理:lettextureLoader=MTKTextureLoader(device:device)do{ifletimage=UIImage(named:"testImage"){letoptions=[MTKTextureLoaderOptionSRGB:NSNumber(value:false)]trykernelSourceTexture=textureLoader.newTexture(with:image.cgImage!,options:options)kerne

swift - 在 Metal 中,将顶点和片段缓冲区设置为相同的 MTLBuffer 是否仅将其复制到 GPU 一次?

我正在将统一缓冲区传递给顶点着色器和片段着色器。letuniformBuffer=device.makeBuffer(length:4096,options:[])renderEncoder.setVertexBuffer(uniformBuffer,offset:0,at:1)renderEncoder.setFragmentBuffer(uniformBuffer,offset:0,at:1)这是否将uniformBuffer从CPU复制到GPU两次?然后我会将缓冲区从顶点着色器传递到片段着色器,这发生在GPU内部。 最佳答案

ios - 用 Metal 渲染四边形性能

我正在尝试使用MetalAPI在AppleA7GPU上尽可能快地渲染大量非常小的2D四边形。研究该GPU的三角吞吐量数字,例如here,并且从Apple在他们的主题演示期间引用屏幕上超过100万个三角形,我希望能够以60fps的速度每帧渲染大约500,000个这样的四边形。也许少一点,因为它们都是可见的(在屏幕上,没有被z缓冲区隐藏)并且很小(对于光栅化器来说很棘手),所以这可能不是GPUsuper优化的用例。也许Apple演示以30fps的速度运行,所以假设~200,000应该是可行的。当然是100,000……对吧?但是,在我的测试应用程序中,最大值仅为20,000左右——不止于此,

ios - Metal 同时有纹理和无纹理,多重混合

我在Metal中绘制了2个不同的顶点缓冲区,一个带有纹理(忽略顶点颜色数据),另一个没有纹理(仅绘制顶点颜色数据):letcommandBuffer=self.commandQueue.makeCommandBuffer()letcommandEncoder=commandBuffer.makeRenderCommandEncoder(descriptor:rpd)//renderfirstbufferwithtexturecommandEncoder.setRenderPipelineState(self.rps)commandEncoder.setVertexBuffer(self

ios - 如何在 Metal 中绑定(bind) Array Texture 2D

我正在尝试按照我可以从互联网上挖掘的内容在Metal中使用二维数组纹理。我能够成功地初始化我的纹理数组,但现在我遇到了一个错误,该错误在将纹理与myEncoder.setFragmentTexture(myTextureArray,index:myIndex)绑定(bind)后出现:Failedassertion`FragmentFunction(basicFragment):incorrecttypeoftexture(MTLTextureType2DArray)boundattexturebindingatindex0(expectMTLTextureType2D)fortextu

swift - 尝试使用 AVFoundation AVAssetWriter 将 Metal 帧写入 Quicktime 文件时出现全黑帧

我正在使用这个Swift类(最初显示在这个问题的答案中:CaptureMetalMTKViewasMovieinrealtime?)尝试将我的Metal应用程序框架记录到电影文件中。classMetalVideoRecorder{varisRecording=falsevarrecordingStartTime=TimeInterval(0)privatevarassetWriter:AVAssetWriterprivatevarassetWriterVideoInput:AVAssetWriterInputprivatevarassetWriterPixelBufferInput:A

ios - "SceneKit: error, missing buffer [-1/2]"试图将制服传递给 Metal 着色器时

我已将SCNProgram附加到SceneKit的几何体,并且我正在尝试将制服传递给片段着色器。在我的简单代码片段中,我只是将输出颜色作为统一传递给片段着色器,片段着色器将它作为输出值返回。我已经测试了着色器并且它们可以工作,因为我可以在顶点着色器中成功地旋转一个对象,或者在片段着色器中以不同的颜色绘制一个对象,等等......但问题是当我通过制服时。这是我的片段着色器:structUniforms{float4color;};fragmentfloat4myFragment(MyVertexOutputin[[stage_in]],constantUniforms&uniforms[

swift - Metal API 中的光类型

我想知道MetalAPI中是否只有PointLight和AmbientLight或者我也可以使用SpotLight和DirectionalLight在我的3D环境中?structLight{varcolor:(Float,Float,Float)varambientIntensity:Floatstaticfuncsize()->Int{returnsizeof(Float)*4}funcraw()->[Float]{letraw=[color.0,color.1,color.2,ambientIntensity]returnraw}}HowtoimplementSpotLightan

swift - 快速使用 Metal 拍摄当前屏幕的快照

我试过:letscale=UIScreen.mainScreen().scaleUIGraphicsBeginImageContextWithOptions(metalLayer.bounds.size,false,scale)//metalLayer.renderInContext(UIGraphicsGetCurrentContext()!)//self.view.layer...metalLayer.presentationLayer()!.renderInContext(UIGraphicsGetCurrentContext()!)letimage=UIGraphicsGetI