OpenGL中的简单图形管道

时间:2014-03-06 10:43:54

标签: opengl graphics pipeline

我正在阅读Schaum的概述COMPUTER GRAPHICS。 Book说一个简单的图形管道是这样的:几何表示 - >转型 - >扫描转换 (尽管作者决定在转换章之前教授扫描转换章节)。我希望通过openGL中的一个例子来学习这个简单的管道。假设我希望在窗口大小(750,500)中创建一个结束坐标(150,400)和(700,100)的行。下面的代码效果很好。我向专家询问的是解释转换发生时和扫描转换时的“顺序步骤”。我知道这可能听起来很愚蠢,但我真的需要这样做。我只是一个成年初学者,在我自己的学习图形作为一种爱好。 我的猜测是程序中没有发生扫描转换。它由glGL在glBegin和glEnd调用之间自动完成。 我是对的吗?

#include <GL/glut.h>

void init(void)
{
        glClearColor (0.5, 0.2, 0.3, 0.0);
        glClear (GL_COLOR_BUFFER_BIT);      
        glColor4f(0.5,0.7,0.3,0.0);
        glLineWidth(3);
}

void display(void)
{
    glBegin(GL_LINES);
    glVertex2i(50, 400);
    glVertex2i(700, 100);
    glEnd();

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

int main (int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(100,150);
    glutInitWindowSize(750,500); // aspect ratio of 3/2
    glutCreateWindow (argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();         // this is when the frame buffer is displayed on the screen
    return (0);
}

1 个答案:

答案 0 :(得分:1)

在OpenGL实现中完成的所有阶段(主要在硬件中)。你指定状态和数据,然后GL将 - 如果用旧GL 1.0说话 - 将数据组装成顶点,通过转换阶段传递每个顶点,将生成的基元光栅化为片段,执行每片段测试(可能丢弃一些片段),并在渲染目标上更新结果像素。

用户代码中没有任何意义可能在管道中的“一个阶段” - 它没有回调,并且通常尽可能多的阶段同时工作。