簡體   English   中英

opengl不顯示renderFunction的輸出

[英]opengl not showing output from renderFunction

我正在使用opengl實現此dda算法。 但是,由於某種原因,它不會繪制第二行。 我嘗試將printf放在每一行,這表明它正在執行。 但是,我的窗口中沒有輸出

#include <GL/gl.h>
#include <GL/glut.h>
#include <stdio.h>

int choice = 0;

void DDA(x0, y0, x1, y1)
const x0, y0, x1, y1;
{
    glOrtho(-500, 500, -500, 500, -1, 1);
    float dx = x1 - x0;
    float dy = y1 - y0;
    int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
    float xInc = (float)steps/dx;
    float yInc = (float)steps/dy;
    int x = x0, y = y0;
    for(int i = 0; i < steps; i++) {
        glBegin(GL_POINTS);
            glColor3f(1.0, 3.0, 2.0);
            glVertex2i(x, y);
            x += xInc;
            y += yInc;
        glEnd();
        glFlush();
    }
}

void Bresenham(x0, y0, x1, y1)
const x0, y0, x1, y1;
{
    glOrtho(-500, 500, -500, 500, -1, 1);
    int x = x0;
    int y = y0;
    int dx = x1 - x0;
    int dy = y1 - y0;
    int p = 2*dy-dx;
    int m = dy / dx;
    glBegin(GL_POINTS); {
        glColor3f(2.0, 3.0, 5.0);
        while(x != x1) {
            if(m < 1) {
                glVertex2i(x, y);
                x++;
                if(p >= 0) {
                    p += 2*(dy - dx);
                    y++;
                }
                else {
                    p += 2*dy;
                }
            }
            else {
                glVertex2i(x, y);
                y++;
                if(p >= 0) {
                    p += 2*(dx - dy);
                    x++;
                }
                else {
                    p += 2*dx;
                }
            }
        }
        glVertex2i(x, y);
    }
    glEnd();
    glFlush();
}

void circle(x0, y0, r)
const x0, y0, r;
{

}

void renderDDA(void) {
    DDA(0, 0, 300, 400);
    DDA(0, 0, 200, 200);
}

void renderBresenham(void) {
    Bresenham(0, 0, 300, 100);
    Bresenham(0, 0, 500, 0);
}

void renderCircle(void) {

}

main(argc, argv)
char** argv;
{
redo:   
    printf("ENTER YOUR CHOICE: ");
    scanf("%d", &choice);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(1920, 1680);
    glutCreateWindow(argv[1]);
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    switch (choice) {
        case 0:
            glutDisplayFunc(renderDDA);
            break;
        case 1:
            glutDisplayFunc(renderBresenham);
            break;
        case 2:
            glutDisplayFunc(renderCircle);
            break;
        default:
            printf("NO SUCH CHOICE!!");
            goto redo;
    }
    glutMainLoop();
return 0;
}

我也嘗試過換線。 然后,它僅繪制上線。 它確實執行第二次調用。

glOrtho不設置正交投影,它定義了正交投影矩陣並將當前矩陣乘以正交投影矩陣。

您必須在調用glOrtho之前設置單位矩陣:

glLoadIdentity();
glOrtho(-500, 500, -500, 500, -1, 1);

此外,算法中存在問題。 xy的類型必須為float 如果將結果截斷為int ,則只能繪制與45度的倍數對齊的角度的線,因為xy在每一步都精確地由0或1改變:

float x = x0, y = y0;
for(int i = 0; i < steps; i++) {
    glBegin(GL_POINTS);
        glColor3f(1.0, 3.0, 2.0);
        glVertex2i((int)(x+0.5f), (int)(y+0.5f));
        x += xInc;
        y += yInc;
    glEnd();
} 

注意,將類型從int更改為float會導致對xy進行全精度跟蹤。 glVertex2i((int)(x+0.5f), (int)(y+0.5f))確保繪制點時將坐標( xy )舍入到整數位置。


我建議投影矩陣的設定從並移動glFlushDDA分別BresenhamrenderDDA分別renderBresenham

void DDA(float x0, float y0, float x1, float y1)
{
    float dx = x1 - x0;
    float dy = y1 - y0;
    int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
    float xInc = (float)steps/dx;
    float yInc = (float)steps/dy;
    float x = x0, y = y0;
    for(int i = 0; i < steps; i++) {
        glBegin(GL_POINTS);
            glColor3f(1.0, 3.0, 2.0);
            glVertex2i((int)(x+0.5f), (int)(y+0.5f));
            x += xInc;
            y += yInc;
        glEnd();
    }
}

void Bresenham(float x0, float y0, float x1, float y1)
{
    int x = x0;
    int y = y0;
    int dx = x1 - x0;
    int dy = y1 - y0;
    int p = 2*dy-dx;
    int m = dy / dx;
    glBegin(GL_POINTS); {
        glColor3f(2.0, 3.0, 5.0);
        while(x != x1) {
            if(m < 1) {
                glVertex2i(x, y);
                x++;
                if(p >= 0) {
                    p += 2*(dy - dx);
                    y++;
                }
                else {
                    p += 2*dy;
                }
            }
            else {
                glVertex2i(x, y);
                y++;
                if(p >= 0) {
                    p += 2*(dx - dy);
                    x++;
                }
                else {
                    p += 2*dx;
                }
            }
        }
        glVertex2i(x, y);
    }
    glEnd();
}

void renderDDA(void) {
    glLoadIdentity();
    glOrtho(-500, 500, -500, 500, -1, 1);
    DDA(0, 0, 300, 400);
    DDA(0, 0, 200, 200);
    glFlush();
    glutSwapBuffers();
}

void renderBresenham(void) {
    glLoadIdentity();
    glOrtho(-500, 500, -500, 500, -1, 1);
    Bresenham(0, 0, 300, 100);
    Bresenham(0, 0, 500, 0);
    glFlush();
    glutSwapBuffers();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM