glUniform。片段着色器无法使用统一或不同的比较进行编译

时间:2016-09-01 22:01:43

标签: ios opengl-es glkit glkbaseeffect

我已经创建了一个GLKViewController的子类来使用GLKBaseEffect渲染一些波形,这些波形都可以正常工作。

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

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

中声明相同的变量时

代码:

//顶点着色器

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);
}

0 个答案:

没有答案