[英]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()函數中是否有任何錯誤?
您在此代碼中有很多問題,實際上有太多問題無法在注釋中列出。
您的投影矩陣正在改變后投影坐標空間的慣用性,這會影響多邊形的纏繞。
glFrontFace (...)
)的方向-默認情況下為CCW,但是在使用時必須將其更改為CW set3d (...)
保持一致的行為。 您所描述的行為,即對象短暫出現然后消失的位置,表明您的矩陣堆棧有問題。
initGL (...)
? 如果這樣做次數過多,將會導致堆棧溢出,因為您不必要地將當前矩陣壓入堆棧,並且永遠不會彈出。 您不能將zNear的0.0與透視投影矩陣一起使用,這將導致在轉換為剪貼空間后的透視除法步驟中出現數學運算不穩定; 深度緩沖區將無法正常工作。
glFrustum (...)
將產生GL_INVALID_VALUE
錯誤,如果你通過≤0.0 zNear值做完全沒有 。 值得一提的是,由於gluPerspective (...)
實際上不是OpenGL的一部分,因此不會執行此操作,但是將此類值傳遞給gluPerspective (...)
同樣無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.