在 SceneKit 中使用 Metal 着色器

2024-01-20

我想用一个Metal着色器将卡通/单元着色应用于场景中使用的材质。我试图实现的着色器是苹果自己的AAPLCelShader发现于金属着色器展示柜 https://developer.apple.com/library/ios/samplecode/MetalShaderShowcase/Introduction/Intro.html。我对实现着色器有点陌生SceneKit所以我可能做的每件事都完全错误。

根据我在文档中的理解Metal或者可以使用GL着色器来修改SceneKit从 iOS 9 和 Xcode 7 开始渲染。文档表明这与 GL 着色器的方式相同。

我的方法是尝试获取路径.metal文件,然后将其加载到要在中使用的字符串中SCNMaterial shaderModifiers属性以 [String: String] 字典的形式,就像使用 GL 着色器一样(尽管我还没有让它正常工作)。

我的代码是:

var shaders = [String: String]()
let path = NSBundle.mainBundle().pathForResource("AAPLCelShader", ofType: "metal")!

do{
  let celShader = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
  shaders[SCNShaderModifierEntryPointLightingModel] = celShader
}catch let error as NSError{
  error.description
}
scene.rootNode.enumerateChildNodesUsingBlock({ (node, stop) -> Void in
  node.geometry?.firstMaterial?.shaderModifiers = shaders
})

这是在一个测试场景上运行的,其中包含一个盒子几何体,该几何体是从.scn文件。文件加载工作正常,所以这不是问题。

该错误来自我尝试查找路径的第二行,它给了我“在展开可选值时发现零”,这是强制展开所预期的,除了它尝试加载的文件是最重要的事实之外。当然在捆绑包中,相同的代码可以很好地处理其他文件类型,只是不能.metal ones.

我的处理方式完全错误吗?我不明白为什么它不会访问该文件,除了我滥用金属文件的问题。

是否有更简单或更好的方法来实现单元格阴影并最终在边缘上实现粗体轮廓?


AAPLCelShader.metal是一个完整的顶点/rastex http://catterwaul.com/veracity-in-gpu-function-terminology//fragment 实现,这与 ShaderModifiers 不同:将被注入到已经完成的着色器中的源代码。

相反,您可以创建一个科学网络计划 https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNProgram_Class/index.html#//apple_ref/occ/cl/SCNProgram,使用 AAPLCelShader.metal 中的顶点和片段函数。与 GLSL 相比,Metal 的优点在于您可以使用金属功能名称 https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNProgram_Class/index.html#//apple_ref/doc/uid/TP40012011-CLSCHSCNProgram-DontLinkElementID_15,而不是源代码字符串,后者更容易使用,并且会导致函数在运行时之前编译,这是 GLSL 不支持的。 (这仍然没有达到应有的效果,Swift 会将 Metal 函数识别为正确类型、可重构、命名空间闭包。)当然,虽然 GLSL SCNPrograms 将转换为 Metal,但对于兼容的硬件,Metal SCNPrograms 不会被翻译为过时的设备。

至于从 SceneKit 到 rastex 的映射(命名不正确)颜色输入输出) 成员:

float4 position [[position]];
float shine;
float3 normal_cameraspace;
float3 eye_direction_cameraspace;
float3 light_direction_cameraspace;

