У меня в голове такой вопрос: мне нужно сделать сцену, похожую на настоящее небо. Моей первой идеей было сделать куб и текстурировать его. Это было не так красиво. Мне пришла в голову идея использовать сферу. Но я не мог зажечь его изнутри. Я поставил камеру на просмотр происхождения (0,0,-100). Источник окружающего и зеркального света также находится в начале координат. Ничего не засветилось! Какими способами можно создать небо и как осветить внутреннюю часть сферы?
Освещение внутри сферы?
Ответы (5)
Попробуйте изменить режим отбраковки, так как вы находитесь внутри сферы.
Я сторонник XNA, но похоже, что это будет OpenGL эквивалент. Я полагаю, что если у вас включено окружающее освещение, как вы сказали, вы сможете что-то увидеть независимо от нормалей.
Попробуйте перевернуть нормали сферы (подробнее результаты поиска здесь). Обычно механизмы рендеринга используют алгоритмы для определения того, что невозможно увидеть и, следовательно, не следует отображать; одним из таких методов является выборка обратной стороны. Я предполагаю, что сфера создается в типичный способ, когда нормали выступают за пределы сферы, вдали от центра; вам нужны нормали, обращенные в противоположную сторону.
Если она освещена снаружи, но темна внутри, то, вероятно, нормали сферы указывают в неправильном направлении.
Предполагая, что вы делаете освещение Фонга/Гуро, косинус между нормалью и направлением взгляда будет вычисляться где-то. Косинус будет отрицательным, и ваша видеокарта зафиксируется на нуле, что приведет к черному цвету.
Итак, если ваши нормали указаны явно, вы должны попробовать инвертировать их направление -> умножить на -1. Если у вас есть только вершины и грани, вы можете изменить порядок вершин в гранях. Просто поменяйте местами два индекса. (1-2-3) -> (1-3-2). Это изменяет порядок с по часовой стрелке на против часовой стрелки (или наоборот). Чтобы проверить свои результаты, вы можете включать и выключать отсечение обратной стороны и смотреть, что происходит.
Проблема решена. Спасибо, но нормальные ответы не подходят. Я использую glutSolidSphere, поэтому нормали не ошибаются. попробуйте использовать glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); это должно сделать работу за тебя.
Когда я делаю небесный купол, небесную коробку или небесную плоскость, я на самом деле не освещаю их. Я просто накладываю на него текстуру и визуализирую.
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 — использовать шейдеры и определить собственную схему освещения. Однако я не знаю, дороже это или дешевле.
Проблема со скайбоксом похожая история, но у нее есть другие проблемы. Вы можете столкнуться с проблемами искажения, если ваша точка обзора не находится в центре. Что я обычно делаю, так это сначала визуализирую поле неба, центрируя его на камере, затем очищаю буфер глубины и визуализирую все остальное. Таким образом, ваш скайбокс не должен быть смехотворно большим.