OpenGL不会让我画一个东西

时间:2012-07-26 03:06:47

标签: c++ windows opengl glut

我在我的代码中遇到了这个奇怪的错误,它不会让我画任何东西......

void render(void) {
    glClear(GL_COLOR_BUFFER_BIT);

    glLineWidth(4.0);
    glPointSize(4.0);
    glColor3i(0, 1, 1);
    glBegin(GL_POINTS);
        glVertex2i(0, 0);
        glVertex2i(2, 2);
        glVertex2i(3, 3);
    glEnd();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    int Largura, Altura;

    //width
    Largura = (abs(Plano::MinX) * Plano::EspacoPix) + (abs(Plano::MaxX) * Plano::EspacoPix);
    //height
    Altura  = (abs(Plano::MinY) * Plano::EspacoPix) + (abs(Plano::MaxY) * Plano::EspacoPix);
    // these are cartesian coordinates,
    // at class Plano: enum Dimension {MinY=-50, MaxY=50, MinX=-50, MaxX=50, EspacoPix=5};

    glutInit(&argc, argv);
    glutInitWindowPosition(-1, -1);
    glutInitWindowSize(Largura, Altura);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glClearColor(1, 1, 1, 1);
    glutCreateWindow("Graphix");
    glMatrixMode(GL_PROJECTION);
    //glEnable(GL_POINT_SMOOTH);
    //glEnable(GL_LINE_SMOOTH);
    gluOrtho2D(Plano::MinX, Plano::MaxX, Plano::MinY, Plano::MaxY); // left, right, bottom, top

    glutDisplayFunc(render);
    glutIdleFunc(render);


    std::cout << "[Dbg] Dimensions:  Height=" << Altura << "px Width=" << Largura << "px " << std::endl;
    std::cout << "[Dbg] Ortho: Left=" << Plano::MinX << ", Right=" << Plano::MaxX << ", Bottom=" << Plano::MinY << ", Top=" << Plano::MaxY << std::endl;
    //glGet with argument GL_COLOR_CLEAR_VALUE
    float cores[4] = {-1, -1, -1, -1}; // defaults
    glGetFloatv(GL_COLOR_CLEAR_VALUE, cores);
    std::cout << "[Dbg] Color Buffer: R=" << cores[0] << " G=" << cores[1] << " B=" << cores[2] << " A=" << cores[3] << std::endl;


    glutMainLoop();
    return(0);
}

所有我得到的是一个黑色的屏幕和颜色缓冲区,我虽然会是1,1,1,1实际上是0,0,0,0 ...如果我错了但是中心纠正我屏幕是,因为gluOrtho2D调用,x = 0,y = 0,对吗?对? :)

2 个答案:

答案 0 :(得分:4)

glClearColor必须在glutCreateWindow之后调用,因为尚未创建OpenGL上下文。

另请注意,您正在学习过时的OpenGL编程技术。

glColor,glBegin,glEnd,glVertex *,glColor * glMatrixMode,gluOrtho2D,glu *现在都被弃用了。

有些人认为他们可能是学习者,但我认为这不会太多,所有这些都是你必须要忘记的。

glBegin()和glEnd()会让你在一个非常慢的时间绘制1个顶点的对象。

新方法涉及将坐标放入浮点数组并将其发送到图形卡以立即绘制所有浮点数。没有理由使用那些旧的东西,因为OpenGL 1.1(1997年发布)已经支持Vertex Arrays(虽然它们现在也被弃用,而是被Vertex Buffer Objects(或VBOs)取代,它们在功能上相似并且有自1.5以来一直在OpenGL(2005年发布)。

我建议您查看http://www.opengl-tutorial.org/以获取对初学者来说不难的新教程。

我的回复也是:https://gamedev.stackexchange.com/questions/32876/good-resources-for-learning-modern-opengl-3-0-or-later/32917#32917

答案 1 :(得分:0)

之前我没有做太多的OpenGL 2编码,但我认为你需要在调用glBegin之前调用glLoadIdentity()并且你需要在glMatrixMode之前调用glLoadIdentity()。