我正在尝试使用着色器语言为我的iOS 9+ / Sprite-Kit应用程序编写一些简单的片段着色器。但我已经停止尝试调用一个简单的函数。这是我使用Sprite-Kit中的SKShader对象绑定到Swift 2.2应用程序的着色器代码:
void main(void) {
gl_FragColor = getColor();
}
float getColor() {
return vec4(1.0, 1.0, 1.0, 1.0);
}
尝试编译时,出现以下错误:
2016-06-22 12:53:35.606 ShaderTestGLSL[8425:2478215] Jet: Error Domain=MTLLibraryErrorDomain Code=3 "Compilation failed:
program_source:8:12: error: use of undeclared identifier 'getColor'
return getColor();
^
program_source:12:7: warning: no previous prototype for function 'getColor'
float getColor() {
^
program_source:13:16: error: excess elements in scalar initializer
return vec4(1.0, 1.0, 1.0, 1.0);
^ ~~~~~~~~~~~~~~~~
" UserInfo={NSLocalizedDescription=Compilation failed:
program_source:8:12: error: use of undeclared identifier 'getColor'
return getColor();
^
program_source:12:7: warning: no previous prototype for function 'getColor'
float getColor() {
^
program_source:13:16: error: excess elements in scalar initializer
return vec4(1.0, 1.0, 1.0, 1.0);
^ ~~~~~~~~~~~~~~~~
}
2016-06-22 12:53:35.608 ShaderTestGLSL[8425:2478215] SKShader failed to compile:
Compilation failed:
program_source:8:12: error: use of undeclared identifier 'getColor'
return getColor();
^
program_source:12:7: warning: no previous prototype for function 'getColor'
float getColor() {
^
program_source:13:16: error: excess elements in scalar initializer
return vec4(1.0, 1.0, 1.0, 1.0);
^ ~~~~~~~~~~~~~~~~
2016-06-22 12:53:35.629 ShaderTestGLSL[8425:2478215] <SKMetalLayer: 0x154e749d0>: calling -display has no effect.
我的功能定义有什么问题?
答案 0 :(得分:3)
你有两个问题。
首先,就像在许多其他过程语言中一样,您必须在使用它之前声明一个函数。如果在getColor
中调用main
,则尚未声明。通过在文件中移动getColor
main
以上的定义,可以轻松解决此问题。
其次,getColor
会返回float
,但是,return
语句会尝试返回vec4
。根据您示例中的用法,我假设您只想将getColor
函数的返回类型更改为vec4
。
您的固定示例如下所示:
vec4 getColor() {
return vec4(1.0, 1.0, 1.0, 1.0);
}
void main(void) {
gl_FragColor = getColor();
}