직접 이러한 호출을 구현하는 것이 좋습니다. 내가 쓴 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 워크 스테이션은 그렇지만 실제 GPU에 실제 _stack 자체를 넣은 PC 그래픽 카드는 없었습니다. 현재 행렬 (스틱의 상단)은 렌더링 할 때 거기로 전송됩니다. 하지만 스택 자체? 못. –
@NicolBolas - 공정하게 - 나는 모든 푸시/팝에 대해 호스트와 장치 사이의 복사본을 없애기 때문에 일반적이라고 생각했습니다. 이 문장을 덜 강하게 만들기 위해 문구를 편집 하겠지만, 구현은 자유롭게 수행 할 수 있지만 기본 사항은 그대로 유지됩니다. – Flexo