netlib.narod.ru< Назад | Оглавление | Далее >

Решения для сегодняшнего оборудования

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

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

Данный подход приводит к другой проблеме. Поскольку значения альфа-канала представлены в диапазоне от нуля до единицы, вам необходимо переопределить, какому диапазону эти значения соответствуют. Для рассматриваемого примера я предполагаю, что диапазон альфа-значений от нуля до 64, что должно дать достаточный диапазон интенсивности и приемлемую точность. Это просто значит, что значение из альфа-канала перед его использованием нужно умножить на 64.

Вооружившись этими базовыми знаниями вы можете преобразовать эффект засветки с использованием нового подхода. Хотя задача может показаться сложной, она проще, чем выглядит. Поскольку фильтры размытия при засвечивании размывают в цели визуализации как цветовые составляющие, так и альфа-значения, для нового подхода не требуется никаких особых соглашений. Фактически, единственное изменение заключается в установке формата цели визуализации A8R8G8B8 и изменении проходов визуализации объектов, чтобы значения интенсивности масштабировались для соответствия диапазону значений альфа-канала. Код пиксельного шейдера прохода визуализации объектов становится следующим:

float Exposure_Level;

sampler Environment;

float4 ps_main(float3 dir: TEXCOORD0) : COLOR
{
    float4 color = texCUBE(Environment, dir);
    return float4(color.rgb,((1.0+(color.a*64.0))* Exposure_Level)/64.0);
}

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

float Glow_Factor;
float Glow_Factor2;
float Glow_Factor3;

sampler Texture0;
sampler Texture1;
sampler Texture2;

float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR
{
    // Выбираем 3 уровня размытия засветки и комбинируем их вместе
    float4 col1 = tex2D(Texture0,texCoord);
    float4 col2 = tex2D(Texture1,texCoord);
    float4 col3 = tex2D(Texture2,texCoord);

    // Смешиваем три засветки между собой
    return
        float4(col1.rgb*(col1.a*64.0)*Glow_Factor,1.0) +
        float4(col2.rgb*(col2.a*64.0)*Glow_Factor2,0.0) +
        float4(col3.rgb*(col3.a*64.0)*Glow_Factor3,0.0);
}

Как видно на рис. 8.12, результат визуализации похож на тот, который мы получили ранее в этой главе. Я также поместил этот шейдер на CD-ROM в файл shader_6.rfx. Во втором упражнении в конце этой главы вам будет предложено применить тот же самый процесс для шейдера создания полос, разработанного ранее в этой главе.


Рис. 8.12. Визуализация итогового HDR-шейдера не использующего текстуры с плавающей точкой

Рис. 8.12. Визуализация итогового HDR-шейдера не использующего текстуры с плавающей точкой



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz