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

Я имею в виду этот вопрос: мне нужно сделать сцену, похожую на настоящее небо. Моей первой идеей было сделать куб и текстурировать его. Это было не так красиво. У меня возникла идея использовать сферу. Но я не мог зажечь это изнутри. Я поставил камеру на исходное наблюдение (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 (Counter ClockWise), то нормали должны указывать на вас. Однако, если для CULL_FACE установлено значение CW (ClockWise), то нормали должны указывать от вас. Единственный способ устранить изменение состояния GL_LIGHTING - это использовать шейдеры и определить собственную схему освещения. Однако я не знаю, дороже ли это.

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

Другие вопросы по тегам