BRDF-данные часто содержат шум и помехи, если инцидентные углы очень большие (почти 180°), так что в следующей строчке кода эта проблема устраняется наложением коэффициента на половинный угол.
Затем код данного вершинного шейдера вычисляет значения для Ни и Hv и помещает их в varying-перемеиную TexCoord. Эти коэффициенты будут подставлены в биквадратное уравнение во фрагментном шейдере как значения и и v. Этими значениями определяется параметризованный вектор приращения, который будет использоваться для поиска требуемых коэффициентов полинома из текстуры, так что значения приводятся к диапазону [0, 1].
И наконец, вычисляется окончательное значение освещения. Это значение - косинус угла между нормалью поверхности и направлением освещения, он тоже щриводится к диапазону [0, 1], так как потом будет использоваться а качестве текстурной координаты для обращения к 1 D-текстуре, чтобы получить коэффициент освещения.
10.5.3. Фрагментный шейдер
Фрагментный шейдер, иллюстрирующий метод рендеринга BRDF РТМ, приведен в листинге 10.8.
Листинг 1G.8. Фрагментный шейдер для рендеринга с помощью полиномных текстур
//
// Фрагментный шейдер РТМ от Брэда Риттера. Hewlett-Packard.
// и Рэнди Роста. 3Dlabs.
//
П ® 3D1abs. Inc. и Hewlett-Packard, L.P.. 2003.
// опубликовано с разрешений компаний //
uniform sampler2D ABCred: // - 0
uniform sampler2D DEFred: // = 1
uniform sampler20 ABCgrn: // = 2
uniform sampler2D DEFgrn: // = 3
uniform sa<npler2D ABCblu: // - 4
uniform sampler2D DEFblu: // = 5
uniform samplerlD Lighttexture: // = 6
uniform vec3 ABCscale. ABCbias: uniform vec3 DEFscale, DFFbias:
varying float Du: // передает вычисленное значение l_*tPrime
varying float Dv; // передает вычисленное значение L*bPrime
varying float LdotN: // передает вычисленное значение L*Norrhal
varying vec2 TexCoord: // передает текстурные координаты s и t
void main(void)
{
vec3 ABCcoef. DEFcoef; vec3. ptvec:
// Чтение коэффициентов для красного цвета
// и применение коэффициентов масштабирования и сдвига
ABCcoef = (texture2D(ABCred. TexCoord),rgb - ABCbias) * ABCscale:
DEFcoef = (texture2D(DEFred, TexCoord).rgb - DEFbias) * DEFscale: