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:


⇐ вернуться назад | | далее ⇒