……不幸的是,我还没有给你答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SceneKit 中使用 Metal 着色器 的相关文章

  • 如何覆盖应用程序中的内部框架方法(框架外部)

    在 Swift 中子类化时是否有重写内部框架方法 前任 超类 public class BarChartRenderer ChartDataRendererBase internal func drawDataSet context con
  • Swift 错误:无法从 AST 上下文获取模块“My_App”

    我正在使用 Swift 3 Xcode 8 1 CocoaPods 1 1 1 运行后pod update 每次我尝试使用 Xcode 的 lldb 控制台时 它都会打印错误 例如 po self输出 共享 Swift 状态My App已出
  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • 如何使用 PKAddPassButton 创建“添加到苹果钱包”按钮以进行本地化通行证

    在我的 iOS 项目中 我有一个屏幕 允许用户创建苹果通行证并将其添加到钱包中 Apple 建议使用 PKAddPassButton 创建 添加到苹果钱包 按钮 当我尝试使用以下代码创建苹果通行证时 let passButton PKAdd
  • 如何让应用更新以吸引人的屏幕形式提供给用户? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我最近在使用 Make My Trip 应用程序 我发现每当我启动应用程序时都会出现一个非常有吸引力的应用程序更新弹出屏幕 它说要更新应用程
  • 领域数据库对象看起来是空的,但实际上不是

    我在用Realm https realm io对于一个小而简单的项目 我正在使用最新版本的框架 昨天从 Github 编译 和当前 AppStore 版本的 Xcode with Swift 2 1 我正在通过 segue 将 Realm
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 使用 SceneKit 实现 ARKit 广告牌效果

    我希望添加与此应用程序类似的广告牌效果 https twitter com marpi status 897130955105644544 https twitter com marpi status 897130955105644544
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • 如何无限地每1分钟运行一个iOS应用程序?

    我制作了一个应用程序 需要每 1 分钟向服务器发送一次位置和状态更新 我尝试了以下方法 但没有一个能帮助我 有什么解决办法吗 1 NSTimer 很多人建议这样做 但问题出在后台模式上 它只能工作 20 分钟 该应用程序停止发送数据后 2
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • AVPlayer 不播放音频 - iOS 9,目标 - C

    我正在尝试从我的应用程序中的 URL 播放音频 iOS 8 中一切都按预期发生 模拟器和物理设备 对于 iOS 9 它可以在模拟器中运行 但在设备上 音频根本无法播放 出现流媒体 如果我单击播放 进度条还显示音频正在加载并播放 但没有声音
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al

