«Невозможно загрузить модуль« металл »как« Металл »» - PullRequest
0 голосов
/ 23 октября 2019

Я изучаю урок - https://www.raywenderlich.com/7475-metal-tutorial-getting-started - чтобы научиться пользоваться металлом. Я сделал именно то, о чем говорилось в учебнике, и до того, как я попытаюсь его собрать, не появляется никаких ошибок, затем он говорит, что сборка не удалась, наряду с ошибкой - невозможно загрузить модуль 'metal' как 'Metal'. Я не могу найти ответ где-нибудь еще, так может кто-нибудь помочь мне это исправить? Я новичок в кодировании, и я ожидаю, что это будет иметь простое решение.

Редактировать: Так что я только что обнаружил, что действительно было очень простое решение. Я не загружал материалы для учебника. Но теперь, когда у меня есть, появилась другая ошибка: Use of unresolved identifier 'vertexBuffer'

Вот весь мой код, просто чтобы разрешить любую путаницу -

viewControllerer.swift -

import Metal
var device: MTLDevice!
var metalLayer: CAMetalLayer!
var pipelineState: MTLRenderPipelineState!
var commandQueue: MTLCommandQueue!
var timer: CADisplayLink!


class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
      metalLayer = CAMetalLayer()          // 1
      metalLayer.device = device           // 2
      metalLayer.pixelFormat = .bgra8Unorm // 3
      metalLayer.framebufferOnly = true    // 4
      metalLayer.frame = view.layer.frame  // 5
      view.layer.addSublayer(metalLayer)   // 6

    let dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0]) // 1
    vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: []) // 2

    // 1
    let defaultLibrary = device.makeDefaultLibrary()!
    let fragmentProgram = defaultLibrary.makeFunction(name: "basic_fragment")
    let vertexProgram = defaultLibrary.makeFunction(name: "basic_vertex")

    // 2
    let pipelineStateDescriptor = MTLRenderPipelineDescriptor()
    pipelineStateDescriptor.vertexFunction = vertexProgram
    pipelineStateDescriptor.fragmentFunction = fragmentProgram
    pipelineStateDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm

    // 3
    pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineStateDescriptor)


    device = MTLCreateSystemDefaultDevice()
    commandQueue = device.makeCommandQueue()

    timer = CADisplayLink(target: self, selector: #selector(gameloop))
    timer.add(to: RunLoop.main, forMode: .default)
  }
  let vertexData: [Float] = [
     0.0,  1.0, 0.0,
    -1.0, -1.0, 0.0,
     1.0, -1.0, 0.0
  ]

  func render() {
    guard let drawable = metalLayer?.nextDrawable() else { return }
    let renderPassDescriptor = MTLRenderPassDescriptor()
    renderPassDescriptor.colorAttachments[0].texture = drawable.texture
    renderPassDescriptor.colorAttachments[0].loadAction = .clear
    renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(
      red: 0.0,
      green: 104.0/255.0,
      blue: 55.0/255.0,
      alpha: 1.0)

    let commandBuffer = commandQueue.makeCommandBuffer()!
    let renderEncoder = commandBuffer
      .makeRenderCommandEncoder(descriptor: renderPassDescriptor)!
    renderEncoder.setRenderPipelineState(pipelineState)
    renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
    renderEncoder
      .drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1)
    renderEncoder.endEncoding()
    commandBuffer.present(drawable)
    commandBuffer.commit()
  }

  @objc func gameloop() {
    autoreleasepool {
      self.render()
    }
  }
}

Shaders.metal

#include <metal_stdlib>
using namespace metal;

vertex float4 basic_vertex(                           // 1
  const device packed_float3* vertex_array [[ buffer(0) ]], // 2
  unsigned int vid [[ vertex_id ]]) {                 // 3
  return float4(vertex_array[vid], 1.0);              // 4
}

fragment half4 basic_fragment() { // 1
  return half4(1.0);              // 2
}

Примечание - Shaders.metal - это файл, который, как говорится в учебном пособии для создания

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Компилятор обнаружил имя, похожее на Metal, которое metal. Иногда библиотеки меняют имя в своих разных версиях, поэтому оно может отличаться от учебника, который вы читаете.

попробуйте сделать так, как предлагает ошибка, и замените импорт на: import metal

1 голос
/ 23 октября 2019

Вам необходимо импортировать Metal каркас, как указано ниже (упоминается в разделе Создание MTLDevice ),

import Metal

В настоящее время вы делаете, как показано ниже, что не так,

import metal
...