计算机图形学第二章---概论(OpenGL简介)

本文介绍了液晶显示器的工作原理、类型和彩色显示机制,重点探讨了计算机图形学中的OpenGL,包括其功能、基本语法和编程流程,提供了一个简单的OpenGL程序示例,展示如何在Windows环境下配置和使用GLUT库。

液晶显示器——原理
液晶分子的排列在微弱的外部电场、磁场或者应力、温度变化等作用下非常容易改变。当液晶分子的某种排列状态在电场作用下变为另一种状态时,液晶的光学性质随之改变,这

种产生光被电场调制的现象称为液晶的电光效应。

液晶显示的机理是通过能阻塞或传递光的液晶材料,传递来自周围的或内部光源的偏振光。

 

液晶显示器——类型
NW(Normal White)型的LCD:在液晶面板不施加电压时,我们所看到的面板是透光的画面,也就是亮的画面。
NB(Normal Black)型的LCD:当对液晶面板不施加电压时,面板无法透光。


液晶显示器——彩色
液晶显示器利用在一侧的玻璃基板上加上一个彩色滤光片(CF,Color Filter)实现彩色。
彩色滤光片上均匀分布着红、绿、蓝色小点,每个小点有各自不同的灰度,相邻的一组RGB小点构成一个基本的彩色显示单元,即一个像素。


液晶显示器——分类
扭曲向列型(TN,Twisted Nematic)
超扭曲向列型(STN,Super TN)
双层超扭曲向列型(DSTN,Dual Scan TN)
薄膜晶体管型(TFT,Thin Film Transistor)

 

相关概念


分辨率
光点----一般是指电子束打在显示器的荧光屏上,显示器能够显示的最小的发光点。
像素点----是指图形显示在屏幕上时候,按当前的图形显示分辨率所能提供的最小元素点。
屏幕分辨率,也称为光栅分辨率,它决定了显示系统最大可能的分辨率,任何显示控制器所提供的分辨率也不能超过这个物理分辨率。
通常用水平方向上的光点数与垂直方向上的光点数的乘积来表示。
显示分辨率是计算机显示控制器所能够提供的显示模式分辨率,实际应用中简称为显示模式。
对于文本显示方式,显示分辨率用水平和垂直方向上所能显示的字符总数的乘积表示。
对于图形显示方式,则用水平和垂直方向上所能显示的象素点总数的乘积表示。
显示分辨率不同,它所对应的象素点大小也不同。
图形的存储分辨率是指帧缓冲区的大小,一般用缓冲区的字节数表示。
存储分辨率不仅与显示分辨率有关,还与像素点的色彩有关。
帧缓存大小的计算:
x方向的像素点数×y方向的像素点数×log2n/8(BYTE)
  其中:n为颜色数或灰度等级数
屏幕分辨率决定了所能显示的最高分辨率。
显示分辨率和存储分辨率对所能显示的图形分辨率有控制作用。
显示器中的分辨率
   带宽 = A*水平像素点数*垂直像素点数*刷新频率 A常取1.344

 

像素与帧缓存
屏幕上一个象素点就对应帧缓存中的一组信息。
组合像素法(Packed Pixel Method)
颜色位面法(Color Plane Method)
在组合像素法中,一个图形象素点的全部信息被编码成一个数据字节,按照一定方式存储到帧缓存中,编码字节的长度与点的属性(如颜色、灰度等)有关。
在颜色位面法中,帧缓存被分成若干独立的存储区域,每一个区域称为一个位面(Bit Plane),每个位面控制一种颜色或者灰度,每一个图形象素点在每个位面中占一位,通过几

个位面中的同一位组合成一个象素。

 

颜色查找表
颜色查找表也称调色板,是由高速的随机存储器组成,用来储存表达象素色彩的代码。此时帧缓冲存储器中每一象素对应单元的代码不再代表该象素的色彩值,而是作为查色表的

地址索引。

 

显示长宽比
显示长宽比,即水平点数与垂直点数之比。要求在屏幕两个方向上相同像素点数产生同样长度的线段,以使图形不至发生畸变。

 

屏幕坐标系(略)


OpenGL图形软件包:
OpenGL是SGI(Silicon Graphics Inc.)公司对IRIS GL进行改进,扩展可移植性,形成的一个跨平台开放式图形编程接口。
目前,OpenGL标准由1992年成立的独立财团OpenGL Architecture Review Board(ARB)以投票方式产生,并制成规范文档公布。

 

OpenGL的主要功能:
模型绘制
模型观察
颜色模式
光照应用
图像效果增强
位图和图像处理
纹理映射
实时动画
交互技术

 

OpenGL的绘制流程:
一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件。
OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段

OpenGL的基本语法---相关库
OpenGL核心库:gl
OpenGL实用程序库: glu
OpenGL编程辅助库:aux
OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut
Windows专用库:wgl
OpenGL的基本语法——命名规则
OpenGL函数都遵循一个命名约定,即采用以下格式:

<库前缀><根命令><可选的参数个数><可选的参数类型>
  
            例如函数glColor3f(…),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。

OpenGL的基本语法——数据类型
 

