func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
print("current drawable size:\(view.drawableSize)")
}
func draw(in view: MTKView) {
guard let drawable = view.currentDrawable else { return }
let textureDescriptor = MTLTextureDescriptor()
textureDescriptor.textureType = MTLTextureType.type2D
textureDescriptor.width = drawable.texture.width
textureDescriptor.height = drawable.texture.height
textureDescriptor.pixelFormat = .bgra8Unorm
textureDescriptor.storageMode = .shared
textureDescriptor.usage = .renderTarget
let sampleTexture = device.makeTexture(descriptor: textureDescriptor)
let renderPass = MTLRenderPassDescriptor()
renderPass.colorAttachments[0].texture = sampleTexture
renderPass.colorAttachments[0].loadAction = .clear
renderPass.colorAttachments[0].clearColor =
MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
renderPass.colorAttachments[0].storeAction = .store
let commandBuffer = commandQueue.makeCommandBuffer()
var commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPass)
let deltaTime = 1 / Float(view.preferredFramesPerSecond)
for scene in scenes{
scene.render(commandEncoder: commandEncoder!, deltaTime: deltaTime)
}
commandEncoder?.endEncoding()
let descriptor = view.currentRenderPassDescriptor
commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor!)
for canvasScene in canvasScenes{
canvasScene.updateCanvas(texture: sampleTexture!)
canvasScene.render(commandEncoder: commandEncoder!, deltaTime: deltaTime)
}
commandEncoder?.endEncoding()
commandBuffer?.present(drawable)
commandBuffer?.commit()
}
Я новичок в рендеринге вне экрана. Надеюсь, я делаю это правильно. может кто подскажет правильно это или нет. Сначала я рисую его в образце текстуры, а затем устанавливаю образец текстуры на четырехугольник (плоскость), который рисуется в текущем чертеже. Это оптимизированный способ рендеринга вне экрана.
Этот код запускается, когда я отключаю только проверку Metal API. в противном случае я получил следующую проблему
Fragment Function(fragment_shader_texture): Shader reads texture (texture[0]) whose usage (0x04) doesn't specify MTLTextureUsageShaderRead (0x01)
Предложения по оптимизации
usage
внеэкранной текстуры на.renderTarget
, вы должны использовать[.renderTarget, .shaderRead]
. - person warrenm   schedule 25.07.2018