2016-04-21 8 views
5

Come si renderizzano le primitive su una trama fuori dallo schermo, non direttamente sullo schermo?Disegno fuori schermo in metallo con multicampionamento

Ho una serie di triangoli e il colore corrispondente, voglio solo disegnarli nello stesso modo in cui lo faccio per lo schermo, ma in una trama fuori schermo, che posso salvare in un file.

Qualcuno può mostrarmi un esempio di codice?

+1

Cosa hai provato? In Metal, tutto il rendering viene eseguito su una texture; l'unica differenza è se stai disegnando su una texture avvolta in un drawable che viene poi presentato allo schermo o su una trama che gestisci per te stesso. Se si desidera disegnare su quest'ultimo, è sufficiente creare un 'MTLTexture' della dimensione e del formato appropriati e impostarlo come trama del primo allegato colore del descrittore del rendering. Quindi, puoi utilizzare l'API 'getBytes' per ottenere i dati dell'immagine e scriverli. – warrenm

+0

guarda il mio codice, ho aggiornato la domanda – s1ddok

+0

Credo che il mio problema è che le mie coordinate sono sbagliate, forse dovrei impostare viewport o forse proiezione personalizzata ... – s1ddok

risposta

4

Ok, l'ho capito anch'io. Questo codice fa il lavoro, con l'eccezione che richiama troppi triangoli, ma questo è un argomento diverso per la funzione Vertex.

Ecco il mio codice:

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() 

immagine Ora è in outTexture variabile.

+1

Ho lo stesso problema oggi, ma ho ancora problemi strani. Penso che la risoluzione del mio problema sia l'uso di .MultisampleResolve, ma quali sono le impostazioni per il descrittore di outTexture? –

Problemi correlati