OpenGL абстрагирующие концепции - PullRequest
0 голосов
/ 04 ноября 2019

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

Мне было интересно, что будет правильнымспособ (правильный способ == стандарты игрового движка для индустрии), чтобы реализовать и абстрагировать некоторые вещи.

Вот список вещей, которые меня интересуют:

  • У меня есть Shader класс с Attach, Link, Bind SetUniform методами. Я создаю несколько экземпляров этого класса в своем главном файле и прикрепляю соответствующие шейдеры для разных задач. Например, у меня есть вершинный и фрагментный шейдеры, отвечающие за расчет света на материале объекта с учетом свойств ambient, diffuse, specular, reflection, emissive материала объекта и вычисление соответствующего цвета фрагмента на основена любой свет, передаваемый этому шейдеру, будь то point / directional / spot. Другим примером является шейдер скайбокса, отвечающий за выборку cubemap и правильное отображение скайбокса. Оба они используют некоторый код для правильной настройки своих функций в главном файле, например, прикрепления файлов правильного шейдера, передачи соответствующей унифицированной информации, такой как положение источников света, направление и т. Д. Какой будет правильный способ абстрагировать его, если я сделаю, как StdLightningShader, взяв std::vector<Light>, и создам соответствующий фрагментный шейдер во время выполнения с достаточным количеством униформ источников света? То же самое относится и к примеру с шейдером скайбокса. Должен ли я инкапсулировать его логику в классе SkyboxShader, используя только путь текстуры скайбокса и настраивая его с правильными файлами шейдеров?
  • Как мне абстрагироваться от некоторых операций, таких как использование буферов stencil и depth,Если, например, я хочу получить контур объекта с использованием буфера stencil или изменить функцию буфера depth на GL_LEQUAL, чтобы оптимизировать способ рендеринга моего скайбокса (я подделываю его значение глубины на 1.0f, чтобы фрагменты скайбоксабудет сброшен, если какие-либо объекты нарисованы в его местоположении), или даже определите, какие грани cull для скайбокса * cull лицевых граней, поскольку скайбокс является кубом изнутри, поэтому мне нужно изменить culling.
...