簡體   English   中英

適用於矩陣堆棧的openGL

[英]openGL for matrix stack

我有一個win32應用程序,在其中我想僅將openGL用於其矩陣堆棧而不用於任何渲染。 也就是說,我想使用openGL指定攝影機,視口等,這樣我就不必再次進行數學運算。 創建場景時,我只想使用gluProject投影點並使用它。 投影點將傳遞到另一個為我創建場景的庫中,所有窗口句柄均由庫本身創建,而我無權訪問。

問題是,Windows需要設備上下文進行初始化。 但是,由於我沒有使用openGL進行任何渲染,有沒有辦法完全不使用任何Window句柄來使用openGL?

沒有任何顯式的初始化,當我使用glGet讀回矩陣時,它將返回垃圾。 關於如何解決它的任何想法?

我只想將openGL用於其矩陣堆棧,而不用於任何渲染。

那不是OpenGL的意思。 OpenGL是繪圖/渲染API, 而不是數學庫 出於這個原因,實際上,整個矩陣數學知識已經從最新的OpenGL版本(OpenGL-3內核和更高版本)中剝離了。

進行矩陣數學運算也非常簡單,您可以用不到1k行的C代碼將其記錄下來。 為此濫用OpenGL絕對沒有好處。

在您的實現中,Matrix堆棧可能存在於圖形硬件上。 OpenGL非常合理,因此堅持要求您具有OpenGL上下文才能使用此類功能。 這是因為創建上下文的動作可能包括設置存儲矩陣堆棧所需的必要實現機制。

即使在完全基於軟件的OpenGL實現中,人們仍然期望創建上下文的行為來調用等效於malloc來保護堆棧的存儲空間。 如果您偶然發現不需要創建上下文的OpenGL實現,那么我仍然避免依賴於該行為,因為它很可能是未定義的,並且可能在該實現的下一個版本中被破壞。

如果是C ++,如果您不使用OpenGL進行其他操作, std::stackstd::stack與您最喜歡的線性代數包中的Matrix類一起使用。

我向您介紹我完整的(開源)矩陣類。 請享用。

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);  
}

將其與glFrustumglOrtho的手冊頁進行比較

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM