Використовуйте рівномірні буфери (тобто постійні буфери) в лінгві D3D).
До тих пір, поки всі ваші шейдери домовляться про макет і точку прив’язки кожного такого буфера, то оновлення стає легким вітром. Моделі взагалі нічого не потрібно знати про шейдери. Їм потрібно лише оновити матрицю перегляду моделі в їх постійному буфері, і конвеєр візуалізації використовуватиме її автоматично.
Як мінімум, я стверджую, що у вас повинно бути два таких буфера. Перший повинен зберігати матрицю проекцій, матрицю камери, об'єднану матрицю проекції камери, інформацію про вікно перегляду, деталі фруструма та обертання матриці. Оновлювати цей буфер потрібно лише один раз на кожну сцену.
Потім дайте кожній моделі ще один буфер для зберігання її матриці перегляду моделі, нормальної матриці, обертів та властивостей матеріалу. Це оновлюється один раз для кожної моделі і може бути зроблено в іншому пропуску оновлення (якщо / коли це доречно). Інформацію про матеріал можна / слід перемістити в третій специфічний для буфера матеріал, якщо у вас є можливість ділитися матеріалами між кількома об'єктами.
У налаштуваннях затінення вперед має сенс помістити всі світильники в інший буфер, а також у відкладеному затіненні має сенс використовувати буфер на світло для пропускання світла (замість моделі / буфера, що використовується в пропуск геометрії).
Зауважте, що вам потрібна помірно оновлена версія GL, щоб взагалі використовувати однакові буфери (3.1 або розширення; досить поширені сьогодні, за винятком старих, але ще в користуванні ноутбуків), і вам потрібна досить недавня версія, щоб бути вміти прив’язувати рівномірні буфери до конкретних місць зв’язування всередині коду шейдера (4.2; все ще нечасто, але покращується), інакше вам доведеться зробити більше роботи в коді на стороні процесора, щоб налаштувати речі (ваш код CPU повинен знати правильну прив'язку балів все одно, тож це швидше запах API, ніж серйозна проблема). На жаль, OpenGL | ES не додавав рівномірних буферів до 3.0, що все ще не підтримується на більшості популярних мобільних платформ.
Якщо буфери не є варіантом, вам знадобиться глобальне місце для зберігання покажчиків для активного шейдера. Ви можете використовувати glGetUniformLocation
після завантаження шейдера, щоб знайти індекси для відомих імен (наприклад, ModelViewMatrix
подібних), а потім зберегти ці індекси. Ваш візуалізатор може зіставити значення перерахунку, як MODEL_VIEW
передані SetUniform
функції обмотки, щоб заглянути в зв'язаний шейдер, знайти індекс і glUniform
правильно зателефонувати . Це не особливо велика зміна використання коду клієнта з буферів, окрім необхідності встановлення кожної форми одноосібно, якщо ви все це добре завернули.
Див. Інтерфейсні блоки GLSL та уніфіковані об'єкти буфера .