Настройка конвейера OpenGL с программами построения теней
OpenGL 1.x использовал стандартные функции, чтобы поставить полезный графический конвейер разработчикам приложений. Для конфигурирования различных этапов конвейера, показанного на рисунке 12-1, приложения вызвали функции OpenGL для тонкой настройки вычислений, выполнявшихся для каждой вершины и фрагмента. Сложные алгоритмы потребовали многократных передач рендеринга и десятков вызовов функции сконфигурировать вычисления, которых желал программист. Расширения предложили новые параметры конфигурации, но не изменяли сложный характер программирования OpenGL.
Начиная с OpenGL 2.0 некоторые этапы конвейера OpenGL могут быть заменены программами построения теней. Программа построения теней является программой, записанной на специальном языке штриховки. Эта программа компилируется OpenGL и загружается непосредственно в аппаратное обеспечение машинной графики. Рисунок 12-2 показывает, где Ваши приложения могут сцепиться в конвейер с программами построения теней.
Программы построения теней предлагают значительное число преимуществ для Вашего приложения:
Программы построения теней дают Вам точный контроль над операциями, выполняющимися для рендеринга изображений.
Программы построения теней допускают алгоритмы, которые будут записаны в кратком, выразительном формате. Вместо того, чтобы писать сложные блоки конфигурации вызывает для реализации математической операции, Вы пишете код, выражающий алгоритм непосредственно.
Более старые графические процессоры реализовали конвейер стандартных функций в аппаратных средствах или микрокоде, но теперь графические процессоры являются вычислительными устройствами общего назначения. Конвейер стандартных функций самостоятельно реализован как программа построения теней.
Программы построения теней допускают дольше и более сложные алгоритмы, которые будут реализованы с помощью единственной передачи рендеринга. Поскольку Вы имеете обширный контроль над конвейером, также проще реализовать многопроходные алгоритмы, не требуя, чтобы данные были считаны назад из GPU.
Ваше приложение может переключиться между различными программами построения теней с единственным вызовом функции. Напротив, конфигурирование конвейера стандартных функций подвергается значительному вызову функции наверху.
Если Ваше приложение использует конвейер стандартных функций, критическая задача состоит в том, чтобы заменить те задачи программами построения теней.
Если Вы плохо знакомы с программами построения теней, Языком Штриховки OpenGL, Рэнди J. Rost, превосходное руководство для тех, которые надеются узнавать больше о записи программ построения теней и интеграции их в Ваше приложение. Остальная часть этой главы обеспечивает некоторый шаблонный код, кратко опишите расширения, реализующие программы построения теней, и обсуждает инструменты, которые Apple обеспечивает для помощи Вам в записи программ построения теней.
Основы программы построения теней
OpenGL 2.0 предлагает вершину и программы построения теней фрагмента, для принятия обработки тех двух этапов графического конвейера. Эти те же возможности также предлагаются ARB_shader_objects, ARB_vertex_shader и ARB_fragment_shaderextensions. Штриховка вершины доступна на всех аппаратных средствах рабочий OS X v10.5 или позже. Штриховка фрагмента доступна на всех аппаратных средствах рабочий OS X v10.6 и большинство аппаратных средств рабочий OS X v10.5.
Создание программы программы построения теней является дорогой работой по сравнению с другими изменениями состояния OpenGL. Перечисление 12-1 представляет типичную стратегию загрузить, скомпилировать и проверить программу программы построения теней.
Перечисление 12-1 , загружающее программу построения теней
/** Initialization-time for shader **/ GLuint shader, prog; GLchar *shaderText = “... shader text ...”; // Create ID for shader shader = glCreateShader(GL_VERTEX_SHADER); // Define shader text glShaderSource(shaderText); // Compile shader glCompileShader(shader); // Associate shader with program glAttachShader(prog, shader); // Link program glLinkProgram(prog); // Validate program glValidateProgram(prog); // Check the status of the compile/link glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLen); if(logLen > 0) { // Show any errors as appropriate glGetProgramInfoLog(prog, logLen, &logLen, log); fprintf(stderr, “Prog Info Log: %s\n”, log); } // Retrieve all uniform locations that are determined during link phase for(i = 0; i < uniformCt; i++) { uniformLoc[i] = glGetUniformLocation(prog, uniformName); } // Retrieve all attrib locations that are determined during link phase for(i = 0; i < attribCt; i++) { attribLoc[i] = glGetAttribLocation(prog, attribName); } /** Render stage for shaders **/ glUseProgram(prog); |
Этот код загружает текстовый источник для вершинного шейдера, компилирует его и добавляет его к программе. Более сложный пример мог бы также присоединить программы построения теней геометрии и фрагмент. Программа соединена и проверена для правильности. Наконец, программа получает информацию о вводах к программе построения теней и хранит тогда в ее собственных массивах. Когда приложение готово использовать программу построения теней, оно вызывает glUseProgram
сделать его текущей программой построения теней.
Когда Ваше приложение инициализируется, и не в цикле рендеринга, для лучшей производительности Ваше приложение должно создать программы построения теней. В Вашем цикле рендеринга можно быстро переключиться в надлежащие программы построения теней путем вызова glUseProgram
. Для лучшей производительности используйте расширение объекта массива вершины, чтобы также переключиться в указатели вершины. Посмотрите Объект Массива Вершины для получения дополнительной информации.
Усовершенствованные расширения штриховки
В дополнение к стандартной программе построения теней некоторые Macs предлагают дополнительные расширения штриховки для раскрытия возможностей передового оборудования. Не все эти расширения доступны на всех аппаратных средствах, таким образом, необходимо оценить, стоит ли опции каждого расширения реализовать в приложении.
Преобразуйте обратную связь
Расширение EXT_transform_feedback доступно на всех аппаратных средствах рабочий OS X v10.5 или позже. С расширением обратной связи можно получить результаты вершинного шейдера в буферный объект, который может использоваться в качестве ввода к будущим командам. Это подобно пиксельному буферному методу объекта, описанному в Использовании Пиксельных Буферных Объектов Сохранить Данные по GPU, но более непосредственно получает результаты, которых Вы желаете.
Программа построения теней 4 GPU
Расширение EXT_gpu_shader4 расширяет язык штриховки OpenGL для предложения новых операций, включая:
Полная целочисленная поддержка.
Встроенная переменная программы построения теней для ссылки на текущую вершину.
Встроенная переменная программы построения теней для ссылки на текущий примитив. Это упрощает использовать программу построения теней для использования тех же статических данных вершины для рендеринга многократных примитивов, с помощью программы построения теней и универсальных переменных для настройки каждого экземпляра того примитива.
Неотфильтрованные выборки текстуры с помощью целочисленных координат.
Запросы размера текстуры в программе построения теней.
Поиски текстуры смещения.
Явный градиент и ЛОД текстурируют поиски.
Глубина Cubemaps.
Программы построения теней геометрии
Расширение EXT_geometry_shader4 позволяет Вашему создавать программы построения теней геометрии. Программа построения теней геометрии принимает преобразованные вершины и может добавить или удалить вершины перед передачей их к rasterizer. Это позволяет приложению добавлять или удалять геометрию на основе расчетных значений в вершине. Например, учитывая треугольник и его соседние вершины, Ваше приложение могло испустить дополнительные вершины для лучше создавания более точной видимости кривой поверхности.
Универсальные буферы
Расширение EXT_bindable_uniform позволяет Вашему приложению выделять буферные объекты и использовать их в качестве источника для универсальных данных в Ваших программах построения теней. Вместо того, чтобы полагаться на единственный блок универсальной памяти, предоставленной OpenGL, Ваше приложение выделяет буферные объекты с помощью того же API, который это использует для реализации буферных объектов вершины (Буферы Вершины). Вместо того, чтобы делать вызов функции для каждой универсальной переменной Вы хотите измениться, можно подкачать все универсальные данные путем привязки с различным универсальным буфером.