10,5. Полиномное отображение текстуры с BRDF-данными
:.□ Du - косинус угла между направлением освещения и тангенциальным вектором (число с плавающей запятой);
□ Ov, - косинус угла между направлением освещения и вектором бинормали (число с плавающей запятой);
LdotN - косинус угла между нормалью поверхности и направлением освещения (число с плавающей запятой).
Предполагается, что наблюдатель бесконечно удален, а источник освещения точечный и единственный.
Листинг 10.7. Вершинный шейдер для рендеринга с помощью полиномных текстур
//
// Вершинный шейдер РТМ от Брэда Риттера, Hewlett-Packard. // и Рэнди Роста. 3Dlabs.
медицинская книжка или справка образца 086-у 079-у.
//
// 0 3Dlabs. Inc. и Hewlett-Packard. L.P.. 2003,
// опубликовано с разрешения компаний
//
uniform vec3 LightPos; uniform vec3 EyeDir;
attribute vec3 Tangent: attribute vec3 Binormal:
varying float Du;
varying float Dv: t varying float LdotN: varying vec2 TexCoord:
void main(void) {
vec3 lightTemp: vec3 halfAngleTemp: vec3 tPrime: vec3 bPrime:
// Преобразование вершины
gl_Position = ftransformQ:
lightTemp = normalizetLightPos - gl_Vertex.xyz):
// Вычисление вектора половины угла halfAngleTemp = normalize(EyeDir + lightTemp):
// Вычисление Г и В' // Г - |Т - СТ.Н)Н|
tPrime = Tangent - (halfAngleTemp * dot(Tangent, halfAngleTemp)): tPrime = normalize(tPrime):
//В' - H x T'
bPrime = crossChalfAngleTemp, tPrime):
Du = dot(lightTemp. tPrime): Dv = dot(lightTemp, bPrime):
II Умножение половинного угла на N0ISE_FACT0R. // чтобы избешать помех а BRDF-данных
продолжение &
Шейдеры с сохранением данных в текстурах
Листинг 10.7 (продолжение)
halfAngleTemp = halfAngleTemp * 0.9:
// Ни = DotCHalfAngle. Т)
Коробка европаллет размер.
// Hv = DotCHalfAngle. В)
// Remap [-1.0..1.0] to [0.0..1.0]
TexCoord.s = dotCTangent. halfAngleTemp) * 0.5 + 0.5;
TexCoord.t = doUBinormal. halfAngleTemp) * 0.5 + 0.5:
// "S" Text Coord3; Dot(Light. Normal); LdotN = dotdightTemp. gljtorraal) * 0.5 + 0.5:
}
Координаты источника освещения и направление обзора передаются 15 шейдер приложением как uniform-переменные. В дополнение к стандартным атрибутам вершины - координатам и нормали - приложение передает тангенс и бинормаль для каждой вершины, как описано в предыдущем разделе. Эти два дополнительных атрибута определены с соответствующими именами в данном вершинном шейдере.