Современный OPENGL не может изменять равномерное значение между вызовами glDrawArrays


EDIT: мне просто удалось решить эту проблему, переустановив PyOpenGL с pip. Та же программа теперь работает, как и ожидалось. Спасибо за ваши усилия.

Весь вопрос был переписан и уточнен.

Проблема не заключается в (хотя и странном) подходе к созданию текстур и связыванию, как это объясняется в комментариях.

Моя реальная проблема заключается в том, что однородные переменные в шейдерах не обновляют свои значения при изменении (да, изменено извне шейдера) между вызовами glDrawArrays(). Я проверил это, используя различные типы униформ, различные значения и проверяя их значения путем рендеринга в текстуру.

похоже, что значения униформы блокируются, как только вызывается glDrawArrays (). После этого я могу изменить их только тогда, когда буфер цвета будет очищен.

Я готов дать щедрую награду за любое рабочее решение. размещение любого исходного кода не является полезным в моем мнение, поскольку проблема, похоже, не лежит в коде.

Любые предложения принимаются.

1 4

1 ответ:

Вы можете обновить униформу между вызовами draw, вот как они должны использоваться.

Глядя на вставленный код, и, как указано в комментариях, строки 167..169 должно работать случайно для маленьких тексидов, но вы должны действительно изменить

glUniform1i(textureUnif, model.texId)
glActiveTexture(GL_TEXTURE0+model.texId)
glBindTexture(GL_TEXTURE_2D, model.texId)

К

glUniform1i(textureUnif, 0)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, model.texId)
Хотя, поскольку все, что вы используете, - это GL_TEXTURE0, вам действительно нужен только вызов glBindTexture() на каждой итерации цикла. Текстурная форма должна содержать текстурную единицу, шейдер не имеет понятия идентификатора текстуры в этом случае. дело.

Конечно, это OpenGL, ошибки часто трудно найти. Что вы на самом деле пытаетесь нарисовать? Скриншоты были бы полезны.

Вполне возможно, что что-то еще в состоянии OpenGL приводит к тому, что равномерное обновление не отображается на экране, например, тестирование глубины-это один общий виновник.