2012-03-25 108 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