Освещение OpenGL появляется на противоположной стороне - PullRequest
1 голос
/ 05 мая 2011

У меня очень тревожная проблема с OpenGL.

Моя домашняя работа состоит в том, чтобы создать сцену с человеком и мечом и некоторыми другими объектами, поставить точечный источник света на каждой «ладони» парня (зеленый всправа, красный слева) и имеет источник направленного света как солнце.

Вот почтовый индекс с двумя версиями моей программы: http://www.woofiles.com/dl-245221-OdPUtOaW-Release.zip

(К сожалению, имена венгерские, "szép_de_rossz_oldalon_a_fény" означает "хорошо, но огни на противоположной стороне", а "fény_jó_oldalon_de_ronda" означает "огни с правой стороны, но безобразно".)

Моя проблема заключается в том, что эффект от источников света проявляется напротивоположная сторона моих мозаичных параметрических поверхностей.

Логическим объяснением было бы то, что нормали поверхности неверны, но умножение их на -1 дает еще более странный результат.Кажется, что нормальная векторная интерполяция нарушена, и остается только шероховатая поверхность с плохим освещением.Все это путем обращения нормалей.Я уверен, что треугольники направлены в правильном направлении, что векторная арифметика безупречна, и что все находится в той сцене, где это должно быть (можно видеть, что меч зеленый, но эта сторона других поверхностейкрасный).

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Для меня это звучит как плохая нормаль - помните, что есть много способов испортить векторы нормалей, кроме ошибок знака:

  • Ваши нормали могут не иметь длины единицы (вы можете проверить, попробовавglEnable(GL_NORMALIZE) и выяснение, имеет ли это значение).
  • Возможно, они не совсем нормальны к поверхности (проверьте, сравнив перекрестные произведения ребер треугольника с вашими нормальными векторами)
  • Возможно, выиметь непоследовательную обертку (CW / CCW) ваших треугольных вершин, эффективно переворачивая знак нормали (если не выбрано включение - тогда вы можете вообще не видеть некоторые треугольники)

Удачи!

2 голосов
/ 05 мая 2011

К сожалению, у почтового индекса, на который вы ссылались, не было кода ...

Одна вещь, которую нужно попробовать, которую мне приходилось использовать раньше, когда я перепутал полигональную облицовку, - это использовать GL_LIGHT_MODEL_TWO_SIDEкак glLightModel, который заставляет светиться обе стороны полигонов, а не только переднюю грань.из памяти использование:

glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)

(или что-то в этом роде) сделать вызов до того, как произойдет какое-либо освещение.

это хакерское решение, но я не вижу код и ядумаю, вы находитесь в крайнем сроке .. что-то попробовать, по крайней мере, пока кто-то не придет с лучшим решением :)

...