Моделирование оптической прозрачности среды

Рис. 9.34. Моделирование оптической прозрачности среды С\ =jCs + (\-f)Cf.

Если коэффициент / изменяется линейно на некотором интервале, то с помощью такого нехитрого механизма можно создать оптический эффект глубины пространства сцены. Используя нелинейную функцию j\z) (рис. 9.34), можно с помощью того же самого механизма создать эффект тумана. В OpenGL поддерживается линейная, экспоненциальная и гауссова формы кривой оптической прозрачности среды. Например, приведенный ниже фрагмент программы настраивает в графической системе функцию оптической прозрачности среды в виде / = е~°5'" .

GLfloat fcolor[4]={...}; glEnable(GL_F0G); glFogf(GL_F0G_M0DE, GL_EXP); glFogf(GL_F0G_DENSITY, 0.5); glFogfv(GL_F0G_C0L0R, fcolor);

Обращаю ваше внимание на то, что при формировании значения j\z) используется координата z в системе координат наблюдателя (камеры).

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

В OpenGL для работы с буфером-накопителем требуется предварительно очистить его (эта процедура выполняется функцией glClear( ), как и очистка других буферов), а затем вызвать функцию glAccum(), которая позволяет либо добавить к содержимому буфера-накопителя данные из буфера кадра, либо поэлементно их перемножить, либо переписать со406 Глава 9. Операции с изображением на уровне растрового представления держимое накопителя в буфер кадра. Ниже приведен фрагмент программы, в котором созданная пользователем функция display image() используется для формирования последовательности изображений в буфере кадра.

glClear(GL_ACCUM_BUFFER_BIT) for(i=0; i< num_images; i++)

д1Ассит(СЬ_КЕТ1Ш, 1.0); Каждое очередное изображение накапливается в буфере-накопителе, причем при накоплении используется масштабный множитель, обратно пропорциональный количеству изображений в последовательности. После завершения цикла формирования всей серии усредненное в результате накопления изображение возвращается в буфер кадра. В принципе, ту же задачу можно было решить и с помощью смешивания цветов, но при смешивании пришлось бы снизить точность представления цвета во избежание выхода за пределы интервала представления. Использование буфера-накопителя, имеющего большую разрядность, позволяет выполнить эту процедуру, не снижая точности.


⇐ Предыдущая| |Следующая ⇒