如何在GLSL for iOS中定义一个简单的函数?

时间:2016-06-22 10:54:54

标签: ios swift opengl-es glsl opengl-es-2.0

我正在尝试使用着色器语言为我的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.

我的功能定义有什么问题?

1 个答案:

答案 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();
}