我创建了一个 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);
}