Освещение внутри сферы?

У меня в голове такой вопрос: мне нужно сделать сцену, похожую на настоящее небо. Моей первой идеей было сделать куб и текстурировать его. Это было не так красиво. Мне пришла в голову идея использовать сферу. Но я не мог зажечь его изнутри. Я поставил камеру на просмотр происхождения (0,0,-100). Источник окружающего и зеркального света также находится в начале координат. Ничего не засветилось! Какими способами можно создать небо и как осветить внутреннюю часть сферы?


person pooya    schedule 11.08.2010    source источник
comment
Как вы создали сферу?   -  person Lazarus    schedule 11.08.2010


Ответы (5)


Попробуйте изменить режим отбраковки, так как вы находитесь внутри сферы.

Я сторонник XNA, но похоже, что это будет OpenGL эквивалент. Я полагаю, что если у вас включено окружающее освещение, как вы сказали, вы сможете что-то увидеть независимо от нормалей.

person bporter    schedule 11.08.2010

Попробуйте перевернуть нормали сферы (подробнее результаты поиска здесь). Обычно механизмы рендеринга используют алгоритмы для определения того, что невозможно увидеть и, следовательно, не следует отображать; одним из таких методов является выборка обратной стороны. Я предполагаю, что сфера создается в типичный способ, когда нормали выступают за пределы сферы, вдали от центра; вам нужны нормали, обращенные в противоположную сторону.

person I82Much    schedule 11.08.2010
comment
Я использую глютсолидсфера. Нормали правильные, а изменение нормалей сложное и ошибочное, поскольку приводит к неожиданным результатам! - person pooya; 11.08.2010

Если она освещена снаружи, но темна внутри, то, вероятно, нормали сферы указывают в неправильном направлении.

Предполагая, что вы делаете освещение Фонга/Гуро, косинус между нормалью и направлением взгляда будет вычисляться где-то. Косинус будет отрицательным, и ваша видеокарта зафиксируется на нуле, что приведет к черному цвету.

Итак, если ваши нормали указаны явно, вы должны попробовать инвертировать их направление -> умножить на -1. Если у вас есть только вершины и грани, вы можете изменить порядок вершин в гранях. Просто поменяйте местами два индекса. (1-2-3) -> (1-3-2). Это изменяет порядок с по часовой стрелке на против часовой стрелки (или наоборот). Чтобы проверить свои результаты, вы можете включать и выключать отсечение обратной стороны и смотреть, что происходит.

person msteiger    schedule 11.08.2010

Проблема решена. Спасибо, но нормальные ответы не подходят. Я использую glutSolidSphere, поэтому нормали не ошибаются. попробуйте использовать glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); это должно сделать работу за тебя.

person pooya    schedule 11.08.2010
comment
На самом деле, это одно и то же. Вы просто игнорируете, что нормали указывают в противоположном направлении. - person msteiger; 11.08.2010
comment
Вы должны принять ответ bporter, так как вы сделали то, что он предложил, или I82Much, так как это вполне эквивалентно - person Calvin1602; 12.08.2010

Когда я делаю небесный купол, небесную коробку или небесную плоскость, я на самом деле не освещаю их. Я просто накладываю на него текстуру и визуализирую.

glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
Render sky dome
glEnable(GL_LIGHTING);
glEnable(GL_CULL_FACE);

Однако проблема в том, что изменение состояния может быть дорогостоящим. Таким образом, один из способов устранить изменение состояния GL_CULL_FACE — убедиться, что ваши нормали указывают правильный путь. Если для CULL_FACE установлено значение CCW (против часовой стрелки), то нормали должны указывать на вас. Однако, если CULL_FACE установлен на CW (ClockWise), тогда нормали должны быть направлены от вас. Я вижу единственный способ устранить изменение состояния GL_LIGHTING — использовать шейдеры и определить собственную схему освещения. Однако я не знаю, дороже это или дешевле.

Проблема со скайбоксом похожая история, но у нее есть другие проблемы. Вы можете столкнуться с проблемами искажения, если ваша точка обзора не находится в центре. Что я обычно делаю, так это сначала визуализирую поле неба, центрируя его на камере, затем очищаю буфер глубины и визуализирую все остальное. Таким образом, ваш скайбокс не должен быть смехотворно большим.

person Ned Bingham    schedule 12.08.2010