В этой главе описано несколько шейдеров, которые читают значения из текстурной памяти и используют их для формирования интересных эффектов. Начнем с разговора о том, как обратиться к текстуре из шейдера, а потом рассмотрим несколько примеров шейдеров, которые обращаются к текстурной памяти с целью не только наложения текстуры на трехмерный объект.
Шейдеры с сохранением данных в текстурах
10.1. Обращение к текстуре из шейдера Приложения должны правильно инициализировать текстуры перед выполнением шейдера, который работает с ними. Для инициализации текстуры приложение должно выполнить следующие действия.
1. Выбрать текстурный модуль и сделать его активным функцией gl Acti veTexture.
2. Создать текстурный объект и связать его с активным текстурным модулем функцией gl Bi ndTexture.
3. Установить различные параметры (наложение, фильтрация и т. д.) текстурного объекта функцией gl TexParameter.
4. Определить текстуру функцией gl Texlmage.
При использовании стандартной функциональности OpenGL необходимы еще два дополнительных шага: разблокирование нужной текстуры, входящей в текстурный модуль, функцией gl ЕпаЫ е и установка текстурной функции для текстурного модуля (модулирование, шаблон, замена и т. д.) функцией glTexEnv. (Эти шаги не нужны для шейдера, так как блокирование/разблокирование текстур игнорируется, а текстурная функция содержится в самом коде шейдера.) Когда эти шаги выполнены, текстуру можно использовать в OpenGL-шейдере.
К текстурам можно обращаться из шейдера сразу же, как только состояние текстуры задано приложением. Для этого у языка шейдеров OpenGL есть встроенные типы данных (см. раздел 3.2.4) и встроенные функции (см. раздел 5.7).
Uniform-переменная типа sampler используется для обращения к текстуре из шейдера. Как структурная единица шейдера sampler считается закрытым типом данных, содержащим значение для обращения к конкретной текстуре. Шейдер должен объявить такую uniform-переменную для каждой текстуры, которая ему нужна. Приложение должно задать семплеру значение перед выполнением шейдера, как описано в разделе 7.8.