Я программирую милую маленькую игру, в которой используется генерируемый шейдером симплексный шум для отображения на лету вычисленной случайной местности.
Я использую Objective-C и Xcode 4, и у меня есть все, что нужно для хорошей работы, используя подкласс NSOpenGLView. Подкласс сначала компилирует шейдер, а затем визуализирует квад с текстурой шума. Программа без проблем запускает его на приемлемой скорости (60 Гц).
Подкласс NSOpenGLView
использует NSRunLoop
для запуска селектора, который в свою очередь вызывает drawRect:(NSRect)dirtyRect
. Это делается каждый кадр.
Теперь я хочу, чтобы шейдер использовал униформу, которая обновляется в каждом кадре.
Шейдер должен иметь возможность реагировать на переменные изменения, которые могут происходить в каждом кадре, поэтому я пытаюсь обновить форму на этой частоте. Обновление униформы выполняется в функции drawRect: (NSRect) dirtyRect.
Я частично успешен. Экран обновляется точно так, как я хотел бы для первых 30 кадров, затем он перестает обновлять униформу, даже если у меня есть вызовы glUniform1f () и NSLog прямо рядом друг с другом, и NSLog всегда срабатывает ..!
Странная часть заключается в том, что если нажата клавиша удержания (или любая другая клавиша в этом отношении), униформа обновляется в порядке.
Очевидно, что я что-то здесь упускаю в отношении того, как OSX или OpenGL или что-то еще обрабатывает униформу.
Объяснение того, что может быть больным, было бы полезно, но указателя на то, где я могу найти информацию об этом, будет достаточно.
Обновление: После возни с glGetError()
и glGetUniform*()
Я заметил, что программа работает, как и предполагалось, если оставить ее в покое. Однако, когда я использую трекпад для ввода, униформа сбрасывается на 0,000, в то время как остальная часть программы не показывает ошибок.