Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Адаптация кода OpenGL: переход от фиксированной функции к программируемому конвейеру

Delphi , Графика и Игры , OpenGL

В современном OpenGL с удаленными deprecated функциями (т.е. ядром 3.1 или выше) матричный стек, функции манипуляции матрицами и функциональность, построенная на этих функциях (например, GLU), больше не доступны. Более подробную информацию о старом OpenGL можно найти здесь.

Таким образом, функции, которые вы упоминаете, не будут доступны вам при использовании OpenGL 3.1 с совместимым с будущим контекстом или реализации, которая не экспонирует GL_ARB_compatibility (например, как в случае с Intel Sandy Bridge и выше на Linux) или, начиная с OpenGL 3.2, при использовании контекста с ядром профиля. В последнем случае вы можете придерживаться старого (хотя для нового кода я бы сильно рекомендовал против этого) используя контекст профиля совместимости. Более подробную информацию о профилях и причине их введения можно найти здесь.

Современный способ использования матриц - просто использовать любую библиотеку линейной алгебры, которую у вас есть, и просто передавать результаты ваших вычислений в шейдер. Хорошей библиотекой является groovounet's GLM. Она также предоставляет перезаписи старых функций GLU, таких как glmProjection или glmLookAt и обрабатывает все операции с использованием матриц в столбцовом формате, т.е. формат, который ожидает OpenGL.

Например, следующий шейдер содержит однородную 4x4 матрицу, представляющую модель-вид-проекцию:

#version 440 // ... или любая современная версия, на которую вы нацеливаетесь
uniform mat4 ModelViewProjection;

layout (location = 0) in vec3 Position; // Класс хранения атрибутов также отсутствует в современном GLSL, разметки очень полезны, например, для избежания запросов местоположения с стороны приложения

void main()
{
  gl_Position = ModelViewProjection * vec4(Position, 1.0);
}

На уровне API (т.е. в вашем приложении) вам потребуется передать атрибуты вершин в ваш шейдер всеми современными способами, которые предлагает OpenGL, самый очевидный - использовать объект буфера вершин в качестве хранилища данных и (обязательно с OpenGL 3.2) объект массива вершин, описывающий, как извлекать атрибуты из этого хранилища данных. Конечно, вам также нужно вычислить все необходимые данные, такие как матрица MVP, и передать их в шейдер с помощью либо объекта буфера униформ, либо классической семьи функций glUniform*().

В общем, для получения подробной информации о современном OpenGL обратитесь к официальному wiki и разным туториалам в Интернете, таким как этот, который я склонен рекомендовать (потому что знаю, что он хорош).

Пример кода на Object Pascal (Delphi) для вычисления матрицы нормали:

procedure CalculateNormalMatrix(const ModelViewMatrix: array of GLfloat);
var
  i, j, k: Integer;
  TempMatrix: array of GLfloat;
begin
  // Создаем копию ModelViewMatrix
  SetLength(TempMatrix, 16);
  for i := 0 to 15 do
    TempMatrix[i] := ModelViewMatrix[i];

  // Извлекаем верхний левый 3x3 матрицы
  for i := 0 to 2 do
    for j := 0 to 2 do
      TempMatrix[i * 4 + j] := ModelViewMatrix[i * 4 + j];

  // Афинно-инвертируем и транспонируем матрицу
  for i := 0 to 2 do
    for j := 0 to 2 do
    begin
      TempMatrix[j * 4 + i] := TempMatrix[i * 4 + j];
      TempMatrix[j * 4 + 3] := 0.0;
    end;

  // Вычисляем детерминант 3x3 матрицы
  var Det: GLfloat;
  Det := TempMatrix[0] * (TempMatrix[4] * TempMatrix[8] - TempMatrix[5] * TempMatrix[7]) -
         TempMatrix[1] * (TempMatrix[3] * TempMatrix[8] - TempMatrix[5] * TempMatrix[6]) +
         TempMatrix[2] * (TempMatrix[3] * TempMatrix[7] - TempMatrix[4] * TempMatrix[6]);

  // Нормируем матрицу
  for i := 0 to 2 do
    for j := 0 to 3 do
      TempMatrix[j * 4 + i] := TempMatrix[j * 4 + i] / Det;

  // Копируем нормальную матрицу в ModelViewMatrix
  for i := 0 to 15 do
    ModelViewMatrix[i] := TempMatrix[i];
end;

Этот код извлекает верхний левый 3x3 матрицы, афинно-инвертирует и транспонирует матрицу, вычисляет детерминант 3x3 матрицы и нормализует матрицу. Результат записывается в ту же матрицу ModelViewMatrix.

Создано по материалам из источника по ссылке.

переход от фиксированной функции к программируемому конвейеру в OpenGL.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: OpenGL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 19:04:52/0.0038540363311768/0