2011-10-09 76 views
0

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

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

没有任何显式的初始化,当我使用glGet读回矩阵时,它返回一个垃圾。任何想法如何解决它?

回答

3

矩阵堆栈可能存在于实现中的图形硬件上。 OpenGL是非常合理的,因此坚持要有OpenGL上下文才能使用这些功能。这是因为创建上下文的行为可能包括设置存储矩阵堆栈所需的必要实现机制。

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

如果是C++的话,我只是使用std::stackMatrix类从你最喜欢的线性代数包,如果你不使用OpenGL除此之外的任何东西。

+1

“矩阵堆栈可以(而且很可能不会)在多种实施方式住在图形硬件。”不,他们没有。也许是一些古老的SGI工作站,但是没有一款PC显卡将实际的_stack本身放在了GPU上。当前矩阵(棒的顶部)在渲染时被转移到那里。但堆栈本身?决不。 –

+0

@NicolBolas - 足够公平 - 我认为这很常见,因为它会消除主机和设备之间的每次推/推流的副本。我会编辑这些措辞以使这种说法不那么强烈,尽管基本点仍然存在,尽管这些实现可以自由地按照自己的意愿去做。 – Flexo

0

我可以推荐尝试自己实现这些调用。我曾经为我写的一个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); 
} 

比较那些与该男子页glFrustumglOrtho

6

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

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

也做这个矩阵数学的东西是如此的简单,你可以把它写在少于1k行的C代码。为此,滥用OpenGL绝对没有好处。

+0

我知道但我想做一个快速原型。在做实际工作的同时,我会自己写这些东西。 – Aarkan

+0

@rkan:然后使用一些真正的矩阵数学库。设置OpenGL上下文太复杂了。另外OpenGL不是一个数学库。我不能强调这一点。 – datenwolf