Advertisement

《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件

阅读量:
复制代码
       这里是《Computer Graphics with OpenGL》英文原版第四版的读书笔记,预计每一章写一篇读书笔记。
       本篇为第二章,简要介绍计算机图形学的相关软件。
       图形学相关软件可分为两类——专业类、综合类。其中,专业类为非编程人员准备,可提供如美术、CAD绘图等功能。综合类为编程人员使用,可以通过代码直接控制绘图过程。

坐标表示

为了显示放置好的物体在屏幕上,需要经历一系列复杂的步骤,并包含若干次的坐标变换。这些主要步骤包括:1. 确定初始位置;2. 计算每一步的坐标转换;3. 应用这些转换到物体上。

模型局部坐标系:明确各组件内部的精确位置关系。
全局坐标系:将整个模型置于虚拟的世界中。
观察者(摄像机)局部坐标系:将其放置于原点并定义观察方向为正向;系统中的所有顶点位于该局部坐标的相应位置。
标准化显示前处理流程: 将三维数据转换为二维表示并缩放至统一范围[−1,1]区间, 从而消除由于显示设备分辨率差异及比例失真等因素带来的影响。
图像处理单元: 根据实际屏幕参数计算出对应像素坐标的映射关系。

图形函数

一个图形包中有许多不同的功能,可以将其分类如下:

  • 基础图形绘制:包括点、直线、曲线、球体以及圆柱体等的基础图形绘制
  • 属性设置:用于控制基础图形的绘制方式,包括颜色选择(如红色)、线型(如虚线或实线)、填充模式等多种设置选项
  • 几何变换功能:提供大小调整(如缩放)、位置平移以及旋转操作
  • (可选)模型组织功能:通过树状结构将模型的各个组成部分进行组织和连接
  • 显示设置:包含场景视图切换(如主视图或俯视图选择)、投影类型选择(如正交投影或透视投影)、相机位置设置以及光照效果调节等多种操作选项
  • 输入处理:负责接收并处理用户的输入指令
  • 操作控制:提供基本的操作指令管理功能(如屏幕清空功能)

软件标准

为了确保在某一硬件设备上应用图形包完成的工作流程在其他硬件设备上实现良好的跨平台兼容性需求,则有必要明确规定相关的技术规范与操作准则。当前已有的规范体系主要包括

  • 图形内核系统(GKS):作为第一个图形软件标准,在二维领域具有重要地位
  • 图形程序员层次交互式绘图系统(PHIGS)作为图形系统中的关键组件
  • 其衍生版本PHIGS+则增添了一个关键组件——三维渲染技术
  • 图形库(GL)则专为快速实现实时渲染而设计
  • 其中最为人熟知的是OpenGL这一开放光栅处理器,在z=0处通常用于切换至二维投影平面。作为当前最流行的图形API之一,在高性能图形显示方面表现卓越

其它图形包

为了简明扼�地介绍这些技术而不做深入阐述:开放的Inventor、VRML以及Java二维/三维等相关的技术开发平台

OpenGL介绍

基础语法

  • 基本库:以gl开头,并且每个单词的第一个字母大写(如glBegin, glClear等)
    • 符号常量:以GL开头,并且后面跟有划线和大写字母(如GL_2D, GL_RGB等)
    • 特殊数据类型:以GL开头,并且后面跟有小写字母表示不同的类型(如GLbyte, GLshort等)
复制代码
       一些函数的参数会使用指向数组的指针来完成调用。

相关库

  • OpenGL Utility (GLU):其函数名称均以glu开头,并主要涉及景深设置、投影矩阵计算以及对复杂几何体进行近似处理等高级操作。
  • Open Inventor提供了一系列预定义的复杂物体形状及其在三维空间中的应用。
  • OpenGL Utility Toolkit (GLUT):其函数名称均以glut开头,并提供了与多种操作系统(如Windows和Apple等)相连的屏幕显示接口。

头文件

通常推荐使用包含#include<GL/glut.h>#include<GLUT/glut.h>的方式替代以下繁琐的库:

复制代码
    #include<windows.h>
    #include<GL/gl.h>
    #include<GL/glu.h>

使用GLUT进行Windows窗口展示

  • 设置GLUT库初始化:$argc, argv = glutInit(&argc, argv);
    • 创建一个名为'An Example OpenGL Program'的窗口,并将其标题栏名称指定为此处提供的字符串。
    • 通过调用绘制函数提供的操作完成图像绘制。
    • 开始执行整个程序流程。
    • 设置窗口的位置在屏幕左上方50像素处。
    • 设置窗口的高度宽度分别为400像素和300像素。
    • 指定单一绘图模式并使用RGB颜色表示法。

一个完整的OpenGL程序

  • 配置背景色:通过glClearColor(1.0, 1.0, 1.0, 0.0)函数设定 RGBA 颜色通道值(其中R=1.0、G=1.0、B=1.0代表白色通道值),该函数用于清除当前的颜色缓存区而不显示在屏幕上
  • 设置主色调:glColor3f(0.0, 0.4, 0.2)允许用户指定 RGB 颜色分量值并应用该颜色到后续绘图操作中;第二个glColor3f调用会覆盖前一个指定的颜色值
  • 实现二维显示所需步骤:通过设定投影矩阵并定义观察体裁范围(x轴从左下角开始延伸至2英寸宽、y轴延伸至1又半英寸高)完成二维场景的渲染配置
  • 绘制线条过程:使用glBegin(GL_LINES)开始绘制线框图形;定义两个顶点坐标分别为(x=18英寸,y=15英寸)(x=1英寸,y=145英寸)随后调用glEnd()

启动所有的 OpenGL 函数:glFlush(); 会确保渲染缓冲区的内容被及时输出,并避免其他 OpenGL 指令因渲染缓冲区未清空而导致延迟执行。

下面是一个完整的OpenGL例子:

复制代码
    #include <GL/glut.h>      //or others
    
    void init(void)
    {
    glClearColor(1.0, 1.0, 1.0, 0.0);    //Set diplay-window color to white
    
    glMatrixMode(GL_PROJECTION);    //Set projection parameters
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
    }
    
    void lineSegment(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);    //Clear display window
    
    glColor3f(0.0, 0.4, 0.2);    //Set line segment color to green
    glBegin(GL_LINES);
        glVertex2i(180, 15);    //Specify line-segment geometry
        glVertex2i(10, 145);
    glEnd();
    
    glFlush();    //Process all OpenGL routines as quickly as possible
    }
    
    void main(int argc, char** argv)
    {
    glutInit(&argc, argv);    //Initialize GLUT
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //Set display mode
    glutInitWindowPosition(50, 100);    //Set top-left display-window position
    glutINitWindowSize(400, 300);    //Set display-window width and height
    glutCreateWindow("An Example OpenGL Program")    //Create display window
    
    init();    //Execute initialization procedure
    glutDisplayFunc(lineSegment);    //Send graphics to display window
    glutMainLoop();    //Display everything and wait
    }
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/TWOC18PeQ50nugAzhMibKymqowxH.png)

OpenGL中的错误处理

推荐在每个程序中都加入一个通用的错误报告函数,如:

复制代码
    #include <stdio.h>
    
    GLenum erorCheck()
    {
    glenum code;
    const GLubyte *string;
    
    code = glGetError();
    if(code != GL_NO_ERROR)
    {
        string = gluErrorString(code);
        fprintf(stderr, "OpenGL error: %s\n", string);
    }
    
    return code;
    }
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/CIL7RzExvBS2gJ0Phi4a5yU16MY3.png)

全部评论 (0)

还没有任何评论哟~