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