金属离屏绘图与多采样

如何将原始图像渲染到屏幕外的纹理,而不是直接进入屏幕?

我有一套三angular形和相应的颜色,我只是想画他们一样的方式,我屏幕,但进入屏幕外的纹理,我可以保存到一个文件。

任何人都可以给我看一个代码示例吗?

好吧,我自己意识到了。 这个代码完成了这个工作,只是它绘制了太大的三angular形,但是这对于Vertex函数是一个不同的主题。

这是我的代码:

  let fragmentProgram = defaultLibrary.newFunctionWithName("image_fragmentT") let vertexProgram = defaultLibrary.newFunctionWithName("image_vertexT") struct VertexT { var x, y, z, w : Float var r, g, b, a : Float } let vertexDescriptor = MTLVertexDescriptor() vertexDescriptor.attributes[0].offset = 0 vertexDescriptor.attributes[0].format = .Float4 vertexDescriptor.attributes[0].bufferIndex = 0 vertexDescriptor.attributes[1].offset = 0 vertexDescriptor.attributes[1].format = .Float4 vertexDescriptor.attributes[1].bufferIndex = 0 vertexDescriptor.layouts[0].stepFunction = .PerVertex vertexDescriptor.layouts[0].stride = sizeof(VertexT) let pipelineStateDescriptor = MTLRenderPipelineDescriptor() pipelineStateDescriptor.vertexDescriptor = vertexDescriptor pipelineStateDescriptor.vertexFunction = vertexProgram pipelineStateDescriptor.fragmentFunction = fragmentProgram pipelineStateDescriptor.colorAttachments[0].pixelFormat = .RGBA8Unorm; pipelineStateDescriptor.colorAttachments[0].blendingEnabled = true pipelineStateDescriptor.sampleCount = 4 pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperation.Add pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperation.Add pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactor.SourceAlpha pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactor.SourceAlpha pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactor.OneMinusSourceAlpha pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactor.OneMinusSourceAlpha let sampleDesc = MTLTextureDescriptor() sampleDesc.textureType = MTLTextureType.Type2DMultisample sampleDesc.width = inTexture.width sampleDesc.height = inTexture.height sampleDesc.sampleCount = 4 sampleDesc.pixelFormat = .RGBA8Unorm sampleDesc.storageMode = .Private sampleDesc.usage = .RenderTarget let sampletex = device.device.newTextureWithDescriptor(sampleDesc) let renderPassDescriptor = MTLRenderPassDescriptor() renderPassDescriptor.colorAttachments[0].texture = sampletex renderPassDescriptor.colorAttachments[0].resolveTexture = outTexture renderPassDescriptor.colorAttachments[0].loadAction = .Clear renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0) renderPassDescriptor.colorAttachments[0].storeAction = .MultisampleResolve let renderCB = commandQueue.commandBuffer() let renderCommandEncoder = renderCB.renderCommandEncoderWithDescriptor(renderPassDescriptor) let pipelineState = try! device.device.newRenderPipelineStateWithDescriptor(pipelineStateDescriptor) renderCommandEncoder.setRenderPipelineState(pipelineState) let vertexBuf = device.device.newBufferWithLength(triangles.count * 3 * sizeof(VertexT), options: .CPUCacheModeDefaultCache) var vBufPointer = [VertexT]() for i in 0..<triangles.count { // create buffer here } memcpy(vertexBuf.contents(), &vBufPointer, triangles.count * 3 * sizeof(VertexT)) renderCommandEncoder.setVertexBuffer(vertexBuf, offset: 0, atIndex: 0) renderCommandEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: triangles.count * 3) renderCommandEncoder.endEncoding() renderCB.commit() renderCB.waitUntilCompleted() 

你现在的形象是outTexturevariables。