OpenGL: проблема освещения от направленного источника
От: timurttv  
Дата: 11.10.07 01:58
Оценка:
Никак не могу решить следующую проблемму. Создаю в моей сцене направленный источник света (т.е. в соответсвии с документацией освещенность обьекта не зависит от растояния до обьекта). Создаю в сцене простой примитив (например сферу). Запускаю программу и радуюсь полученной картинкой. Проблема начинается когда я начинаю масштабировать данный примитив при помощи Scalef(x,y,z) функции. наблюдаю следующий эфект: при увеличении обьекта он становится менее освещенным (темнеет), при уменьшении обьекта он заливается ярким светом. Вопрос, что нужно сделать, чтобы независимо от параметров Scalef() я имел одну и ту же картинку освещенности.
Re: OpenGL: проблема освещения от направленного источника
От: Аноним  
Дата: 11.10.07 10:25
Оценка:
Здравствуйте, timurttv, Вы писали:

T>Никак не могу решить следующую проблемму. Создаю в моей сцене направленный источник света (т.е. в соответсвии с документацией освещенность обьекта не зависит от растояния до обьекта). Создаю в сцене простой примитив (например сферу). Запускаю программу и радуюсь полученной картинкой. Проблема начинается когда я начинаю масштабировать данный примитив при помощи Scalef(x,y,z) функции. наблюдаю следующий эфект: при увеличении обьекта он становится менее освещенным (темнеет), при уменьшении обьекта он заливается ярким светом. Вопрос, что нужно сделать, чтобы независимо от параметров Scalef() я имел одну и ту же картинку освещенности.

Ну, например:
— Корректно выставить источник света за собой (за точкой из которой проводится наблюдение);
— Смещать источник освещения в соответствии со скалированием.
Re: OpenGL: проблема освещения от направленного источника
От: Renh Россия  
Дата: 11.10.07 17:56
Оценка:
Здравствуйте, timurttv, Вы писали:

T>Никак не могу решить следующую проблемму. Создаю в моей сцене направленный источник света (т.е. в соответсвии с документацией освещенность обьекта не зависит от растояния до обьекта). Создаю в сцене простой примитив (например сферу). Запускаю программу и радуюсь полученной картинкой. Проблема начинается когда я начинаю масштабировать данный примитив при помощи Scalef(x,y,z) функции. наблюдаю следующий эфект: при увеличении обьекта он становится менее освещенным (темнеет), при уменьшении обьекта он заливается ярким светом. Вопрос, что нужно сделать, чтобы независимо от параметров Scalef() я имел одну и ту же картинку освещенности.


Это известная неприятность. Вот цитата из Red Book:

Вектора нормалей остаются нормализованными до тех пор, пока вы используете только повороты и переносы своих объектов. Если же вы производите масштабирование, используете специфическую матрицу преобразования или изначально указываете ненормализованные вектора нормалей – вы должны заставить OpenGL нормализовать векторы после преобразований. Чтобы это сделать, вызовите glEnable(GL_NORMALIZE).
Если вы устанавливаете вектора нормали единичной длины и применяете только равномерное масштабирование (с сохранением одинаковых пропорций по всем осям), то для нормализации вы можете также использовать glEnable(GL_RESCALE_NORMAL). В этом случае для возвращения нормалей к единичной длине OpenGL будет делить все их координаты на одинаковую величину изменения масштаба, взятую из матрицы модельного преобразования.
Заметьте, что автоматическая нормализация или масштабирование обычно требуют дополнительных расчетов, которые могут снизить быстродействие вашего приложения. Равномерное масштабирование нормалей с помощью GL_RESCALE_NORMAL обычно менее расточительно в смысле производительности, чем полномасштабная нормализация с помощью GL_NORMALIZE. По умолчанию оба описанных механизма (и нормализация, и масштабирование) выключены.


Надеюсь, поможет...
Re[2]: OpenGL: проблема освещения от направленного источника
От: timurttv  
Дата: 15.10.07 08:40
Оценка:
огромное спасибо за проффесиональный ответ. Проблема полностью исчезла. Единственный нуанс которой пожалуй остался открытым это GL_RESCALE_NORMAL такого идентификатора мой OpenGL не знает. Вероятно он относиться к одному из расширений?

С уважением
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.