【问题标题】:No output for simple openGL line drawing program?简单的openGL画线程序没有输出?
【发布时间】:2018-01-20 15:39:39
【问题描述】:

我无法理解为什么我没有得到给定程序的任何输出。这个问题一直发生在我最近的 2 个 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;
}

【问题讨论】:

    标签: c++ opengl orthographic bresenham dda


    【解决方案1】:

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

    注意,在 OpenGL 固定函数管道中,所有矩阵运算都是这样工作的(glPushMatrixglPopMatrixglLoadMatrixglLoadIdentity 除外)。

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

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

    或者你在主函数中启动主循环之前只执行一次gluOrtho2D

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


    由于显示函数被连续调用(drawScene),所以应该使用本地控制变量,不要修改X1Y1

    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();
    

    【讨论】:

    • 我已按照您的建议编辑了我的代码,但仍然无法正常工作... :( @Rabbid76
    • 输入我已经全局声明了,X1应该在10到100之间,所以至少应该显示90个点,因为glVertex2f应该被调用90次。
    • 这一切在后端如何运作?我正在清除帧上的所有点,但我不是也在每一帧上打印所有点吗?一次 glClear() 被调用,90 次 glVertex2f() 被调用。
    • @DhruvChadha 在第二帧X1X2 开头,因为你在第一帧修改了它。使用局部变量,不要修改 X1Y1。请参阅我的答案的第二部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多