簡體   English   中英

OpenGL在正交和透視之間切換

[英]OpenGL switching between ortho and perspective

我有一個在即時模式下使用正交投影的圖塊引擎,我只是想在圖塊場景的頂部繪制一個3d立方體,希望最終可以將3d模型而不是精靈/紋理四邊形合並到我的引擎中。 我還想為一點點額外的視覺效果制作瓷磚3d。希望我最終可以將其轉換為使用現代OpenGL,以便我可以利用這些額外的功能。 目前不在我的優先列表中。 這樣就可以了。

我正在初始化OpenGL:

void initGL()
{
    glDisable(GL_DEPTH_TEST);

    glViewport( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT);

    //Initialize Projection Matrix
    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();   

    //Initialize Modelview Matrix
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();       

    glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,0,1);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);     
    //...setting some various other attributes, omitted for brevity...

    glEnable(GL_TEXTURE_2D);
    glClearColor( 0, 0, 0, 0 );
}

我有一個用於繪制有效的多維數據集的功能。

void draw_cube()
{
     /* position object */
    glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
    glRotatef(30.0F, 0.0F, 1.0F, 0.0F);    

    /* draw six faces of a cube */
    glBegin(GL_QUADS);
    ...vertices... (removed for brevity)
    glEnd();             
}

我做了2個用於設置2d和3d投影模式的功能。

void set3d()
{
    glEnable(GL_DEPTH_TEST);
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(0,SCREEN_WIDTH,0,SCREEN_HEIGHT, 0,1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void set2d()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,0,1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

為了完整起見,我的紋理四邊形繪圖的一些偽代碼

pushmatrix();
translate();
rotate();
-translate();

glbegin();
...vertices
glend();
popmatrix();

到目前為止,我已經設法使多維數據集可以在圖塊的頂部繪制,但是它在大約1秒鍾后消失了,直到再次運行該程序后再也看不見。

基本上我在主循環中所做的是這樣的:

move objects around, process collisions, etc.

set2d();
draw textured quads, lines, text, etc. in 2d mode.

set3d();
draw_cube();

我的問題是:為什么多維數據集消失了,我的set2d()和set3d()函數中是否有任何錯誤?

您在此代碼中有很多問題,實際上有太多問題無法在注釋中列出。

  1. 您的投影矩陣正在改變后投影坐標空間的慣用性,這會影響多邊形的纏繞。

    • 堅持單手使用,除非您想反轉用於正面/背面多邊形小平面( glFrontFace (...) )的方向-默認情況下為CCW,但是在使用時必須將其更改為CW set3d (...)保持一致的行為。
    • 出現此問題是因為您的Y軸方向不同

  2. 您所描述的行為,即對象短暫出現然后消失的位置,表明您的矩陣堆棧有問題。

    • 您是否在軟件中多次調用了initGL (...) 如果這樣做次數過多,將會導致堆棧溢出,因為您不必要地將當前矩陣壓入堆棧,並且永遠不會彈出。

  3. 您不能將zNear的0.0與透視投影矩陣一起使用,這將導致在轉換為剪貼空間的透視除法步驟中出現數學運算不穩定; 深度緩沖區將無法正常工作。

    • 事實上, glFrustum (...)將產生GL_INVALID_VALUE錯誤,如果你通過≤0.0 zNear值做完全沒有 值得一提的是,由於gluPerspective (...)實際上不是OpenGL的一部分,因此不會執行此操作,但是將此類值傳遞給gluPerspective (...)同樣無效。

暫無
暫無

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

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