ios – 采用多次采样的金属离屏绘图

如何将基元渲染到屏幕外纹理,而不是直接进入屏幕?

我有一组三角形和相应的颜色,我只想绘制它们的方式与屏幕相同,但进入屏幕外纹理,我可以保存到文件中.

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

解决方法

好的,我自己意识到了.这段代码完成了这项工作,唯一的例外是它绘制了太大的三角形,但这是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变量中.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...