用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X

2024-01-22

我正处于制作 SceneKit 着色器修改器(用于几何入口点)的早期阶段,该修改器根据高度图纹理置换平面的几何形状。计划是用它来创建地形。

在 iOS(编辑:iOS 模拟器)中,着色器按其应有的方式工作,但会将此警告打印到控制台:

SceneKit:错误,没有代码的修饰符无效

然而,当为 OS X 构建时,着色器会出现致命错误,并且地形几何图形仅显示为粉红色矩形。

这是几何着色器修改器:

uniform sampler2D displacementMap;
const float intensity = 7.5;

# pragma body

vec4 displace = texture2D(displacementMap, _geometry.texcoords[0]);

_geometry.position.z += displace.r * intensity;

这就是着色器与几何体的连接方式。terrainScene是高度图,它被放置在漫反射内容和自定义内容中displacementMap着色器修改器中的采样器值:

    //displacement shader

    let mat = SCNMaterial()
    mat.diffuse.contents = terrainScene

    var displacementShader: String?
    guard let path = NSBundle.mainBundle().pathForResource("DisplaceGeometry", ofType: "shader") else {return}

    do {
        displacementShader = try String(contentsOfFile: path,  encoding: NSUTF8StringEncoding)
    } catch {
        return
    }
    mat.shaderModifiers = [SCNShaderModifierEntryPointGeometry: displacementShader!]
    let noiseProperty = SCNMaterialProperty(contents: terrainScene!)
    mat.setValue(noiseProperty, forKey: "displacementMap")

    //geometry
    let plane = SCNPlane(width: 80, height: 80)
    plane.widthSegmentCount = 40
    plane.heightSegmentCount = 40
    plane.materials = [mat]

这是 OS X 错误消息的开头:

SceneKit: error, modifier without code is invalid
2016-06-11 10:58:32.054 EndlessTerrainOSX[16923:5292387] SceneKit: error, Invalid shader modifier : no code provided
2016-06-11 10:58:32.640 EndlessTerrainOSX[16923:5292387] FATAL ERROR : failed loading compiling shader:

以及错误的结束:

UserInfo={NSLocalizedDescription=Compilation failed: 
<program source>:343:8: error: global variables must have a constant address space qualifier
float4 displace = displacementMap.sample(displacementMapSampler, _geometry.texcoords[0]);
       ^
<program source>:343:19: error: use of undeclared identifier 'displacementMap'
float4 displace = displacementMap.sample(displacementMapSampler, _geometry.texcoords[0]);
                  ^
<program source>:343:42: error: use of undeclared identifier 'displacementMapSampler'
float4 displace = displacementMap.sample(displacementMapSampler, _geometry.texcoords[0]);
                                         ^
<program source>:344:1: error: unknown type name '_geometry'
_geometry.position.z += displace.r * intensity;
^
<program source>:344:10: error: cannot use dot operator on a type
_geometry.position.z += displace.r * intensity;
         ^
}
2016-06-11 10:58:32.646 EndlessTerrainOSX[16923:5292387] Shaders without a vertex function are not allowed

有谁知道为什么它在 iOS 上显示,但在 OS X 上失败?


我建议这可能不是 iOS 与 OSX 的问题,而是与使用 OpenGL 的一台设备和另一台 Metal 相关。

错误消息中的代码是 Metal,表明 SceneKit 已将您的代码从 GLSL 转换为 Metal。根据我的经验,这并不是 100% 有效。在您的情况下,最简单的解决方案可能是强制SCNView通过以下方式使用 OpenGL创建时传入选项 https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNView_Class/index.html#//apple_ref/occ/instm/SCNView/initWithFrame:options:。我相信 Interface Builder 中也有一个下拉菜单。

如果您希望继续使用 Metal,并且有理由这样做,请继续阅读。

当着色器修改器编译失败时,着色器的全部内容会转储到标准输出,这确实有助于调试过程。如果你向上滚动到第 343 行,你会发现 SceneKit 已经包含了float4 displace = displacementMap.sample(...); method before顶点着色器。在函数外部定义意味着它是一个全局变量,因此需要constant地址空间修饰符,但这根本不是您想要的...在这种情况下,从 GLSL 到 Metal 的转换并未按您的预期进行。

我注意到你错过了#pragma arguments指令,这应该包含在统一定义之上(请参阅“编写着色器修改器片段” https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNShadable_Protocol/),可能会有所帮助。根据我的经验,我认为将纹理传递到基于金属的着色器修改器会很困难。我尝试过,失败了,然后写了一个SCNProgram改为这样做。建议强制使用 OpenGL。

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

用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X 的相关文章

