Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于矩阵堆栈的openGL_C++_C_Windows_Opengl - Fatal编程技术网

C++ 用于矩阵堆栈的openGL

C++ 用于矩阵堆栈的openGL,c++,c,windows,opengl,C++,C,Windows,Opengl,我有一个win32应用程序,其中我只想将openGL用于其矩阵堆栈,而不是用于任何渲染。也就是说,我想使用openGL来指定摄影机、视口等,这样我就不必再做数学运算了。在创建场景时,我只想使用gluProject投影点并使用它。投影点被传递到另一个为我创建场景的库中,所有窗口句柄都是由库本身创建的,我无权访问该库 问题是,windows需要设备上下文进行初始化。但是,由于我没有使用openGL进行任何渲染,有没有一种方法可以在没有任何窗口句柄的情况下使用openGL 在没有任何显式初始化的情况下

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

问题是,windows需要设备上下文进行初始化。但是,由于我没有使用openGL进行任何渲染,有没有一种方法可以在没有任何窗口句柄的情况下使用openGL


在没有任何显式初始化的情况下,当我使用glGet读回矩阵时,它返回一个垃圾。有没有想过如何修复它?

矩阵堆栈可能存在于您的实现中的图形硬件上。OpenGL是相当合理的,因此,为了能够使用这些函数,您必须拥有OpenGL上下文。这是因为创建上下文的行为可能包括设置存储矩阵堆栈所需的必要实现机制

即使在一个纯粹基于软件的OpenGL实现中,人们仍然希望创建一个上下文来调用一些等价的
malloc
来保护堆栈的存储空间。如果您碰巧发现一个OpenGL实现不需要创建上下文,我仍然不会依赖该行为,因为它很可能未定义,并且可能在该实现的下一个版本中被破坏


<>如果我是C++,我会使用<代码> STD::堆栈< /> >从你喜欢的线性代数包中的<代码>矩阵>代码>类,如果你不使用OpenGL来做其他的事情。

< P>我可以建议自己尝试实现这些调用。我曾经为我编写的Palm应用程序做过一次。我学到的是,文档基本上以纯文本形式告诉您所做的事情

i、 e
tglFrustum
tglOrth
的逐字代码是(注意,我使用定点数学来获得一些性能)

将这些与和的手册页进行比较

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

这不是OpenGL的用意。OpenGL是一个绘图/渲染API,不是一个数学库。实际上,由于这个原因,最新的OpenGL版本(OpenGL-3 core和更高版本)中已经去掉了矩阵数学的全部内容


同样,做这个矩阵数学的东西也很简单,你可以用不到1k行的C代码写下来。滥用OpenGL对此毫无益处。

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


“矩阵堆栈可以(而且很可能确实)以多种方式存在于图形硬件上。”不,它们不存在。也许一些古老的SGI工作站会这样做,但还没有PC图形卡将实际堆栈本身放在GPU上。渲染时,当前矩阵(棒的顶部)将传输到那里。但是堆栈本身呢?从来没有。@Nicolabolas-很公平-我认为这很常见,因为每次推送/弹出都会消除主机和设备之间的副本。我将编辑措辞,使该声明不那么强烈,尽管基本点仍然存在,尽管实现可以自由地做他们喜欢做的事情。我知道,但我想做一个快速原型。在做实际工作时,我当然会自己写。@rkan:然后使用一些真正的矩阵数学库。设置OpenGL上下文太复杂了。而且OpenGL不是一个数学库。这一点我再怎么强调也不为过。
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);  
}