openGL用于矩阵堆栈

openGL for matrix stack

本文关键字:堆栈 用于 openGL      更新时间:2023-10-16

我有一个win32应用程序,在其中我想使用openGL只是为了它的矩阵堆栈,而不是任何渲染。也就是说,我想使用openGL来指定相机,视口等,这样我就不用再做数学运算了。在创建场景时,我只想使用gluProject投影点并使用它。投影点被传递到另一个为我创建场景的库,所有的窗口句柄都是由库自己创建的,我不能访问它。

问题是,windows需要一个设备上下文来初始化。但是,因为我没有使用openGL进行任何渲染,有没有一种方法可以使用openGL没有任何窗口句柄?

在没有任何显式初始化的情况下,当我使用glGet读取矩阵时,它返回一个垃圾。有什么好办法吗?

我想使用openGL只是为了它的矩阵堆栈,而不是为了任何渲染。

这不是OpenGL的本意。OpenGL是一个绘图/渲染API, 不是数学库。实际上,整个矩阵数学的东西已经从最新的OpenGL版本(OpenGL-3核心和更高版本)中剥离了,正是因为这个原因。

做这个矩阵数学的东西也很简单,你可以用不到1000行C代码写出来。在这种情况下滥用OpenGL绝对没有好处。

在您的实现中,Matrix堆栈可能存在于图形硬件上。OpenGL是相当合理的,因此坚持你有一个OpenGL上下文,以便能够使用这些功能。这是因为创建上下文的行为可能包括设置存储矩阵堆栈所需的必要实现机制。

即使在一个纯粹基于软件的OpenGL实现中,人们仍然会期望创建一个上下文的行为来调用一些等价的malloc来确保堆栈的存储空间。如果你碰巧发现一个OpenGL实现,其中创建上下文是没有必要的,我仍然会保持远离依赖的行为,因为它很可能是未定义的,并可能在该实现的下一个版本中被打破。

如果是c++,我只使用std::stackMatrix类从你最喜欢的线性代数包,如果你不使用OpenGL的其他任何东西。

我向您展示我的完整(开源)矩阵类。享受。

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

我可以建议您尝试自己实现这些调用。我曾经为自己编写的一个Palm应用程序tinyGL这样做过。我学到的是,文档基本上以纯文本的形式告诉你要做什么。

tglFrustumtglOrth的逐字代码是(请注意,我使用定点数学来获得一些性能)

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的手册页进行比较