解决方法
好的,我自己意识到了.这段代码完成了这项工作,唯一的例外是它绘制了太大的三角形,但这是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()
您现在的图像是在outTexture变量中.