2012-03-25 109 views
1

我對OpenGL渲染的理解是,如果沒有深度測試,對象將按順序繪製,以便您調用的最後一個渲染函數將在已繪製的任何頂部繪製其形狀。我發現,這似乎不是然而情況:OpenGL回到正面渲染

glDisable(GL_DEPTH_TEST); 
glDisable(GL_ALPHA_TEST); 


glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_QUADS); 
{ 
    glVertex2f(50, 50); 
    glVertex2f(100, 50); 
    glVertex2f(100, 100); 
    glVertex2f(50, 100); 
} 
glEnd(); 


glColor3f(0.0, 0.0, 1.0); 
glBegin(GL_QUADS); 
{ 
    glVertex2f(30, 60); 
    glVertex2f(110, 60); 
    glVertex2f(110, 90); 
    glVertex2f(30, 90); 
} 
glEnd(); 

甚則藍色方塊,這是我所期待下的紅色方塊,這些電話給我了一個藍色方塊紅色方塊!

我不明白OpenGL渲染是如何工作的嗎?或者我只是想念一些不會讓藍色方塊渲染的選項或配置?我正在使用一個自定義(但非常簡單)的着色器,會改變什麼嗎?

this問題的非接受答案似乎意味着順序渲染實際上並沒有發生,並且是實現特定的,但其接受的答案意味着實際上是這種情況。

什麼是進行第二次呼叫的最佳方式?我並不是真的想要擁有某種全球性的價值,我在整個計劃中不斷增加。

+0

也許你正在從「後面」看現場?你的MV和P矩陣是什麼樣的? – aib 2012-03-25 10:38:10

+0

啊!事實證明,我有一個混合功能啓用某個地方,這是放棄了繪製的值的顏色。 – Tomas 2012-03-25 12:11:31

回答

4

您調用的渲染函數將在任何已繪製的頂部繪製其形狀。

沒錯。

我發現,這似乎不是然而情況:

這個工作對我來說:

#include <SDL/SDL.h> 
#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <math.h> 

static int scrWidth = 640; 
static int scrHeight = 480; 

int main(int argc, char** argv){ 
    SDL_Init(SDL_INIT_VIDEO); 

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); 

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){ 
     fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480); 
     SDL_Quit(); 
     return -1; 
    } 
    glewInit(); 

    SDL_ShowCursor(SDL_DISABLE); 

    glClearColor(0.2, 0.2, 0.2, 0.2); 
    glClearDepth(1.0); 

    glEnable(GL_DEPTH_TEST); 

    bool running = true; 
    while (running){ 
     SDL_Event event; 
     if (SDL_PollEvent(&event)){ 
      switch(event.type){ 
       case SDL_QUIT: 
        running = false; 
        break; 
      }; 
     } 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(0, scrWidth, scrHeight, 0); 

     glColor3f(1.0f, 0.0f, 0.0f); 
     glBegin(GL_QUADS); 
     glVertex2f(50, 50); 
     glVertex2f(100, 50); 
     glVertex2f(100, 100); 
     glVertex2f(50, 100); 
     glEnd(); 


     glColor3f(0.0, 0.0, 1.0); 
     glBegin(GL_QUADS); 
     glVertex2f(30, 60); 
     glVertex2f(110, 60); 
     glVertex2f(110, 90); 
     glVertex2f(30, 90); 
     glEnd(); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glFlush(); 
     SDL_GL_SwapBuffers();  
    } 

    SDL_Quit(); 
    return 0; 
} 

與您的代碼進行比較,看看是否有區別。也許你並沒有真正禁用depthtest。如果在代碼中使用模板緩衝區並使用模板緩衝區參數的某些組合(如glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);),也可能會遇到同樣的問題。如果您忘記使用glClear並在第一個和第二個多邊形之間插入「交換緩衝區」,您也可以獲得相同的效果。

上午使用自定義(但非常簡單)的着色器,會改變什麼嗎?

是的,它可以改變一切。但是,在這種情況下,這意味着您沒有提供足夠的信息來幫助您解決問題you。當你需要幫助你的代碼,你應該發佈完整功能,但最小例子說明你的問題。 「遺忘」發佈這個例子是一個壞主意。

+0

事實證明,我有一些混合功能問題,但您在設置示例時的正確性會讓我知道我的項目中其他地方的問題,所以我接受您的答案 – Tomas 2012-03-25 12:12:24