如何在 GLSL 中为 iOS 定义一个简单的函数?
How to define a simple function in GLSL for iOS?
我正在尝试深入研究着色器语言,为我的 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.
我的函数定义有什么问题?
你有两个问题。
首先,就像在许多其他过程语言中一样,您必须在使用函数之前对其进行声明。在main
中调用getColor
的情况下,还没有声明。这可以通过将 getColor
的定义移动到文件中 main
的上方来轻松解决。
其次,getColor
returns a float
,但是,您的 return
语句试图 return a vec4
。根据您示例中的用法,我假设您只想将 getColor
函数的 return 类型更改为 vec4
.
您的固定示例如下所示:
vec4 getColor() {
return vec4(1.0, 1.0, 1.0, 1.0);
}
void main(void) {
gl_FragColor = getColor();
}
我正在尝试深入研究着色器语言,为我的 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.
我的函数定义有什么问题?
你有两个问题。
首先,就像在许多其他过程语言中一样,您必须在使用函数之前对其进行声明。在main
中调用getColor
的情况下,还没有声明。这可以通过将 getColor
的定义移动到文件中 main
的上方来轻松解决。
其次,getColor
returns a float
,但是,您的 return
语句试图 return a vec4
。根据您示例中的用法,我假设您只想将 getColor
函数的 return 类型更改为 vec4
.
您的固定示例如下所示:
vec4 getColor() {
return vec4(1.0, 1.0, 1.0, 1.0);
}
void main(void) {
gl_FragColor = getColor();
}