Суффикс в имени типа семплера обозначает тип текстуры: 1D - одномерная, 2D - двухмерная, 3D - трехмерная, кубическая, 1D с глубиной, 2D с глубиной. В OpenGL текстурный объект каждого из первых четырех типов может быть связан с отдельным текстурным модулем, и этот суффикс позволяет выбрать весь текстурный объект. Текстура 1D с глубиной используется для доступа к одномерной текстуре с включенной проверкой глубины, а текстура 2D с глубиной используется для доступа к двухмерной текстуре с включенной проверкой глубины. Если две uniform-переменные различных типов семплера содержат одно и то же значение, при выполнении следующей команды рендеринга возникнет ошибка. Попытка установить значение семплера функциями, отличающимися от gl Uni formli ARB или gl Uni formli vARB, также влечет за собой ошибку.

Шейдер не знает, как именно устроены семплеры. Современное API задает номер текстурного модуля, в будущем, возможно, семплер будет ссылаться непосредственно на текстурный объект.

Семплеры, обращение к которым может происходить при выполнении программы, называются активными семплерами. Если количество активных семплеров превысит ограничение, компоновка будет неуспешной. Максимальное количество активных семплеров для вершинного процессора определяется константой GL_MAX_ ®TEX_TEXTURE_IMAG£_IMTS_ARB, а для фрагментного процессора - константой GL_MAX__ TEXTURE_IMAGE_UNITSmARB. Максимальное количество активных семплеров для обоих процессоров вместе определяется константой GL_C0MBI WED_TEXTURE_IMAGE_UNITS_ARB.

Более подробное описание использования семплеров в шейдере приводится в разделе 10.1.

7,9. Средства диагностики

Иногда бывает сложно определить, почему программа не работает. Случаются ситуации, когда программа не работает из-за неправильного значения семплера.

■ Значения этих переменных можно менять в любое время после компоновки и до выполнения программы. Чтобы поведение программы было надежным, реализация OpenGL должна проводить некоторые проверки во время выполнения про-' граммы, непосредственно перед началом выполнения шейдера (то есть перед выполнением рендеринга). В этот момент единственный способ сообщить об ошибке - установить флаг ошибки в OpenGL, но приложения обычно не проверяют флаг ошибки в этой критической для производительности точке.

Чтобы получать более подробную информацию о подобных проблемах, в API языка шейдеров OpenGL определена новая функция, которая может явно выполнить такую проверку и выдать диагностическую информацию: void g1ValidateProgranARB(GLhandleARB program)

Функция проверяет, могут ли выполняемые модули из program выполняться для текущего состояния OpenGL. Диагностическая информация, полученная в результате этой проверки, будет сохранена в информационном журнале программного объекта. Она может содержать пустую строку или строку с описанием того, как текущий программный объект взаимодействует с остальными параметрами OpenGL. Это позволяет разработчикам определить, почему текущая программа неэффективна, не очень оптимальна, не может выполняться и т. д.


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