У OpenGL вже є деякі поняття "Object".
Наприклад, що-небудь з ідентифікатором може бути перетворено як об'єкт (Є також речі, спеціально названі "Об'єкти"). Буфери, текстури, об'єкти буферних вершин, об'єкти масиву вершин, об'єкти буферних кадрів тощо. З невеликою роботою можна обгорнути заняття навколо них. Це також дає простий спосіб повернутися до старих застарілих функцій OpenGL, якщо ваш контекст не підтримує розширення. Наприклад, VertexBufferObject може повернутися до використання glBegin (), glVertex3f () тощо.
Вам може знадобитися кілька способів відійти від традиційних концепцій OpenGL, наприклад, ви, ймовірно, хочете зберігати метадані про буфери в буферних об'єктах. Наприклад, якщо буфер зберігає вершини. Який формат вершин (тобто положення, нормали, текстові слова тощо). Які примітиви він використовує (GL_TRIANGLES, GL_TRIANGLESTRIP тощо), інформацію про розміри (скільки поплавків зберігається, скільки трикутників вони представляють тощо). Просто для того, щоб було легко підключити їх до команд малювання масивів.
Рекомендую подивитися на OGLplus . Це зв'язки C ++ для OpenGL.
Також glxx , але це лише для завантаження розширення.
На додаток до обгортання API OpenGL, вам слід поглянути на створення трохи більш високого рівня, який будується над ним.
Наприклад, клас менеджера матеріалів, який відповідає за всі ваші шейдери, завантаження та використання їх. Також було б відповідально за передачу їм властивостей. Таким чином ви можете просто зателефонувати: Materials.usePhong (); material.setTexture (деякийтекст); material.setColor (). Це дозволяє передбачити більшу гнучкість, оскільки ви можете використовувати нові речі, такі як спільні об’єкти буфера, щоб мати лише 1 великий буфер, що містить усі властивості, якими користуються ваші шейдери в 1 блоці, але якщо його не підтримується, ви повертаєтесь до завантаження до кожної програми шейдерів. Ви можете мати один великий монолітний шейдер і мінятись між різними моделями шейдерів, використовуючи рівномірні підпрограми, якщо він підтримується або ви можете перейти до використання безлічі різних невеликих шейдерів.
Ви також можете подивитися на те, що витрачається на технічні характеристики GLSL для написання коду шейдера. Наприклад, #include був би надзвичайно корисним та дуже простим у застосуванні у вашому коді завантаження шейдерів (для нього також є розширення ARB ). Ви також можете генерувати код на льоту, базуючись на тому, які розширення підтримуються, наприклад, використовуйте спільний обмундирований об’єкт або поверніться до використання звичайної форми.
Нарешті, вам потрібен API конвеєра вищого рівня, який виконує такі дії, як графіки сцен, спецефекти (розмиття, світіння), речі, для яких потрібні багаторазові переходи, такі як тіні, освітлення тощо. А потім на додаток до ігрового API, який не має нічого спільного з графічним API, а лише має справу з об'єктами у світі.