Настройка конвейера OpenGL с программами построения теней

OpenGL 1.x использовал стандартные функции, чтобы поставить полезный графический конвейер разработчикам приложений. Для конфигурирования различных этапов конвейера, показанного на рисунке 12-1, приложения вызвали функции OpenGL для тонкой настройки вычислений, выполнявшихся для каждой вершины и фрагмента. Сложные алгоритмы потребовали многократных передач рендеринга и десятков вызовов функции сконфигурировать вычисления, которых желал программист. Расширения предложили новые параметры конфигурации, но не изменяли сложный характер программирования OpenGL.

Рисунок 12-1  конвейер стандартных функций OpenGL

Начиная с OpenGL 2.0 некоторые этапы конвейера OpenGL могут быть заменены программами построения теней. Программа построения теней является программой, записанной на специальном языке штриховки. Эта программа компилируется OpenGL и загружается непосредственно в аппаратное обеспечение машинной графики. Рисунок 12-2 показывает, где Ваши приложения могут сцепиться в конвейер с программами построения теней.

Рисунок 12-2  конвейер программы построения теней OpenGL

Программы построения теней предлагают значительное число преимуществ для Вашего приложения:

Если Ваше приложение использует конвейер стандартных функций, критическая задача состоит в том, чтобы заменить те задачи программами построения теней.

Если Вы плохо знакомы с программами построения теней, Языком Штриховки 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, который это использует для реализации буферных объектов вершины (Буферы Вершины). Вместо того, чтобы делать вызов функции для каждой универсальной переменной Вы хотите измениться, можно подкачать все универсальные данные путем привязки с различным универсальным буфером.