0

我创建了一个 GLKViewController 的子类来使用 GLKBaseEffect 渲染一些波形,这一切都很好。

我想使用我自己的顶点和片段着色器,所以我使用了默认 OpenGL 游戏项目中的样板代码。两个着色器都可以编译、链接并且可用。我可以毫无问题地更改顶点着色器中的颜色。

我遇到的问题是将我自己的制服传递到片段着色器中。我可以将它传递给顶点着色器并在那里使用它,但是当我在

代码:

// 顶点着色器

attribute vec4 position;
uniform float amplitudeMax;

void main() {
    gl_Position = position + amplitudeMax; // This works and offsets the drawing
}

// 片段着色器

uniform float amplitudeMax; // Fails to compile
//uniform float amplitudeMax; // Compiles fine

void main()
{
    gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}

如果好奇,这里是我设置制服和着色器的方法

func loadShaders() -> Bool {

    // Copied from default OpenGL Game project

    // link program ...

    uniforms[UNIFORM_AMPLITUDE_MAX] = glGetUniformLocation(program, "amplitudeMax")

    // release shaders ...

}

// The draw loop
func render() {

    configureShaders()

    // ... draw
}

func configureShaders() {

    glUseProgram(program)

    let max = AudioManager.sharedInstance.bufferManager.currentPower)
    glUniform1f(uniforms[UNIFORM_AMPLITUDE_MAX], max)

}

我有另一个想法,即使用可变浮点将值从顶点着色器传递到片段着色器。同样,我可以在顶点着色器中声明和使用该变量,但在片段着色器中声明它会导致编译失败。

编辑: - - - - - - - - - - - - - - - - - - - - - - - - --

通过反复试验,我发现如果(在我的片段着色器中)以精确的方式限定我的统一声明,它适用于统一和可变(可以从顶点传递到着色器)。

uniform lowp float amplitudeMax;

void main() {
    gl_FragColor = vec4(amplitudeMax, 0.0, 1.0, 1.0);
}
4

0 回答 0