2016-10-09 2 views
-1

Я собираюсь реорганизовать некоторые части механизма рендеринга и задаюсь вопросом, должен ли шейдер действительно знать, что это контекст OpenGL. В настоящее время каждый шейдер имеет метод bind() и compileShader(), который ничего не делает, кроме вызова контекста OpenGL для реальной задачи.Архитектура программного обеспечения: создание и компиляция OpenGL Shader

Похоже, что эти методы реализованы в шейдере - но действительно ли это хорошая практика? Не лучше ли создавать контекст, компилировать и связывать шейдер? И обязательно ли шейдер должен знать, что это контекст?

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

ShaderPtr hdm::shader::fancy_lines_3d_ptr; 
fancy_lines_3d_ptr->compileShader(vert_src.c_str(), frag_src.c_str(), vlayout); 

void Shader::bind() 
{ 
    assert(_shaderObj); 
    _context.bindShader(_shaderObj); 
} 


void Shader::compileShader(const string &vertexSrc, 
          const string &fragmentSrc, 
          hdm::rendering::VERTEX_LAYOUT vlayout) 
{ 
    _context.compileShader(_shaderObj, vertexSrc.c_str(), vertexSrc.length(), SHADER_TYPE::ST_VERTEX); 
    _context.compileShader(_shaderObj, fragmentSrc.c_str(), fragmentSrc.length(), SHADER_TYPE::ST_FRAGMENT); 
    _context.bindAttributeLocations(vlayout, _shaderObj); 
    _context.linkShader(_shaderObj); 
} 
+0

Почему нижний предел? – benjist

ответ

1

Когда речь заходит о программировании OpenGL и ООП, могут быть даны четкие ответы. Из-за того, что OpenGL API смешивает глобальное состояние, определенные типы объектов, ограниченные одним контекстом и другими типами объектов, разделяемыми между несколькими контекстами, очень сложно, если не невозможно, полностью сопоставить OpenGL с моделью ООП.

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

Да! На самом деле для OpenGL-контекста очень важно, чтобы фабрика для объектов OpenGL.

И делает ли шейдер обязательно знать его контекст?

Фактически каждый объект OpenGL должен знать контексты, с которыми он связан. Я рекомендую реализовать это через специальный абстрактный ссылочный класс; из этого класса получить ссылку одного контекста, который инстанциирован объектами, которые не являются разделяемыми (шейдеры, программы, фреймбуфера объектов, VAOs, ...) и ссылки в общего контекста, который инстанциирован объектами, являются разделяемыми (изображениями, текстуры , объекты буфера, ...).

И тогда вы каким-то образом должны реализовать способ отслеживания настройки совместного использования контекста и сопоставить это с общей ссылкой на контекст.

 Смежные вопросы

  • Нет связанных вопросов^_^