Функции доступа к текстуре можно использовать как для многоуровневых, так и для одноуровневых текстур. Так как при использовании вершинных шейдеров не вычисляется уровень детализации, при выполнении подобных операций существует различие между вершинными и фрагментными функциями доступа. Некоторые свойства текстур, например размер, формат пиксела, размерность, метод отбора, количество уровней множественного отображения, сравнение глубины и т. д., уже определены соответствующими вызовами функций из OpenGL API. Все это учитывается при доступе к текстуре с помощью функций, описанных в этом разделе.
Во всех этих функциях параметр bi as необязателен для фрагментных шейдеров и не принимается в вершинном шейдере. Если bi as задается для фрагментного шейдера, он добавляется к вычисленному уровню детализации. Если параметра bi as нет, реализация OpenGL сама выберет уровень детализации. Если текстура не множественная, она используется непосредственно; если же множественная текстура используется фрагментным шейдером, уровень детализации вычисляется автоматически и используется затем для поиска по текстуре. Если же такая текстура используется вершинным шейдером, всегда будет прочитана основная текстура.
Встроенные функции, заканчивающиеся на Lod, доступны только из вершинного шейдера. В них параметр lod и есть уровень детализации. Встроенные функции, заканчивающиеся на Proj, можно использовать для текстурирования с учетом проекции. Это позволяет текстуре быть спроецированной на объект приблизительно таким же способом, как это делает проектор со слайдами. Эту возможность, кроме всего прочего, используют также для составления карт теней при рендеринге теней.
В последующих главах использование некоторых из этих функций будет иллюстрировано примерами. С теми возможностями программируемости, которые предоставляет язык шейдеров OpenGL, текстурная память может использоваться не только как хранилище изображений текстур. Приведенные далее функции обеспечивают быстрый и гибкий доступ к этим данным, что позволяет с их помощью реализовывать различные эффекты (табл, 5.7).
Таблица 5.7. Функции доступа к текстуре
Синтаксис |
Описание |
vec4 texturelD (samplerlD sanpler. |
Текстурная координата coord |
float coord [. float bias}) |
используется для поиска по ID-текстуре, |
vee4 texturelDProj (saraplerlD sampler. |
указанной семплером. Для версии |
m2 coord [. float f>fas]) |
функции с проецированием («Proj») |
vec4 texturelDProj (samplerlD sampler. |
текстурная координата coord, s делится |
vec4 coord [. float bias]) |
на последний компонент coord. При ис |
vec4 texturelDLod (samplerlD sampler. |
пользовании типа coord vec4 второй |
float coord, float lod) vec4 texturelDProjLod (samplerlD sampler. vec2 coord, float lod) vec4 texturelDProjLod (saraplerlD sampler. vec4 coord, float lod) |
и третий компоненты coord игнорируются |
vec4 texture2D (sanpler2D sampler. |
Текстурная координата coord |
vec2 coord [. float bias]) |
используется для поиска по 2Р-текстуре, |
vec4 texture2DProj (sampl er2D sampler. |
указанной семплером. Для версии функ |
vec3 coord [. float bias!) vec4 texture2DProj |
ции с проецированием («Proj») текстур |
(sampler2D sampler, vec4 coord [, float iu'as]) |
ная координата {coord.$, coord, t) де |
vec4 texture2DLod (sampler2D sampler. |
лится на последний компонент coord. |
vec2 coord, float lod) vec4 texture2DProjLod |
При использовании типа coord vec4 |
(sampler2D sampler. vec3 coord, float lod) vee4 texture2DProjLod (sampler2D sampler, mi coord, float lod) |
третий компонент coord игнорируется |
vee4 texture3D (sampler3D sampler. vec3 coord |
Текстурная координата coord использует |
[. float bias]) vec4 texture30Proj |
ся для поиска по ЗО-тексгуре, указанной |
sampler3D sampler. vec4 coord [, float iu'as]) |
семплером. Для версии функции с прое |
vec4 texture3DLod (sampler3D sampler. vec3 coord. |
цированием («Proj») текстурная коорди |
float lod) vec4 texture3DProjLod (sampler3D Sc3rrp/er,vec4 coord, float lod) |
ната делится на coord, q |
vec4 textureCube (samplerCube sampler. |
Текстурная координата coord исполь |
vec3 coord [, float bias]) vec4 textureCubeLod |
зуется для поиска по кубической тексту |
(sampl erCube sampler. vec3 coord, float lod) |
ре, указанной семплером. Направление coord учитывается при выборе грани, по которой выполняется поиск двухмерной текстуры |
vec4 shadowlD (samplerlDShadow sampler. |
Текстурные координаты coord исполь |
vec3 coord [, float b?as]) vec4 shadow2D |
зуются для поиска по глубине в текстуре |
(sampl er2DShadow sampler. vec3 coord |
глубины, указанной семплером. Третий |
[, float £>7 as]) vec4 shadowlDProj |
компонент coord {coord.р) сравнивается |
(samplerlDShadow sampler, vec4 coord |
со значением, считанным из текстуры |
[, float б7as]) vec4 shadow2DProj |
глубины. Текстура, связанная с семпле |
(sampler2DShadow sampler. vec4 coord |
ром, должна быть текстурой глубины, |
[, float 67'as]) vec4 shadowlDLod |
иначе результаты будут неопределенны |
(samplerlDShadow sampler. vec3 coord. |
ми. Для версии функции с проецировани |
float lod) vec4 shadow2Dlod |
ем («Proj») текстурная координата де |
(sampler2DShadow sampler. vec3 coord. |
лится на coord, q, представляя значение |
float lod) vec4 shadowlDProjLod |
глубины coord.р/coord, q. Второй компо |
(samplerlDShadow sampler, vec4 coord. |
нент coord игнорируется для ID-вариан |
float lod) vec4 shadow2DProjLod (sampler2DShadow sampler, vec4 coord, float lod) |
тов функции |
Если текстурная функция без вычисления глубины вызывается для семплера, текстура которого включает в себя глубину, результаты непредсказуемы. То же самое верно, если текстурная функция с вычислением глубины применяется для текстуры без глубины.