У меня есть эта не такая уж маленькая игра на основе тайлов, которая является моим первым настоящим проектом OpenGL.Я хочу сделать каждую плитку трехмерным объектом.Итак, сначала я создал несколько объектов, таких как куб и сфера, снабдил их нормалями вершин и сразу же отобразил их с плоским затенением.Но так как я получил около 10.000 объектов на уровень, это было немного медленно.Поэтому я поместил свои вершины и нормали в VBO.
Вот где я столкнулся с первой проблемой: перед использованием VBO я просто push()
ed и pop()
ed матрицы для каждого объекта и использовал glTranslate
/ glRotate
разместить их на моей сцене.Но когда я сделал то же самое с VBO, освещение стало вести себя странно.Вместо фиксированного положения освещения позади камеры свет, казалось, вращался вместе с моими объектами.Двигаясь вокруг них на 180 градусов, я мог видеть только тень.
Итак, я провел небольшое исследование.Я не мог найти никакого ответа на мою конкретную проблему, но я читал, что вместо использования glTranslate
/ glRotate
следует реализовать шейдеры и предоставить им однородные матрицы.
Я подумал, что, возможно, это можно исправитьмоя проблема тоже »и реализовал первую маленькую программу вершинного шейдера, которая лишь немного растягивала мои объекты, просто чтобы посмотреть, смогу ли я заставить шейдер работать, прежде чем сфокусироваться на деталях.растягиваться - но теперь затенение OpenGLs нарушено.Я просто получаю белые оттенки.И я не могу найти никакой полезной информации.Поэтому у меня возникло несколько вопросов:
Могу ли я использовать только один шейдер за раз, а при использовании собственного шейдера плоскостное затенение OpenGL отключено?Так должен ли я сам реализовать плоское затенение?
Как насчет моих векторных нормалей?Я где-то читал, что там что-то вроде нормальной матрицы.Возможно, мне придется применять операции и к моим нормалам при изменении вершин?