В настоящее время я изучаю 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
.