2015-10-05 55 views
4

SCNShadable Reference指出SceneKit中的某个遮罩修改器可能包含自定义全局函数。但是,自更新至Xcode 7后,此选项似乎不再适用。即使参考页面的Apple示例也不再编译。根据错误消息,自定义函数根本不存在于由SceneKit生成的OpenGL着色器源代码中。 有谁知道这个新的限制(或错误?)可以如何解决?也许需要额外的编译指示?SceneKit:Shademodifier忽略Xcode 7中的自定义全局函数

在“Writing a Shader Modifier Snippet”下的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的定义。

+0

也许显示您正在使用的代码和您提到的具体Apple示例。 –

+0

谢谢,提示,@我将会。我已经编辑了我的问题。 –

+1

很少有人在野外使用SceneKit。 Apple内部似乎没有人使用它。因此你对样品的问题。基本测试没有完成,更不用说文档更新了。苹果公司及其员工对其内部的系统问题没有任何交流。这导致几乎没有人认真对待它。或许最好把苹果的游戏框架看作是一个慢慢发展的创意糖果,朝着一个未来的方向发展,这个糖果能够为苹果公司提供资金支持,并为他们选择游戏开发商,让他们慢慢成为游戏内容的制作者。 – Confused

回答

3

对于用GLSL编写的着色器修改器(SCNShadable.h头文件指定它仅适用于金属着色器),不应该使用“#pragma arguments”。 因此,这将工作:

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;