glUniform. Фрагментный шейдер не компилируется с единообразным или изменяющимся сравнением
Я создал подкласс 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);
}