Использование шейдеров GLSL + освещение / нормали - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть эта не такая уж маленькая игра на основе тайлов, которая является моим первым настоящим проектом OpenGL.Я хочу сделать каждую плитку трехмерным объектом.Итак, сначала я создал несколько объектов, таких как куб и сфера, снабдил их нормалями вершин и сразу же отобразил их с плоским затенением.Но так как я получил около 10.000 объектов на уровень, это было немного медленно.Поэтому я поместил свои вершины и нормали в VBO.

Вот где я столкнулся с первой проблемой: перед использованием VBO я просто push() ed и pop() ed матрицы для каждого объекта и использовал glTranslate / glRotate разместить их на моей сцене.Но когда я сделал то же самое с VBO, освещение стало вести себя странно.Вместо фиксированного положения освещения позади камеры свет, казалось, вращался вместе с моими объектами.Двигаясь вокруг них на 180 градусов, я мог видеть только тень.

Итак, я провел небольшое исследование.Я не мог найти никакого ответа на мою конкретную проблему, но я читал, что вместо использования glTranslate / glRotate следует реализовать шейдеры и предоставить им однородные матрицы.

Я подумал, что, возможно, это можно исправитьмоя проблема тоже »и реализовал первую маленькую программу вершинного шейдера, которая лишь немного растягивала мои объекты, просто чтобы посмотреть, смогу ли я заставить шейдер работать, прежде чем сфокусироваться на деталях.растягиваться - но теперь затенение OpenGLs нарушено.Я просто получаю белые оттенки.И я не могу найти никакой полезной информации.Поэтому у меня возникло несколько вопросов:

  • Могу ли я использовать только один шейдер за раз, а при использовании собственного шейдера плоскостное затенение OpenGL отключено?Так должен ли я сам реализовать плоское затенение?

  • Как насчет моих векторных нормалей?Я где-то читал, что там что-то вроде нормальной матрицы.Возможно, мне придется применять операции и к моим нормалам при изменении вершин?

1 Ответ

1 голос
/ 30 ноября 2011

То, что ваше освещение испорчено изменениями матричных операций, означает, что ваши вызовы glLightfv(..., GL_POSITION, ...) происходят не в том контексте (не в контексте OpenGL, а в состоянии матриц и т. Д.).

Ну, мои объекты растягиваются, но теперь плоское затенение OpenGL нарушено. Я просто получаю белые оттенки

Я думаю, вы имеете в виду затенение Гурадом (плоское затенение означает что-то другое). Дело в том, что если вы используете вершинный шейдер, вы должны делать все, что делал конвейер с фиксированными функциями. Это включает в себя расчет освещения. У Lighthouse3D есть хороший учебник http://www.lighthouse3d.com/tutorials/glsl-tutorial/lighting/, как и у Никола Боласа http://arcsynthesis.org/gltut/Illumination/Illumination.html

...