关于C ++:OpenGL Quad不渲染

opengl quad not rendering

我有一个来自书本示例的GL_QUADS,我把颜色变成了黑色,但我仍然不明白,我得到的只是我的白色屏幕
有什么问题吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include"SDL.h"
#include"SDL_opengl.h"
#include <iostream>
int main(int argc, char* args[])
{
    // Memory usage specifics
    SDL_Init(SDL_INIT_EVERYTHING);
    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_ALPHA_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_BUFFER_SIZE, 32 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    // name on the window
    SDL_WM_SetCaption("our first game", NULL );

    //set screen
    SDL_SetVideoMode(600,400,32, SDL_OPENGL);

    // when screen is clear
    glClearColor(1,1,1,1); //red, green, blue, alpha

    //portion to display
    glViewport(0,0,600,400);

    //shade
    glShadeModel(GL_SMOOTH);

    // 3D or 2D
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); //saves

    //if only 2D?
    glDisable(GL_DEPTH_TEST);
    //this handles the main loop
    bool isRunning = true;
    //this is for the events
    SDL_Event event;

    //main rectangle
    float myX = 300;
    float myY = 350;
    float width = 50;
    float height = 30;

    //main loop
    while ( isRunning )
    {
        //EVENTS
        while ( SDL_PollEvent(&event) )
        {
            //logic that should happen for certain events
            //quiting the window
            if ( event.type == SDL_QUIT )
            {
                isRunning = false;
            }
            // if ESC pressed
            if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE )
            {
                isRunning = false;
            }
        }
        //LOGIC

        //RENDERING TO THE SCREEN
         glClear(GL_COLOR_BUFFER_BIT);
         //start rendering phase
         glPushMatrix();
         //set the matix
         glOrtho(0,600,400,0,-1,1);
         //black color
         glColor4ub(0,0,0,255);

         //drawing
         //GL_QUADS, GL_POINTS, GL_LINES, GL_LINE_STRIP,
         //GL_LINE_LOOP, GL_QUADS, GL_TRIANGLES, GL_POLIGON

         glBegin(GL_QUADS);
            glVertex2f(myX,myY);
            glVertex2f(myX+width,myY);
            glVertex2f(myX+width,myY+height);
            glVertex2f(myX,myY+height);
         glEnd();



        //render
        SDL_GL_SwapBuffers();
    }
    //house keeping
    SDL_Quit();
    return 0;
}

这不足为奇,由于此行,您正在等待堆栈溢出:

1
2
//start rendering phase
glPushMatrix();

每帧,您将"当前"矩阵推到堆栈的顶部,并且从不弹出任何内容。最终,您将溢出并且glOrtho(0,600,400,0,-1,1);将具有未定义的结果。

我可能会问为什么您首先将矩阵推到堆栈上?如果您重写每帧上的投影矩阵,您的代码将可以正常工作。

这些行也让我感到困惑:

1
2
3
// 3D or 2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //saves

glLoadIdentity (...)不保存任何内容,而是将一个单位矩阵写入当前矩阵:

1
2
3
4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

由于glOrtho (...)与当前矩阵相乘,因此我实际上将第二个替换了我提到的第一个花絮。这样,您将始终产生相同的结果,而不是乘以矩阵的先前值。

但是,更重要的是,假设您从不在代码的其他任何地方修改矩阵,则不必在每次绘制时都设置投影矩阵。 OpenGL会在缓冲区交换,清除等操作中保留其所有矩阵的状态。状态不会因为您开始新的帧而简单消失。