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

Cap*_*Fim 4 ios scenekit xcode7

SCNShadable参考指出,在阴影修饰SceneKit可以包含自定义的全局函数。但是,由于Xcode 7对此选项的更新似乎不再起作用。甚至参考页面上的Apple示例也不再编译。根据错误消息,生成的OpenGL着色器源代码(由生成的着色器源代码)完全不存在自定义功能SceneKit。有谁知道如何解决这个新限制(或错误?)?也许需要额外的编译指示?

SCNShadable参考上的“编写着色器修改器片段”下给出的第一个示例中可以看到该问题。要查看该错误,只需创建一个新的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]
  }
Run Code Online (Sandbox Code Playgroud)

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

SceneKit: error, failed to link program: ERROR: 0:191: Invalid call of undeclared identifier 'sincos'
Run Code Online (Sandbox Code Playgroud)

在错误消息中,您还可以看到SceneKit为阴影修改器生成的程序。它包含所有内容,但其定义sincos已被滤除。

Toy*_*yos 5

您不应该将“ #pragma arguments”用于以GLSL编写的着色器修改器(SCNShadable.h标头中的文档指定仅用于金属着色器)。所以这将工作:

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;
Run Code Online (Sandbox Code Playgroud)