OpenGL数据类型
内部表示法
定义为C类型
C字面值后缀
GLbyte
8位整数
signed char
B
GLshort
16位整数
short
S
GLintGLsizei
32位整数
long
L
GLfloatGLclampf
32位浮点数
float
F
GLdoubleGLclampd
64位浮点数
double
D
GLubyteGLboolean
8位无符号整数
unsigned char
Ub
GLshort
16位无符号整数
unsigned short
Us
GLuintGLenumGLbitfield
32位无符号整数
unsigned long
Ui


OpenGL程序实例——头文件包含
利用OpenGL实现图形绘制,首先要引入OpenGL核心库以及其他需要使用的库的头文件。
GLUT保证了gl.h和glu.h被正确包含。
           #include <gl/glut.h>
           #include <windows.h>
OpenGL程序实例——窗口管理
初始化( glutInit )
创建窗口( glutCreateWindow)
设定窗口的显示模式( glutInitDisplayMode)
指定窗口的位置和大小( glutInitWindowPosition和glutInitWindowSize )
指定窗口的显示内容函数( glutDisplayFunc)
运行框架( glutMainLoop)

OpenGL程序实例——绘制图形
指定窗口背景色( glClearColor)
颜色管理,使用RGB颜色模型。一种颜色用红、绿、蓝三种颜色成分混合而成,每种颜色成分使用0.0到1.0之间的任意有效浮点数来表示颜色值。
 

混合色
红色成分(R
绿色成分(G
蓝色成分(B
0.0
0.0
0.0
1.0
0.0
0.0
绿
0.0
1.0
0.0
1.0
1.0
0.0
0.0
0.0
1.0
1.0
0.0
1.0
0.0
1.0
1.0
深灰
0.25
0.25
0.25
浅灰
0.75
0.75
0.75
0.60
0.40
0.12
南瓜橙
0.98
0.625
0.12
粉红
0.98
0.04
0.70
紫红
0.60
0.40
0.70
1.0
1.0
1.0


刷新窗口的缓冲区( glClear)
设定投影参数
         glMatrixMode(GL_PROJECTION);
         gluOrtho2D(0.0,200.0,0.0,150.0);
绘制图形
        glRectf(50.0f, 100.0f, 150.0f, 50.0f);

 


#include <gl/glut.h>
void Initial(void)
{
  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);      //设置窗口背景颜色为白色
  glMatrixMode(GL_PROJECTION);     //设置投影参数
  gluOrtho2D(0.0,200.0,0.0,150.0);
}

void Display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);   //用当前背景色填充窗口
  glColor3f(1.0f, 0.0f, 0.0f);            //设置当前的绘图颜色为红色
  glRectf(50.0f, 100.0f, 150.0f, 50.0f);    //绘制一个矩形
glFlush();                         //处理所有的OpenGL程序
}

int main(int argc, char* argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口的显示模式
  glutInitWindowSize(400,300);                  //设置窗口的尺寸
  glutInitWindowPosition(100,120);               //设置窗口的位置
  glutCreateWindow("矩形");                    //创建一个名为矩形的窗口
  glutDisplayFunc(Display);                     //设置当前窗口的显示回调函数
  Initial();                                    //完成窗口初始化
  glutMainLoop();                             //启动主GLUT事件处理循环
  return 0;
}

 

 

//下面的是从网上摘录的

Windows环境下安装GLUT的步骤:

1、将下载的压缩包解开,将得到5个文件

2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC/PlatformSDK/include/gl文件夹”)。把解压得到的glut.h放到这个文件夹。

3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC/lib”文件夹)。

4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:/Windows/System32)

第三步,建立一个OpenGL工程

这里以VisualStudio2005为例。

选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。

在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。

然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。

搞定了,就跟平时的工程没什么两样的。


第一个OpenGL程序

一个简单的OpenGL程序如下:(注意,如果需要编译并运行,需要正确安装GLUT,安装方法如上所述)

#include <GL/glut.h>

void myDisplay(void)

{

     glClear(GL_COLOR_BUFFER_BIT);

     glRectf(-0.5f, -0.5f, 0.5f, 0.5f);

     glFlush();

}

int main(int argc, char *argv[])

{

     glutInit(&argc, argv);

     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

     glutInitWindowPosition(100, 100);

     glutInitWindowSize(400, 400);

     glutCreateWindow("第一个OpenGL程序");

     glutDisplayFunc(&myDisplay);

     glutMainLoop();

     return 0;

}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。

首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。

本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。

然后看main函数。

int main(int argc, char *argv[]),这个是带命令行参数的main函数,各位应该见过吧?没见过的同志们请多翻翻书,等弄明白了再往下看。

注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。

1、glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。

2、 glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜 色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,请自己Google。当然以后的教程也会 有一些讲解。

3、glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。

4、glutInitWindowSize,这个也简单,设置窗口的大小。

5、glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。

6、glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。(这个说法不够准确,但准确的说法可能初学者不太好理解,暂时这样说吧)。

7、glutMainLoop,进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)

在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用 myDisplay函数”。于是myDisplay函数就用来画图。观察myDisplay中的三个函数调用,发现它们都以gl开头。这种以gl开头的函 数都是OpenGL的标准函数,下面对用到的函数进行介绍。

1、glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。

2、glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。

3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。其作用跟fflush(stdout)类似。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值