Лабораторная работа № 10. Зелёный треугольник
Зелёный треугольник
Прежде чем начать
Если вы используете WebGl, то все необходимые примитивы для работы с канвасами и пользовательским вводом достаются вам бесплатно из html и js.
Но WebGl имеет ограниченные возможности по сравнению с OpenGL.
Поэтому в курсе ИСПОЛЬЗУЕМ ТОЛЬКО OPENGL
В случае OpenGL (если вы пишете на C++, Rust, и т.п.), вам необходимо установить библиотеку для работы с окнами и пользовательским вводом. Мы рекомендуем использовать SFML. Код инициализации окна можно взять, например, из презентации.
Порядок действий
Инициализировать шейдеры (вершинный и фрагментный)
- Объекты шейдеров создаются функцией
glCreateShader. - Инициализируются исходным кодом функцией
glShaderSource - Компилируется функцией
glCompileShader - Обработать ошибки (см. пункт про обработку ошибок далее)
- Объекты шейдеров создаются функцией
Инициализировать шейдерную программу
- Создаём шейдерную программу:
glCreateProgram - Присоединяем каждый шейдер функцией
glAttachShader - Линкуем программу
glLinkProgram - Обработать ошибки
- Создаём шейдерную программу:
Получить id аттрибутов из шейдерной программы
- Используем функцию
glGetAttribLocation - Если индекс, возвращённый
glGetAttribLocationоказался-1, то вы сделали что-то не так
- Используем функцию
Инициализировать VBO
VBO — это массив данных в видеопамяти.- Создаём VBO:
glGenBuffers - Биндим VBO:
glBindBuffer(подробнее об этом далее) - Заполняем его данными функцией
glBufferData
- Создаём VBO:
Отрисовать сцену
- Установить шейдерную программу текущей:
glUseProgram - Вызываем демонов функцией
glEnableVertexAttribArray - Биндим VBO:
glBindBuffer - Привязываем к нему аттрибут:
glVertexAttribPointer - Можно рисовать:
glDrawArrays - Обработать ошибки
- Установить шейдерную программу текущей:
Очистить ресурсы
Когда штуки больше не нужны, их надо удалять- Удаление шейдерной программы:
glDeleteProgram - Удаление VBO:
glDeleteBuffers
- Удаление шейдерной программы:
Обработка ошибок
После каждого действия надо спрашивать OpenGL успешно ли он с этим действием справился.
Обработка ошибок компиляции шейдеров
Для получения результатов компиляции каждого шейдера (функция glCompileShader) можно использовать следующую функцию
void ShaderLog(unsigned int shader)
{
int infologLen = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLen);
if (infologLen > 1)
{
int charsWritten = 0;
std::vector<char> infoLog(infologLen);
glGetShaderInfoLog(shader, infologLen, &charsWritten, infoLog.data());
std::cout << "InfoLog: " << infoLog.data() << std::endl;
}
}
Обработка других ошибок
Результат большинства функций в OpenGL, которые могут закончиться неудачей, можно получить функцией glGetError. Она возвращает код ошибки, трактовку которого и пример использования функции можно получить в документации.
Обработка ошибок в WebGL
В WebGL ошибки следует обрабатывать, как стандартный Exception (но иногда он их просто пишет в консоль)
Биндинг
В процессе работы с различными примитивами OpenGl мы нередко сталкиваемся с функциями вида glBind.... Это работает следующим образом. В памяти OpenGL существует переменная, отвечающая за то, с каким объектом мы работаем в данный момент. Этот объект как раз выбирается функциями glBind....
Например при заполнении VBO мы сначала сообщаем OpenGL, с каким буфером мы сейчас будем работать:
glBindBuffer(GL_ARRAY_BUFFER, VBO);
Затем вызываем функцию, заполняющую его данными:
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
Хорошим тоном считается после использования разбиндить буфер, вызвав
glBindBuffer(GL_ARRAY_BUFFER, NULL);
Результат
В ходе этой лабораторной необходимо реализовать отрисовку зелёного треугольника на чёрном фоне с помощью OpenGL/WebGL и шейдеров.