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

时间:2019-07-14 18:59:25

标签: c++ opengl opengl-compat

这是最简单的代码,但不代表任何内容。那是不可能的。
一切似乎都是绝对正确的。但是,我只看到黑色背景。
它一直可以正常工作,但现在却不起作用。
颜色正确,蓝色三角形应该可见。但是什么都没有。

代码:

#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;
}

1 个答案:

答案 0 :(得分:3)

问题是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]。