gpt4 book ai didi

objective-c - MacOS Metal 应用程序在 Obj-C 中工作,无法在 Swift 翻译中绘制

转载 作者:行者123 更新时间:2023-12-04 10:03:00 25 4
gpt4 key购买 nike

我找到了一个 working example macOS 的 Metal 应用程序,用 Objective-C 编写。它展示了如何使用多个 GPU,并且还绘制了一些漂亮的东西。我已经把它缩减了很多,以获得我所能得到的最小的例子。它是 here ,就像我的(尝试)translation to Swift .

虽然代码有点复杂,但我认为问题出在一个相当包含的地方:绘制到 View /窗口/屏幕或其他什么。除了抽奖本身之外,一切似乎都运行良好。我猜任何对 View /窗口/等工作方式有一些直觉的人都可以查看它五秒钟并知道出了什么问题。一个人总是可以抱有最好的希望。

我已经一遍又一遍地编写代码,并且根据我能够找到的文档尝试了无数排列,但是当涉及到 View 和那些东西时,我什至不知道要问什么问题。 GPU 帧捕获在我精简的 Obj-C 版本上显示了完美的图像,但在我的 Swift 版本上显示为纯黑色,我找不到任何原因。向观看友好的人们发出呼吁,欢呼

最佳答案

事实证明,您在 View 绘制方面没有任何问题,而是在使用 UnsafeMutablePointer 时遇到了一些问题。 .

FoilRenderer.updateState ,你有这个:

var u = uniforms.assumingMemoryBound(to: FoilUniforms.self).pointee

u.pointSize = FoilRenderer.bodyPointSize
u.mvpMatrix = projectionMatrix

FoilUniforms是值类型, pointee属性将值的副本存储到 u .所以当你改变 upointSizemvpMatrix ,您实际上并没有更改 uniforms 中的内存就像你认为的那样。要解决此问题,请将值分配回 pointee :

var u = uniforms.assumingMemoryBound(to: FoilUniforms.self).pointee

u.pointSize = FoilRenderer.bodyPointSize
u.mvpMatrix = projectionMatrix

uniforms.assumingMemoryBound(to: FoilUniforms.self).pointee = u

在这种情况下,因为我们同时设置了 pointSizemvpMatrix ( FoilUniforms 结构的唯一两个属性),这可以简化为以下内容:

let u = FoilUniforms(mvpMatrix: projectionMatrix,
pointSize: FoilRenderer.bodyPointSize)
uniforms.assumingMemoryBound(to: FoilUniforms.self).pointee = u

同样,您需要更新 FoilSimulation 中的一些地方。出于同样的原因:

改变:

var c = c_.assumingMemoryBound(to: FoilSimParams.self).pointee
c.timestep = config.simInterval
c.damping = config.damping
c.softeningSqr = config.softeningSqr
c.numBodies = UInt32(config.numBodies)

到:

let c = FoilSimParams(timestep: config.simInterval,
damping: config.damping,
softeningSqr: config.softeningSqr,
numBodies: UInt32(config.numBodies))

c_.assumingMemoryBound(to: FoilSimParams.self).pointee = c

并改变:

var p = positions[i]
p.x = position.x; p.y = position.x; p.z = position.z
p.w = 1

到:

var p = positions[i]
p.x = position.x; p.y = position.y; p.z = position.z
p.w = 1

positions[i] = p

(注意这里还有另一个不相关的错误,你有 p.y = position.x——确保把它改成 p.y = position.y 否则你会得到一些看起来很奇怪的模拟!)

最后,更改:

var v = velocities[i]
v.x = velocity.x * vscale
v.y = velocity.y * vscale
v.z = velocity.z * vscale

到:

var v = velocities[i]
v.x = velocity.x * vscale
v.y = velocity.y * vscale
v.z = velocity.z * vscale

velocities[i] = v

仅进行这些更改后,我就能够正确呈现它:

Foil renderer working

关于objective-c - MacOS Metal 应用程序在 Obj-C 中工作,无法在 Swift 翻译中绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61742070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com