ios - SceneKit:Shademodifier 忽略 Xcode 7 中的自定义全局函数

标签 ios xcode7 scenekit

SCNShadable Reference声明 SceneKit 中的阴影修饰符可能包含自定义全局函数。但是,自从更新到 Xcode 7 后,此选项似乎不再有效。甚至引用页中的 Apple 示例也不再编译。根据错误消息,生成的 OpenGL 着色器源代码中根本没有自定义函数,它是由 SceneKit 生成的。 有谁知道如何解决这个新限制(或错误?)?也许需要额外的编译指示?

问题可以在 SCNShadable Reference 上给出的第一个例子中看出。在“编写着色器修改器片段”下。 要查看错误,只需创建一个新的 Xcode“游戏”项目并将以下代码粘贴到 GameViewController.viewDidLoad() 的末尾:

  let fragmentShader =
    "// 1. Custom variable declarations (optional)\n" +
    "// For Metal, a pragma directive and one custom variable on each line:\n" +
    "#pragma arguments\n" +
    "float intensity;\n" +
    "// For OpenGL, a separate uniform declaration for each custom variable\n" +
    "uniform float intensity;\n" +
    "\n" +
    "// 2. Custom global functions (optional)\n" +
    "vec2 sincos(float t) { return vec2(sin(t), cos(t)); }\n" +
    "\n" +
    "// 3. Pragma directives (optional)\n" +
    "#pragma transparent\n" +
    "#pragma body\n" +
    "\n" +
    "//  4. Code snippet\n" +
    "_geometry.position.xy = sincos(u_time);\n"
    "_geometry.position.z = intensity;\n"

  if let material = ship.childNodes.first?.geometry?.materials.first {
        material.shaderModifiers = [SCNShaderModifierEntryPointGeometry: fragmentShader]
  }

运行程序出现以下错误,指出自定义标识符 sincos 未定义:

SceneKit: error, failed to link program: ERROR: 0:191: Invalid call of undeclared identifier 'sincos'

在错误消息中,您还可以看到 SceneKit 为阴影修改器生成的程序。它包含除 sincos 定义以外的所有内容,后者已被以某种方式过滤掉。

最佳答案

您不应该对用 GLSL 编写的着色器修改器使用“#pragma arguments”(SCNShadable.h header 中的文档指定它仅适用于金属着色器)。 所以这会起作用:

uniform float intensity;

// Custom global functions (optional)
vec2 sincos(float t) { return vec2(sin(t), cos(t)); }

// Pragma directives (optional)
#pragma transparent
#pragma body

//  Code snippet
_geometry.position.xy = sincos(u_time);
_geometry.position.z = intensity;

关于ios - SceneKit:Shademodifier 忽略 Xcode 7 中的自定义全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32946356/

相关文章:

ios - Swift 3 - 具有一对多关系的核心数据保存

ios - 在 Swift 中填充多维数组

ios - 无法将类型 '[String]' 的值转换为预期的参数类型 'String' : while appending arrays to get data from Fireabse in table view cell

ios - 在 Xcode 7 中,我怎样才能拥有同名的静态库目标和框架目标?

swift - 如何使用 Swift 在 xCode 中将 textField 的字符串转换为 Double

ios - 在 Swift 2 iOS 中访问相机

ios - 在 xamarin 中调整单元格大小

ios - 使用触摸移动 SceneKit 中的节点

xcode - Godot 接管了 Xcode 中的 .scn 文件

swift - 如何使用 SCNNode 的外观(在 :up:localFront:)