我可以推薦嘗試自己實現這些調用。我曾經爲我寫的一個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
「矩陣堆棧可以(而且很可能不會)在多種實施方式住在圖形硬件。」不,他們沒有。也許是一些古老的SGI工作站,但是沒有一款PC顯卡將實際的_stack本身放在了GPU上。當前矩陣(棒的頂部)在渲染時被轉移到那裏。但堆棧本身?決不。 –
@NicolBolas - 足夠公平 - 我認爲這很常見,因爲它會消除主機和設備之間的每次推/推流的副本。我會編輯這些措辭以使這種說法不那麼強烈,儘管基本點仍然存在,儘管這些實現可以自由地按照自己的意願去做。 – Flexo