Карта отражений для создания эффекта отражения от водной поверхности

Рис, 10.1. Карта отражений для создания эффекта отражения от водной поверхности Как видно на цветном рис. 5, текстуры для дневного и ночного времени больше не имеют покрытия облаками. Нужно сохранить облачное покрытие как отдельную текстуру, показанную на рис. 10.2. Это придаст дополнительную гибкость сочетанию изображения облаков с рисунками поверхности Земли. Для дневной поверхности облака должны быть с рассеянным отражением, но без зеркального отражения. Более того, облака скрывают поверхность Земли, и значение 1,0 этой текстуры означает, что облака в этой точке полностью закрывают поверхность. Облака над ночной поверхностью ничего не отражают и не рассеивают, но все равно должны закрывать поверхность. Для удобства это одноканальное изображение сохраняется в красном канале RGB-текстуры, а карта отражений - в зеленом канале. Синий канал остается неиспользованным. (Есть варианты - можно сохранять карту отражений как канал прозрачности в «дневной» текстуре, а облака - как канал прозрачности в «ночной» текстуре.)

Текстурная карта с изображением облачного покрытия (мраморно-голубое изображение от Рето Стекли)

Рис. 10.2. Текстурная карта с изображением облачного покрытия (мраморно-голубое изображение от Рето Стекли)

10.3.1. Подготовка приложения

Подготовка приложения к множественным текстурам почти не отличается от простой подготовки,, за исключением того факта, что теперь имеется три текстуры вместо одной. Можно три раза вызвать функцию init2Dtexture, описанную в разделе 10.2.1, по одному разу для каждой текстуры: дневной, ночной и с облаками* и отражением. Сделать эти текстуры активными можно таким образом:

gl Acti veTextu re(GL_TEXTUREO); glBindTexture(GL_TEXTURE_20, earthDayTexName):

glActiveTexture(GLJEXTUREl): glBindTexture(GL_TEXTURE_2D, earthNightTexNaire):

gl Acti veTexturetGL JEXTURE2); glBindTexture(GL_TEXTURE_2D, earthCloudsTexName): Необходимые uniform-переменные инициализируются так:

lightLcc - glGetUniformLocationARBCprograrciOb]. "LigrttPosition"); glUniform3fAR8(lightLoc. 0.0. 0.0. 4.0): texLoc = glGetUnifonnLocationARB(programObj, "EarthDay"): glUniformliARB(texLac, 0);

texLoc - glGetUniformlocationARBCprogramObj. "EarthNight"); glljniformliARB(texLoc. 1):

texLoc = glGetUniformLocatianARBCprogramObj. "EarthCloudGloss"): glliniformliARBCtexloc. 2): Теперь приложение может рисовать сферу. Для каждой вершины должны быть указаны нормаль поверхности, двухмерные координаты текстуры и координаты вершины.

10.3.2. Вершинный шейдер

Вершинный шейдер для этого примера множественной текстуры очень похож на простой шейдер, описанный в разделе 10.2.2, за исключением того, что коэффициенты рассеянного и зеркального отражения вычисляются вершинным шейдером и передаются в отдельных varying-переменных во фрагментный шейдер. Вычисленное значение отражения умножается на постоянный вектор (1,0, 0,941, 0,898), что приближает его к солнечному свету (листинг 10.3).

Листинг 10.3. Вершинный шейдер для множественных текстур

varying float Diffuse: varying vec3 Specular; varying vec2 TexCoord: uniform vec3 LightPosition:


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