OpenGL обновляет униформу на Mac OSX - PullRequest
1 голос
/ 07 сентября 2011

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

Я использую Objective-C и Xcode 4, и у меня есть все, что нужно для хорошей работы, используя подкласс NSOpenGLView. Подкласс сначала компилирует шейдер, а затем визуализирует квад с текстурой шума. Программа без проблем запускает его на приемлемой скорости (60 Гц).

Подкласс NSOpenGLView использует NSRunLoop для запуска селектора, который в свою очередь вызывает drawRect:(NSRect)dirtyRect. Это делается каждый кадр.

Теперь я хочу, чтобы шейдер использовал униформу, которая обновляется в каждом кадре. Шейдер должен иметь возможность реагировать на переменные изменения, которые могут происходить в каждом кадре, поэтому я пытаюсь обновить форму на этой частоте. Обновление униформы выполняется в функции drawRect: (NSRect) dirtyRect.

Я частично успешен. Экран обновляется точно так, как я хотел бы для первых 30 кадров, затем он перестает обновлять униформу, даже если у меня есть вызовы glUniform1f () и NSLog прямо рядом друг с другом, и NSLog всегда срабатывает ..!

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

Очевидно, что я что-то здесь упускаю в отношении того, как OSX или OpenGL или что-то еще обрабатывает униформу.

Объяснение того, что может быть больным, было бы полезно, но указателя на то, где я могу найти информацию об этом, будет достаточно.

Обновление: После возни с glGetError() и glGetUniform*() Я заметил, что программа работает, как и предполагалось, если оставить ее в покое. Однако, когда я использую трекпад для ввода, униформа сбрасывается на 0,000, в то время как остальная часть программы не показывает ошибок.

1 Ответ

0 голосов
/ 07 сентября 2011

Во-первых, вы пытались позвонить glGetError() сразу после glUniform1f(), чтобы посмотреть, что получится?

У меня очень ограниченные знания в программировании на Mac OS (я занимался программированием на iOS два года назад и забылс тех пор большинство), поэтому следующее предположение следующее.

Вы уверены, что drawRect:(NSRect)dirtyRect вызывается тем же потоком, что и поток, которому принадлежит контекст OpenGL?Насколько я знаю, OpenGL не является потокобезопасным, поэтому может случиться так, что ваши glUniform1f() попытки вызываются из другого потока, и поэтому ничего не могут сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...