2011-10-09 108 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