在3D上的OpenGL 2d HUD不会渲染任何东西

时间:2013-11-05 15:00:21

标签: c++ opengl 3d 2d sdl

我正在玩OpenGL和SDL。目前,我正试图让HUD显示在一些3d旋转立方体上。然而,当我添加代码以在3d形状之后绘制2d四边形时,我得到了死亡的黑屏。现在没有任何渲染,包括以前工作的3D形状,所以它似乎不是一个深度问题。

我在做什么:

_SETUP_

Make a new SDL window.

Enable lighting and make a new light. 

Enable depth.

_GAMELOOP_

Switch the matrix to GL_PROJECTION and make a new perspective view.

Switch back to the GL_MODELVIEW matrix.

Draw some shapes.

Switch the matrix back to GL_PROJECTION and make a new ortho view.

Switch back to the GL_MODELVIEW matrix.

Draw a 2d shape.

代码(有点凌乱,我道歉),绘制一个10x10的旋转立方体墙并让它们改变颜色:

int main(int argc, char **argv)
{
srand(12);

int x = 0, i, j, k;
Coordinate ang, pos;
Color color, colorMod;
SDL_Event event;
bool quit = false;

color.r = 0;
color.g = 0;
color.b = 0;

colorMod.r = .01;
colorMod.g = .05;
colorMod.b = .03;

pos.x = -5;
pos.y = -5;
pos.z = -40.0f;

SDL_Init(SDL_INIT_EVERYTHING);

SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glClearColor(0, 0, 0, 0);
glClearDepth(1.0f);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); 

GLfloat lightpos[] = {10, 10, 10, 1};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

glEnable(GL_COLOR_MATERIAL);

while(quit == false)
{    
    //Draw some cubes
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(40.0, 800.0/600.0, 0.5, 20.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
    glLoadIdentity();                                    

    for(i=0;i<10;i++)
    {
        pos.x += 2;

        for(j=0;j<10;j++)
        {
            pos.y += 2;
            glPushMatrix();
            drawACube(ang, pos, color);
            glPopMatrix();
        }

        pos.y = -10;
    }

    pos.x = -10; 

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 800, 600, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();

    glBegin(GL_QUADS);

    glColor3f(color.r, color.g, color.b);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);

    glEnd();

    glPopMatrix();  

    //Swap and FPS delay
    SDL_GL_SwapBuffers();

    SDL_Delay(10);

    //Makes the rotation happen   
    ang.x += .7;
    ang.y += .1;
    ang.z += .1;

    //Monitor for a quit event
    while(SDL_PollEvent(&event))
    {
        if(event.type == SDL_QUIT)
        {
            quit = true;
        }
    }

    //Do the color stuff
    if(color.r > 1)
        colorMod.r = -.01;
    else if(color.r < 0)
        colorMod.r = .01;

    if(color.g > 1)
        colorMod.g = -.05;
    else if(color.g < 0)
        colorMod.g = .05;

    if(color.b > 1)
        colorMod.b = -.03;
    else if(color.b < 0)
        colorMod.b = .03;

    color.r += colorMod.r;
    color.g += colorMod.g;
    color.b += colorMod.b;
}

SDL_Quit();

return 0;
}

void drawACube(Coordinate ang, Coordinate pos, Color color)
{    
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(ang.x, 1.0f, 0.0f, 0.0f);
glRotatef(ang.y, 0.0f, 1.0f, 0.0f);
glRotatef(ang.z, 0.0f, 0.0f, 1.0f); 


glBegin(GL_QUADS);

//Top
glNormal3d(0, 1, 0);
glColor3f(color.r, color.g, color.b);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);


//Bottom
glNormal3d(0, -1, 0);
glColor3f(color.r, color.g, color.b);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

//Front
glNormal3d(0, 0, 1);
glColor3f(color.r, color.g, color.b);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);

//Back
glNormal3d(0, 0, -1);
glColor3f(color.r, color.g, color.b);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);

//Left side
glNormal3d(-1, 0, 0);
glColor3f(color.r, color.g, color.b);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);

//Right side   
glNormal3d(1, 0, 0);
glColor3f(color.r, color.g, color.b);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);

glEnd();
}

编辑:我尝试评论出2d部分,并遇到了上述问题。还更改了上面的代码以删除错误的颜色缓冲区(没有解决问题,但以后可能会出现问题

解决方案:顶部有一条不正确的gluPerspective线,在它之后弄乱了所有东西。感谢您的快速回复,我为错误道歉

1 个答案:

答案 0 :(得分:1)

你的渲染代码中有glClear(GL_COLOR_BUFFER_BIT|…),删除了之前绘制的所有内容。对于HUD,您可能只想清除深度缓冲区,但保持颜色。

在旁注中,您应该在绘制立方体之前向右移动照明设置。您可能不希望用于绘制HUD的照明,因此在绘制HUD之前您将禁用/更改它。