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