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/