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

0 ответов

Другие вопросы по тегам