为什么 OpenGL 不在这段代码中绘制多边形?

Why doesn't OpenGL draw a polygon in this code?

这里是最简单的代码,但不代表什么。这不可能。
一切似乎都是绝对正确的。但是,我只看到黑色背景。
以前一直可以,但现在不行了。
颜色正确,应该可以看到蓝色三角形。但是什么都没有。

代码:

#include <iostream>
#include <chrono>
#include <GL/glut.h>

using namespace std;

constexpr auto FPS_RATE = 60;
int windowHeight = 600, windowWidth = 600;

void init();
void displayFunction();
void idleFunction();
double getTime();

double getTime()
{
    using Duration = std::chrono::duration<double>;
    return std::chrono::duration_cast<Duration>(
        std::chrono::high_resolution_clock::now().time_since_epoch()
        ).count();
}

const double frame_delay = 1.0 / FPS_RATE;
double last_render = 0;

void init()
{
    glutDisplayFunc(displayFunction);
    glutIdleFunc(idleFunction);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-windowWidth / 2, windowWidth / 2, -windowHeight / 2, windowHeight / 2);
}

void idleFunction()
{
    const double current_time = getTime();
    if ((current_time - last_render) > frame_delay)
    {
        last_render = current_time;
        glutPostRedisplay();
    }
}

void displayFunction()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_POLYGON);
    glColor3i(0, 0, 1);

    glVertex2i(-50, 0);
    glVertex2i(50, 0);
    glVertex2i(0, 50);
    glVertex2i(100, 50);

    glEnd();
    glutSwapBuffers();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(windowWidth, windowHeight);
    glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - windowWidth) / 2, (GetSystemMetrics(SM_CYSCREEN) - windowHeight) / 2);
    glutCreateWindow("Window");
    init();
    glutMainLoop();
    return 0;
}

问题是glColor3i

什么时候使用

glColor3f(0, 0, 1.0f);

然后您会看到一个完整的蓝色多边形。但是当你要使用glColor3i的时候,那么颜色就得设置成

glColor3i(0, 0, 2147483647); // 2147483647 == 0x7fffffff

获得具有相同蓝色的多边形。

当您使用带有整数有符号参数的 glColor 版本时,如 glColor3bglColor3sglColor3i,则整数值的完整范围是映射到浮点范围 [-1.0, 1.0]。因此,对于 glColor3i,[−2.147.483.648, 2.147.483.647] 范围内的整数值映射到 [-1.0, 1.0](参见 Common integral data types)。

glColor 的无符号版本如 glColor3ubglColor3usglColor3ui 将整数值映射到范围 [0.0, 1.0]。例如 glColor3ub 将参数从 [0, 255] 映射到 [0.0, 1.0]。