Никак не могу решить следующую проблемму. Создаю в моей сцене направленный источник света (т.е. в соответсвии с документацией освещенность обьекта не зависит от растояния до обьекта). Создаю в сцене простой примитив (например сферу). Запускаю программу и радуюсь полученной картинкой. Проблема начинается когда я начинаю масштабировать данный примитив при помощи Scalef(x,y,z) функции. наблюдаю следующий эфект: при увеличении обьекта он становится менее освещенным (темнеет), при уменьшении обьекта он заливается ярким светом. Вопрос, что нужно сделать, чтобы независимо от параметров Scalef() я имел одну и ту же картинку освещенности.
Здравствуйте, timurttv, Вы писали:
T>Никак не могу решить следующую проблемму. Создаю в моей сцене направленный источник света (т.е. в соответсвии с документацией освещенность обьекта не зависит от растояния до обьекта). Создаю в сцене простой примитив (например сферу). Запускаю программу и радуюсь полученной картинкой. Проблема начинается когда я начинаю масштабировать данный примитив при помощи Scalef(x,y,z) функции. наблюдаю следующий эфект: при увеличении обьекта он становится менее освещенным (темнеет), при уменьшении обьекта он заливается ярким светом. Вопрос, что нужно сделать, чтобы независимо от параметров Scalef() я имел одну и ту же картинку освещенности.
Это известная неприятность. Вот цитата из Red Book:
Вектора нормалей остаются нормализованными до тех пор, пока вы используете только повороты и переносы своих объектов. Если же вы производите масштабирование, используете специфическую матрицу преобразования или изначально указываете ненормализованные вектора нормалей – вы должны заставить OpenGL нормализовать векторы после преобразований. Чтобы это сделать, вызовите glEnable(GL_NORMALIZE).
Если вы устанавливаете вектора нормали единичной длины и применяете только равномерное масштабирование (с сохранением одинаковых пропорций по всем осям), то для нормализации вы можете также использовать glEnable(GL_RESCALE_NORMAL). В этом случае для возвращения нормалей к единичной длине OpenGL будет делить все их координаты на одинаковую величину изменения масштаба, взятую из матрицы модельного преобразования.
Заметьте, что автоматическая нормализация или масштабирование обычно требуют дополнительных расчетов, которые могут снизить быстродействие вашего приложения. Равномерное масштабирование нормалей с помощью GL_RESCALE_NORMAL обычно менее расточительно в смысле производительности, чем полномасштабная нормализация с помощью GL_NORMALIZE. По умолчанию оба описанных механизма (и нормализация, и масштабирование) выключены.
Надеюсь, поможет...
огромное спасибо за проффесиональный ответ. Проблема полностью исчезла. Единственный нуанс которой пожалуй остался открытым это GL_RESCALE_NORMAL такого идентификатора мой OpenGL не знает. Вероятно он относиться к одному из расширений?
С уважением