2011-10-09 3 views
0

나는 렌더링을 위해서가 아니라 행렬 스택을 위해서만 openGL을 사용하고자하는 win32 애플리케이션을 가지고있다. 다시 말하면, OpenGL을 사용하여 카메라, 뷰포트 등을 지정하여 수학을 다시하지 않아도됩니다. 장면을 만드는 동안 gluProject를 사용하여 포인트를 투영하고 사용하고 싶습니다. 투영 된 점은 나를위한 장면을 생성하는 다른 라이브러리로 전달되고, 모든 윈도우 핸들은 라이브러리 자체에 의해 만들어지며 액세스 할 수 없습니다.행렬 스택을위한 openGL

문제는 Windows에 초기화를위한 장치 컨텍스트가 필요하다는 것입니다. 그러나, 렌더링을 위해 openGL을 사용하지 않기 때문에 OpenGL을 사용하지 않고 Window 핸들을 사용하는 방법이 있습니까?

명시 적 초기화가 없으면 glGet을 사용하여 행렬을 다시 읽을 때 가비지를 반환합니다. 그것을 고치는 방법에 대한 어떤 생각?

답변

3

매트릭스 스택은 구현시 그래픽 하드웨어에있을 수 있습니다. OpenGL은 그러한 기능을 사용할 수 있으려면 OpenGL 컨텍스트가 있어야한다고 주장하는 것이 좋습니다. 이것은 컨텍스트를 만드는 행위가 아마도 행렬 스택을 저장하는 데 필요한 구현 메커니즘을 설정하는 것을 포함하기 때문입니다.

순전히 소프트웨어 기반의 OpenGL 구현에서도 스택의 저장 공간을 확보하기 위해 malloc과 같은 것을 호출하는 컨텍스트를 만드는 행위가 여전히 기대됩니다. 컨텍스트를 만들 필요가없는 OpenGL 구현을 찾은 경우에는 그 동작에 의존하지 않아도 될 가능성이 높습니다. 그 이유는 정의되지 않았을 가능성이 높기 때문에 구현의 다음 릴리스에서 깨질 수 있기 때문입니다.

C++의 경우 OpenGL을 다른 용도로 사용하지 않는 경우 좋아하는 선형 대수 패키지의 클래스를 Matrix 클래스로 사용하고 싶습니다.

+1

는 "매트릭스 스택 (가능성 않습니다) 구현의 여러 그래픽 하드웨어에 살 수 있습니다." 아니 그들은하지 않습니다.어쩌면 일부 고대 SGI 워크 스테이션은 그렇지만 실제 GPU에 실제 _stack 자체를 넣은 PC 그래픽 카드는 없었습니다. 현재 행렬 (스틱의 상단)은 렌더링 할 때 거기로 전송됩니다. 하지만 스택 자체? 못. –

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

이 남자 glFrustum에 대한 페이지와 glOrtho

6

과 그 비교 (나는 약간의 성능을 얻기 위해 수정 소수점 연산을 사용하고 있습니다)하는, 즉 나는 렌더링을 위해서가 아니라 행렬 스택을 위해서만 openGL을 사용하고 싶다.

그건 OpenGL의 의미가 아닙니다. OpenGL은 드로잉/렌더링 API 인 이 아니며 수학 라이브러리입니다. 실제로 전체 행렬 수학 문제는 바로 그 이유 때문에 최신 OpenGL 버전 (OpenGL-3 코어 이상)에서 제거되었습니다.

또한이 행렬 연산은 너무 단순하므로 1k 줄 미만의 C 코드로 작성할 수 있습니다. 이를 위해 OpenGL을 남용하는 데 전혀 도움이되지 않습니다.

+0

알아요.하지만 빠른 프로토 타입을 만들고 싶습니다. 실제 작업을하는 동안, 나는 내 물건으로 물건을 쓰게 될 것이다. – Aarkan

+0

@rkan : 그런 다음 실제 매트릭스 수학 라이브러리를 사용하십시오. OpenGL 컨텍스트 설정은 너무 복잡합니다. 또한 OpenGL은 수학 라이브러리가 아닙니다. 나는 이것을 충분히 강조 할 수 없다. – datenwolf

관련 문제