簡體   English   中英

同時使用Metal和SceneKit的問題

[英]Problems using Metal and SceneKit simultaneously

我正在一個小型的SceneKit項目上,我想使用Metal Compute管道以編程方式生成我的紋理以提高速度。 我已經建立了生成MTLTexture的基本管道,並且可以正常工作,但是一旦我將SceneKit框架添加到項目中,它就無法聲明Function <X> was not found in the library 如果刪除所有對SceneKit的引用,它將再次起作用。

我必須從正確的URL實例化我的庫,否則如果沒有SceneKit,它將無法正常工作。 是什么阻礙了它? 是否有辦法解決此問題,也許使用SCNRenderer?

[編輯]為了更加清楚,這是我如何獲得對MTLLibrary的引用:

    guard let url = Bundle.main.url(forResource: "MyLibrary", withExtension: "metallib") else {
        throw GeneratorError.metalLibraryNotFound
    }
    library = device.makeLibrary(URL: url)

強引用由調用對象(以及MTLDeviceMTLDevice ,並且是單例,因此保留在內存中。 為了獲得內核函數本身,我然后調用以下函數,該函數返回適當的管道狀態:

    guard let function = library.makeFunction(name: functionName) else {
        throw GeneratorError.functionNotFound(functionName)
    }
    return device.makeComputePipelineState(function: function)

就像我說的那樣,在將SceneKit添加到項目中之前,此方法可以正常工作-只需將框架添加到鏈接的框架列表中就足夠了,我無需對其進行任何操作-因此它根本找不到我的任何功能。

我已經找到了造成此問題的原因,但是對於原因我仍然很困惑,因此,我感謝任何其他人提供的信息!

實質上,我已經將我的Metal庫拆分成幾個文件,以使其更易於使用。 其中一個具有CIFilter支持的功能,另一個具有Metal管道內核。 現在,我知道當兩者都鏈接到主.metal文件中時,兩者是不兼容的,因此我暫時將其中一個注釋掉,但保留以供參考。 在構建設置中,我還具有鏈接器標志-cikernel

我懷疑鏈接器標志可能會引起問題,但是刪除它會使情況變得更糟。 最終,我嘗試刪除鏈接器標志以及之前僅被注釋掉的整個文件。 這工作了! 我猜編譯器必須編譯所有.metal文件,而不管它們是否包含在主文件中,並且以某種方式在同一庫中包含CIFilter內核和紋理化內核是很大的禁忌,即使它們不在同一命名空間中也是如此。

如果有人知道其背后的原因,我很想知道! 同時,我只是要刪除所有CIFilter,而是使用基於純Metal的計算管道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM