如何在 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();
}