Как создавать быстрые и легкие независимые от сцены тени без шейдеров в OpenGL
Пусть у меня есть сетка (например, сфера) в центре комнаты, полная кубов и одного источника света. Как я могу быстро и легко отбрасывать тени в OpenGL, используя только "стандартные" (фиксированные) функции? Примечание: результат должен также содержать тени куба и сферы.
3 ответа
Если вы можете создать силуэт сферы, вы можете использовать теневые объемы. Аппаратное обеспечение nVidia также поддерживает фиксированное отображение теней функций.
У теневых объемов есть недостаток очень высоких требований к скорости заполнения. Карты теней могут быть лучше, но требуют дополнительного прохода.
Если вы проецируетесь на одну плоскость, может быть проще просто спроецировать объект на плоскость.
Там нет быстрого и легкого пути. Есть много разных техник, каждый из которых имеет свои плюсы и минусы. Вы можете посмотреть на проект, который я размещаю на github, который использует очень простой код для создания тени, используя технику теневого тома (http://iuiz.github.com/VolumeShadow/). Тем не менее, он написан на Java, но не должно быть трудно перенести его на любой другой язык.
Наиболее важные способы создания теней - это так называемый метод "наложения теней", в котором вы визуализируете свою сцену (с камерой у источника света, направленной на каждый объект отбрасывания теней) в текстуру. И второй метод - это метод теневого волюма (известный благодаря Doom3).
Я нашел один способ, используя StencilBuffers. Некоторое время я был немного сбит с толку, и в конце концов мне пришла в голову мысль - с этим самым сложным будет цикл по каждому источнику света и проецирование всех объектов сцены. Этот выглядит более симпатично, чем затенение текстуры, и работает быстрее, чем объемные тени. здесь и здесь есть некоторые ресурсы, которые помогли мне понять шаг умножения матриц (это немного смутило меня, когда я просматривал демо-версию dino). На мой взгляд, этот метод наиболее прост для понимания и использования. Остается решить только один вопрос: как рассчитать матрицу умножения?
Хотя этот метод можно немного изменить, используя текстуры, как показано здесь.
Спасибо всем! знак равно