代码之家  ›  专栏  ›  技术社区  ›  Dhruv Chadha

简单openGL线条绘制程序没有输出?

  •  1
  • Dhruv Chadha  · 技术社区  · 8 年前

    我无法理解为什么我没有得到给定程序的任何输出。在我的前两个openGL程序中,这个问题一直在发生,前一个是DDA算法,在其中我也没有得到任何输出。算法有问题吗,或者我对openGL内部工作方式的理解有问题吗?

    #include <iostream>
    #include <GL/glut.h>
    using namespace std;
    float X1 = 0, X2 = 100, Y1 = 0, Y2 = 400, X11, Y11, X22, Y22, slope, dely, delx, c, intercept, pi;
    float absl(float x) {
        if (x >= 0) return x;
        return -1*x;
    }
    void drawScene() {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, 500, 0, 500);
        glClearColor(1.0, 1.0, 1.0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0, 0.0, 0.0);
        //start bresenham algo
        glBegin(GL_POINTS);
            glVertex2f(X1, Y1);
            while(X1 <= X2) {
                X1++;
                if(pi < 0) {
                    glVertex2f(X1, Y1);
                }
                else {
                    Y1++;
                    glVertex2f(X1, Y1);
                }
                float flag = (pi >= 0);
                pi = pi + 2*dely - 2*delx*flag;
            }
        glEnd();
        //end DDA algo
        glFlush();
    }
    
    int main(int argc, char **argv) {
        //cin >> X1 >> Y1 >> X2 >> Y2;
        // dely = Y2 - Y1;
        // delx = X2 - X1;
        // pi = 2*dely - delx;
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(500, 500);
        glutInitWindowPosition(0,0);
        glutCreateWindow("DDA");
        glutDisplayFunc(drawScene);
        glutMainLoop();
        return 0;
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Rabbid76    8 年前

    gluOrtho2D 定义二维正交投影矩阵。但它还将矩阵堆栈上的当前矩阵与正交投影矩阵相乘,并用乘积替换当前矩阵。

    注意,在OpenGL固定函数管道中,所有矩阵操作都是这样工作的(除了 glPushMatrix , glPopMatrix , glLoadMatrix 和 glLoadIdentity ).

    这意味着您必须用单位矩阵替换当前矩阵( glLoadIdentity ),在应用正交投影矩阵之前:

    glLoadIdentity();
    gluOrtho2D(0, 500, 0, 500);
    

    或者你会 gluOrtho2D 在主功能中启动主循环之前,只需执行一次:

    gluOrtho2D(0, 500, 0, 500);
    glutMainLoop();
    


    由于调用了显示功能( drawScene )应连续使用本地控制变量,而不是修改 X1 和 Y1 :

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 500, 0, 500);
    glClearColor(0.0, 0.0, 0.0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    //start bresenham algo
    int x = X1, y = Y1;
    glBegin(GL_LINES);
    glVertex2f(100, 400);
    glVertex2f(400, 100);
    glEnd();
    glBegin(GL_POINTS);
        glVertex2f(x, Y1);
        while(x <= X2) {
            x ++;
            if(pi < 0) {
                glVertex2f(x, y);
            }
            else {
                y ++
                glVertex2f(x, y);
            }
        }
        int flag = (pi >= 0);
        pi = pi + 2*dely - 2*delx*flag;
    glEnd();
    
    推荐文章