openGL用于矩阵堆栈
openGL for matrix stack
我有一个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::stack
和Matrix
类从你最喜欢的线性代数包,如果你不使用OpenGL的其他任何东西。
我向您展示我的完整(开源)矩阵类。享受。
https://github.com/TheBuzzSaw/paroxysm/blob/master/newsource/CGE/Matrix4x4.h我可以建议您尝试自己实现这些调用。我曾经为自己编写的一个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的手册页进行比较
- 1d 智能指针不适用于语法 (*)++
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 堆还是堆栈用于创建对象?
- RPN计算器使用头文件进行计算操作和堆栈;用于堆栈的矢量
- 同样的逻辑适用于 c++,但在 python 中不适用于堆栈中的最大值,我的代码中是否缺少一些东西
- C 程序用于使用堆栈检查正确的HTML标签
- 链表与动态数组用于使用向量类实现堆栈
- 使用单个堆栈的中缀到后缀不适用于大于 9 的数字
- 用于堆栈分配对象的C++虚拟析构函数内联
- 用于隔离堆栈粉碎错误的工具
- 用于回溯迷宫的堆栈
- 堆栈展开动态创建的对象,该对象的构造函数也作用于堆
- 可用于激活堆栈的内存
- 生产者和使用者函数,用于在操作手册中测试C++并发的线程安全堆栈示例
- 用于生成函数以从运行时堆栈调用带参数的函数的模板
- 用于从堆栈转储和.elf文件中提取FreeRTOS/ARM/ c++堆栈跟踪的工具
- 在堆栈程序中实现一个计数器,用于计算对象移动的次数
- openGL用于矩阵堆栈
- 用于在运行时记录调用堆栈的库(Windows/Linux)
- 为什么范围基本循环不适用于堆中的数组,但适用于堆栈中的数组