随机推荐

  • nuget 更新后样式变得混乱。

    我更新了默认 MVC 应用程序的多个 nuget 包 但我的页面样式弄乱了 看起来正在加载部分样式 但我无法找出问题所在 提前致谢 更新前我的导航栏 更新后我的导航栏 很遗憾听到这个消息 我也遇到了同样的问题 也花了我很多钱 太令人沮丧了
  • 帮我推理 F# 线程

    在闲逛一些 F 通过 MonoDevelop 时 我编写了一个例程 它用一个线程列出目录中的文件 let rec loop path string Array append path gt Directory GetFiles path g
  • getCacheFiles() 和 getLocalCacheFiles() 是否相同?

    As 获取本地缓存文件 http hadoop apache org docs r2 3 0 api org apache hadoop mapreduce JobContext html getLocalCacheFiles 已被弃用 我
  • 引导开关事件处理程序不工作

    我问了一个与此类似的问题here https stackoverflow com questions 22460608 bootstrap switch js being called but doing nothing但现在我坚持使用 B
  • 使用子进程来避免长时间运行的任务断开discord.py bot?

    我为我的 Discord 服务器创建了一个机器人 它会转到给定 subreddit 的 Reddit API 并根据您输入的 subreddit 在 Discord 聊天中发布当天的前 10 个结果 它忽略自己的帖子 实际上只发布图片和 G
  • Pandas 或 Numpy:如何获取匹配的数据条目来进行数据操作

    举例来说 我有两个这样的数据关系 Data1 C1 C2 Peter kiwi John banana Susan peach Joe apple Data2 C3 C4 apple 4 banana 7 apple 4 对于 data1
  • winmd 文件的版本 255.255.255.255 表示什么?

    我注意到大多数 全部 winmd文件的版本为255 255 255 255 like Windows 版本 255 255 255 255 文化 中性 PublicKeyToken null Metro 应用程序引用具有此版本号的此类程序集
  • Android Studio:Facebook 显示。(内容)无法正常工作

    我在 Android Studio 上使用 Facebook SDK 4 0 在我的应用程序中 我有一个按钮 应该使用设置的内容将图像共享到 Facebook Bitmap h BitmapFactory decodeResource ge
  • 同一行不同列的多个行值

    我有一个有 4 个字段的表Person id Store id startdate and enddate 对于特定值person id 可以有许多具有不同开始和结束日期的记录 这里我需要将多行值更新为同一行和不同列 示例1 Person
  • 从另一个窗体 Winforms 传递值[重复]

    这个问题在这里已经有答案了 网上所有传表单的教程都是从form1然后打开form2然后传值 我想要一些相反的东西 表单 1 和表单 2 已打开 因此如果您在表单 2 中单击 确定 则您在表单 2 中获得的值将传递到表单 1 中 前任 for
  • Rails4 ActionController::InvalidAuthenticityToken 错误

    我有 Rails4 应用程序在生产中运行 我的访问者偶尔会遇到 ActionController InvalidAuthenticityToken 错误 我无法重现该错误 我每天都会收到 2 4 条来自各种形式的通知 但背后没有明确的逻辑
  • MVVM 方式关闭文档并可取消

    我正在将 Avalondock 2 x 用于我的一个开源项目 如果文档在关闭时变脏 您应该能够取消关闭 我正在使用 Caliburn Micro 和 Coroutine 我能够解决这个问题的唯一方法是使用 C M 附加到事件
  • 使用 knit 有条件地在 RMarkdown 中包含子文档列表

    给定子文档列表 如何根据某些条件选择将哪些子文档插入到主文档中 在我的用例中 我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配 第二个数据集具有与每个条目关联的子文档 如果找到匹配项 我想包含其关联的子文档 以其最基本的形式 这
  • 字符串添加换行符,跨平台

    我正在我的应用程序中生成一些文本 由于文本是更大消息的一部分 有时我需要添加换行符 有时则不需要 NEWLINE n TODO how to define this cross platform Can I use os linesep d
  • SSRS 2008 报告中除以零/空的解决方法

    我有一个报告 其中一个字段的值为表达式 Fields TotalPrice Value Fields TotalSlots Value 尽管有时 TotalSlots 是空白的 因此我遇到了除以零的运行时错误 所以我把表达方式改成了这样 I
  • 如何为 RecyclerView 项目入口设置动画(滑入)?

    基本上我想要类似的东西这个 第 30 秒处 https www youtube com watch v Q8TXgCzxEnw t 30 我希望活动开始后我的物品能够按顺序滑入 我尝试过谷歌搜索 我没有发现任何我能理解的东西 我仍在为 An
  • PECL 安装失败

    从 PHP5 2 6 升级到 php 5 3 后 看起来 我还必须重新安装 PHP memcache module 所以我下载了最新版本的memcache 3 0 6 并遵循此文档 http www php net manual en in
  • 如何使用 python 解析嵌套的 XML 标签?

    如果我使用了错误的术语 请原谅 但这就是我想要完成的任务 我正在尝试从嵌套标签中提取属性和文本信息 例如别名 付款 金额等 但是我的示例代码块只能从 中的子元素中提取信息 而不能从 如何使用 elementtree 尝试获取子元素的子元素
  • 如何从 Backbone Marionette 中的项目视图实例访问复合视图

    基本情况是这样的 我有一个复合视图和一个项目视图 我构建了 Composite 视图 传递给它一个模型和一个集合 模型数据用于填充复合视图的模板 集合数据用于填充复合视图的项目视图 我想要做的是 在项目视图的模板助手中 我想访问复合视图的模
  • 用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X

    我正处于制作 SceneKit 着色器修改器 用于几何入口点 的早期阶段 该修改器根据高度图纹理置换平面的几何形状 计划是用它来创建地形 在 iOS 编辑 iOS 模拟器 中 着色器按其应有的方式工作 但会将此警告打印到控制台 SceneK