随机推荐

  • 为什么我的 Azure 存储帐户上的队列域丢失?

    我已使用以下设置在 Azure 上成功创建存储帐户 部署 资源管理器 类型 通用 标准 复制 ZRS 在 Azure 门户上 我可以看到 Blob 服务 如果单击它 我可以在 blob 域下创建 blob 容器 https 帐户名称 blo
  • Javascript字典性能问题

    现在我有以下 javascript 字典 var a a SVG343 1942 a UAL534 2153 右边的数字代表时间 键是唯一的 ID 我想让 id 成为键 因为它们是唯一的 我的问题是给出一个时间找到对应的id 我要如何做到这
  • 将外部域名连接到AWS S3网站

    我想在 Amazon S3 上托管一个静态网站 创建了相关的存储桶 测试它们正常 现在我已经在 EuroDNS 注册了一个域名 www gopropel io 我找不到如何将其连接到我的 AWS S3 存储桶 我需要创建路由 53 托管区域
  • Flutter Firebase Messaging 无法创建服务 io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

    我正在尝试在 Flutter 应用程序中使用 Firebase Messaging 我遵循包装上的所有说明 在我的 pubspec yaml 中 我有这些包 dependencies flutter sdk flutter firebase
  • 当元素的父元素溢出时,使元素宽度拉伸以适合其子元素:auto;

    在这个简化的示例中 我有一个书柜 书架上放着书籍 书架是具有定义宽度的最外面的元素 书架上的书应该从左到右排列 没有包装 书架应该拉伸其宽度以显示书架上的所有书籍 所有书架的宽度必须相同 即最宽书架的宽度 My HTML div class
  • 保护 Raven 数据库的安全

    我正在尝试将 RavenDB 的访问权限限制为只有一名用户 更改设置以保护数据库后 我仍然可以访问 RavenDB 管理工作室 但我不确定为什么 我将 RavenDB 作为 Windows 服务运行 并且使用构建 573 这是我的 Rave
  • 如何向 Skype 聊天室发出 Jenkins 构建状态警报?

    我们公司使用 Skype 进行通信 我希望能够在 Jenkins 构建失败 以及恢复时 时向 Skype 聊天室发送警报 我怎样才能做到这一点 我已经使用了Skype 公共 API http developer skype com acce
  • C++ 和 Java 之间的低延迟 IPC

    对于以下情况 实现 C Java IPC 的最佳方法是什么 最近有人问类似的问题 https stackoverflow com questions 5900887 ipc between java and c applications 但
  • 将非数组变量的地址传递给声明为“Type ptr[static 1]”的函数参数是否有效?

    如上所述here https stackoverflow com questions 3430315 what is the purpose of static keyword in array parameter of function
  • ESLint 显示括号中的错误

    我的 javascript 代码工作正常 除了 ESLint 显示我有错误 例如 错误 myFunction 已定义但从未使用 no unused vars and 错误 文档 未定义 no undef 这只是一个问题 因为我使用的是外部
  • 如何设置单个单元格而不是事件的背景颜色?

    我不想为圣诞节和复活节等创建事件 而是希望能够为受影响的日期单元格着色 甚至可能为每个事件提供灰色半透明文本 在 FullCalendar 中有什么简单的方法可以做到这一点吗 EDIT 有人向我指出 fc state highlight 用
  • Mysql从管道导入

    我试图弄清楚如何将输出通过管道传输到 mysqlimport 中 但没有任何运气 我有一个巨大的文件 250 GB 我想在处理它后通过管道传输到 mysqlimport 我不想创建中间文件 表 我正在想象这样的事情 猫基因组 mpileup
  • C# 和 Visual Studio 2005 中的程序集之间的循环引用

    我正在努力标准化所有应用程序的分层 多层设计的单一方式 我正在尝试将我的所有应用程序设为 5 层 Code 用户界面 业务对象 或映射器 数据访问 关系型数据库管理系统 假设我正在开发一个具有用户登录 注销功能的应用程序 我正在 VS200
  • Pandas:根据特定列的值计数选择行

    从 panda 数据框中选择所有行的最简单方法是什么 谁的 sym 在整个表中恰好出现两次 例如 在下表中 我想选择 b e 中包含 sym 的所有行 因为这些符号的 value counts 等于 2 df pd DataFrame sy
  • 在 python 中执行 bash 脚本

    我创建了一个 Expect 脚本 执行时 它会通过 ssh 连接到服务器并执行一系列命令 伪代码如下所示 usr bin expect spawn ssh usr myip expect password send mypassword n
  • Web Workers 是沙箱不受信任的 JavaScript 代码的安全方法吗

    我想知道网络工作者是否可以安全地沙箱不受信任的 JavaScript 代码 举例来说 在绘图应用程序的上下文中 开发人员可以实现新的绘图工具 您可以将他们的代码放入 webworker 中 并且每当用户单击画布时 向他们发送一条包含光标位置
  • Python argparse:列出用法中的各个选择

    我有一个需要多个参数的程序 例如 breakfast py customer vikings eggs sausage bacon 其中 鸡蛋 香肠 和 培根 可以从特定选项列表中指定 现在我喜欢的输出breakfast py help看起
  • Azure Cosmos DB 多模型意味着什么?

    看着新的 Azure cosmos 数据库 我对它的多模型性质有点困惑 具体来说 是不是意味着 a 可以同时以多种方式查询相同的底层数据库 存储 以便我可以针对相同的集合使用 gremlin 图形查询和 mongodb api or b 这
  • 网页到印刷媒体——解决方案?

    我一直是 MediaWiki 和类似的基于 wiki 的文本编辑器的忠实粉丝 我喜欢快速添加文本 协作和共享的功能 然而 仍然需要格式良好的打印输出 像页眉和页脚 表达我想要它们表达的内容 分页符 页边距等 我见过的大多数解决方案都涉及到某
  • 在 SceneKit 中使用 Metal 着色器

    我想用一个Metal着色器将卡通 单元着色应用于场景中使用的材质 我试图实现的着色器是苹果自己的AAPLCelShader发现于金属着色器展示柜 https developer apple com library ios samplecod