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

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

2 голосов
/ 11 августа 2010

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

Ответы [ 5 ]

3 голосов
/ 11 августа 2010

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

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

2 голосов
/ 11 августа 2010

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

1 голос
/ 11 августа 2010

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

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

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

0 голосов
/ 12 августа 2010

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

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 - использовать шейдеры и определить собственную схему освещения.Тем не менее, я не знаю, стоит ли это более или менее дорого.

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

0 голосов
/ 11 августа 2010

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

...