解决方法
好的,我自己意识到了.这段代码完成了这项工作,唯一的例外是它绘制了太大的三角形,但这是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变量中.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。