openGL для матричного стека - PullRequest
       0

openGL для матричного стека

0 голосов
/ 09 октября 2011

У меня есть приложение win32, в котором я хочу использовать openGL только для своего матричного стека, а не для любого рендеринга.То есть я хочу использовать openGL, чтобы указать камеру, область просмотра и т. Д., Чтобы мне не приходилось делать математику снова.При создании сцены я просто хочу спроецировать точки с помощью gluProject и использовать его.Проецируемые точки передаются в другую библиотеку, которая создает для меня сцену, все дескрипторы окон создаются самой библиотекой, и у меня нет к ней доступа.

Проблема в том, что для инициализации Windows нужен контекст устройства.Но, поскольку я не использую openGL для какого-либо рендеринга, есть ли способ использовать openGL без какого-либо дескриптора Window вообще?

Без какой-либо явной инициализации, когда я считываю матрицы с использованием glGet, он возвращает мусор,Есть мысли о том, как это исправить?

Ответы [ 4 ]

6 голосов
/ 09 октября 2011

Я хочу использовать openGL только для стека матриц, а не для любого рендеринга.

Это не то, для чего предназначен OpenGL.OpenGL - это API рисования / рендеринга, , а не математическая библиотека .Фактически вся математическая математика была удалена из последних версий OpenGL (ядро OpenGL-3 и более поздние версии) по той же причине.менее чем в 1 тыс. строк кода C.Абсолютно бесполезно злоупотреблять OpenGL для этого.

3 голосов
/ 09 октября 2011

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

Даже в чисто программной реализации OpenGL все равно можно ожидать, что создание контекста вызовет некоторый эквивалент malloc для защиты пространства хранения для стека. Если вам случится найти реализацию OpenGL, в которой создание контекста не требовалось, я бы по-прежнему избегал полагаться на это поведение, поскольку оно, скорее всего, не определено и может быть нарушено в следующем выпуске этой реализации.

Если это C ++, я бы просто использовал std::stack с классом Matrix из вашего любимого пакета линейной алгебры, если вы не используете OpenGL для чего-то другого.

1 голос
/ 10 октября 2011

Я представляю вам мой полный (открытый исходный код) класс матрицы. Наслаждайтесь.

https://github.com/TheBuzzSaw/paroxysm/blob/master/newsource/CGE/Matrix4x4.h

0 голосов
/ 09 октября 2011

Я могу порекомендовать попробовать выполнить эти вызовы самостоятельно.Я сделал это однажды для приложения для Palm, которое я написал: tinyGL .Что я узнал, так это то, что документация в основном рассказывает вам в виде простого текста, что сделано.

, то есть дословный код для tglFrustum и tglOrth (обратите внимание, что я использовал математику с фиксированной точкой для получения некоторой производительности)

void tglFrustum(fix_t w, fix_t h, fix_t n, fix_t f) {
  matrix_t fm, m;
  fix_t f_sub_n;
  f_sub_n = sub_fix_t(f,n);
  fm[0][0] = mult_fix_t(_two_,div_fix_t(n,w));
  fm[0][1] = 0;
  fm[0][2] = 0;
  fm[0][3] = 0;
  fm[1][0] = 0;
  fm[1][1] = mult_fix_t(_two_,div_fix_t(n,h));
  fm[1][2] = 0;
  fm[1][3] = 0;
  fm[2][0] = 0;
  fm[2][1] = 0;
  fm[2][2] = inv_fix_t(div_fix_t(add_fix_t(f,n),f_sub_n));
  f = mult_fix_t(_two_,f);
  fm[2][3] = inv_fix_t(div_fix_t(mult_fix_t(f,n),f_sub_n));
  fm[3][0] = 0;
  fm[3][1] = 0;
  fm[3][2] = _minus_one_;
  fm[3][3] = 0;
  set_matrix_t(m,_matrix_stack[_toms]);
  mult_matrix_t(_matrix_stack[_toms],m,fm);  
}

void tglOrtho(fix_t w, fix_t h, fix_t n, fix_t f) {
  matrix_t om, m;
  fix_t f_sub_n;
  f_sub_n = sub_fix_t(f,n);
  MemSet(om,sizeof(matrix_t),0);
  om[0][0] = div_fix_t(_two_,w);
  om[1][1] = div_fix_t(_two_,h);
  om[2][2] = div_fix_t(inv_fix_t(_two_),f_sub_n);
  om[2][3] = inv_fix_t(div_fix_t(add_fix_t(f,n),f_sub_n));
  om[3][3] = _one_;
  set_matrix_t(m,_matrix_stack[_toms]);
  mult_matrix_t(_matrix_stack[_toms],m,om);  
}

Сравните с справочными страницами для glFrustum и glOrtho

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...