OpenGL入门知识点

 ------------本文知识点主要摘录自OpenGL编程指南(第三版)红宝书

 


/**************************************************************************************************************/
#include <whateverYouNeed.h>

main(){
 InitializeAWindowPlease(); //占位符,初始化一个窗口 ##

 glClearColor(0.0, 0.0, 0.0, 0.0);//glClearColor设定将窗口清除成某种背景色,以后每次调用glClear都会清除成这种颜色
 glClear(GL_COLOR_BUFFER_BIT);//glClear清除窗口成某种颜色

 glColor3f(1.0, 1.0, 1.0);//设定绘制物体所用颜色,以后绘制的物体都会使用这种颜色
 glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);//设定绘制时所采用的坐标系统
 glBegin(GL_POLYGON);//OpenGL绘制图形的命令要放在glBegin和glEnd之间,GL_POLYGON有填充点围起来的区域,GL_POINTS只是单纯的画点
     glVertex3f(0.25, 0.25, 0.0);//绘制一个点
  glVertex3f(0.75, 0.25, 0.0);
  glVertex3f(0.75, 0.75, 0.0);
  glVertex3f(0.25, 0.75, 0.0);
 glEnd();
 glFlush();//强制刷新缓冲区(执行以上绘图命令)
 UpdateTheWindowAndCheckForEvents();//占位符,管理窗口内容并进行事件处理 ##
}

/**************************************************************************************************************/


OpenGL中的函数用'gl'作为前缀,函数单词首字母大写;
常量以'GL_'作为前缀,全部单词大写,用'_'作连接符
数字,如glVertex3f中的'3'表示函数可以接收3个参数,'f'表示浮点数,'i'表示整数,'v'表示参数是一个指向值向量或数组的指针,如glColor3fv(color_array);

OpenGL是一个状态机

/**************************************************************************************************************/
//GLUT,OpenGL实用工具库,窗口管理:
/*  显示回调函数(display callback):  mydisplay  
  每个GLUT程序都必须有一个显示回调函数(绘制图形)
  用glutDisplayFunc(mydisplay)函数注册
  只要OpenGL确定显示内容要被刷新时,显示回调函数就会被调用:例如,当窗口被打开的时候、窗口大小改变
*/

void main(int argc, char *argv[])
{
 glutInit(&argc, argv); //对GLUT进行初始化,处理所有命令行参数
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设定窗口模式: RGBA或颜色索引模式 || 单缓冲或双缓冲窗口
 glutInitWindowPosition(100, 100);//指定窗口左上角的屏幕位置
 glutInitWindowSize(800, 600);//指定窗口大小
 //glutInitContextFlags():指定想要使用的渲染环境类型
 glutCreateWindow("Hello World!");//声明创建一个支持渲染的窗口

 Init();//自定义初始化函数Init
 glutDisplayFunc(myDisplay);//回调函数执行命令myDisplay
 glutReshapeFunc(Reshape);//处理事件:当窗口大小改变时触发事件Reshape
 glutKeyboardFunc(keyboard);//注册键盘函数
 glutMouseFunc(mouse); // 注册鼠标处理函数

 glutMainLoop(); //实际显示创建的那个窗口,启动程序(事件循环函数)
}
void Init()
{
 glClearColor(0.0, 0.0, 0.0, 0.0);// 窗口背景的颜色
 glShadeModel(GL_SMOOTH);//设置平滑颜色过渡模式(相当于在两种颜色间进行差值,想象一下线段的两个端点颜色不一样,线段中间该是什么颜色)
 printf("这是一个演示程序!\n");//在窗口中给出提示
}

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);//定义二维投影矩阵,把圆点(0,0)定义在最左下角的地方
}
void myDisplay()
{
   glClear(GL_COLOR_BUFFER_BIT);//图之前先设置画图区的背景色
   glColor3f (1.0f, 0.0f, 0.0f);//设置前景色(相当于画笔颜色)

   LARGE_INTEGER Freq;
   LARGE_INTEGER start;
   LARGE_INTEGER end;
   QueryPerformanceFrequency(&Freq); // 获取时钟周期
   QueryPerformanceCounter(&start); // 获取时钟计数
  switch(k)//选择算法
  { 
  case 1:Bresenham(pt[0],pt[1]);break;
  case 2:MidCircle(pt[0],pt[1]);break;
  }
    QueryPerformanceCounter(&end);// 获取时钟计数
 printf("用时%d微秒\n",(end.QuadPart-start.QuadPart)*1000000/Freq.QuadPart);// 计时

    glFlush();//强制刷新缓冲,保证绘图命令被立即执行
}

/**************************************************************************************************************/
//OpenGL几何图元
//  图元生成函数: glBegin(图元类型);  。。。glEnd().

glBegin(GL_POINTS); //画单个点
     glColor3f(1.0,0.0,0.0);
     glVertex2f(-10.0,11.0);
      glColor3f(1.0,1.0,0.0);
      glVertex2f(-9.0,10.0);
      glColor3f(0.0,1.0,1.0);
      glVertex2f(-8.0,12.0);
glEnd();

glBegin(GL_LINES);
glBegin(GL_LINE_STRIP); //
glBegin(GL_LINE_LOOP); //
glBegin(GL_POLYGON); //
glBegin(GL_QUADS); //
glBegin(GL_QUAD_STRIP); //
glBegin(GL_TRIANGLES); //
glBegin(GL_TRIANGLE_STRIP); //
glBegin(GL_TRIANGLE_FAN); //


glBegin(GL_LINES); //一对顶点被解释成一条直线
    glColor3f(1.0,1.0,0.0);
    glVertex2f(-11.0,8.0);
    glVertex2f(-7.0,7.0);
    glColor3f(1.0,0.0,1.0);
    glVertex2f(-11.0,9.0);
    glVertex2f(-8.0,6.0);
  glEnd();
glBegin(GL_LINE_STRIP); //一系列的点连接成直线
    glColor3f(0.0,1.0,0.0);
    glVertex2f(-3.0,9.0);
    glVertex2f(2.0,6.0);
    glVertex2f(3.0,8.0);
    glVertex2f(-2.5,6.5);
  glEnd();
glBegin(GL_LINE_LOOP); //同上,但第一个点和最后一个点彼此相连
    glColor3f(0.0,1.0,1.0);
    glVertex2f(7.0,7.0);
    glVertex2f(8.0,8.0);
    glVertex2f(9.0,6.5);
    glVertex2f(10.3,7.5);
    glVertex2f(11.5,6.0);
    glVertex2f(7.5,6.0);
  glEnd();
glBegin(GL_POLYGON); //简单的凸多边形边界,内部填充
    glColor3f(0.5,0.3,0.7);
    glVertex2f(-7.0,2.0);
    glVertex2f(-8.0,3.0);
    glVertex2f(-10.3,0.5);
    glVertex2f(-7.5,-2.0);
    glVertex2f(-6.0,-1.0);
  glEnd();
glBegin(GL_QUADS); //4个顶点被解释成一个四边形
    glColor3f(0.7,0.5,0.2);
    glVertex2f(0.0,2.0);
    glVertex2f(-1.0,3.0);
    glVertex2f(-3.3,0.5);
    glVertex2f(-0.5,-1.0);
    glColor3f(0.5,0.7,0.2);
    glVertex2f(3.0,2.0);
    glVertex2f(2.0,3.0);
    glVertex2f(0.0,0.5);
    glVertex2f(2.5,-1.0);
  glEnd();
glBegin(GL_QUAD_STRIP); //四边形的连接串
    glVertex2f(6.0,-2.0);
    glVertex2f(5.5,1.0);
    glVertex2f(8.0,-1.0);
    glColor3f(0.8,0.0,0.0);
    glVertex2f(9.0,2.0);
    glVertex2f(11.0,-2.0);
    glColor3f(0.0,0.0,0.8);
    glVertex2f(11.0,2.0);
    glVertex2f(13.0,-1.0);
    glColor3f(0.0,0.8,0.0);
    glVertex2f(14.0,1.0);
  glEnd();
glBegin(GL_TRIANGLES); //3个顶点被解释成三角形
    glColor3f(0.2,0.5,0.7);
    glVertex2f(-10.0,-5.0);
    glVertex2f(-12.3,-7.5);
    glVertex2f(-8.5,-6.0);
    glColor3f(0.2,0.7,0.5);
    glVertex2f(-8.0,-7.0);
    glVertex2f(-7.0,-4.5);
    glVertex2f(-5.5,-9.0);
  glEnd();
glBegin(GL_TRIANGLE_STRIP); //三角形的连接串
    glVertex2f(-1.0,-8.0);
    glVertex2f(-2.5,-5.0);
    glColor3f(0.8,0.8,0.0);
    glVertex2f(1.0,-7.0);
    glColor3f(0.0,0.8,0.8);
    glVertex2f(2.0,-4.0);
    glColor3f(0.8,0.0,0.8);
    glVertex2f(4.0,-6.0);
  glEnd();
glBegin(GL_TRIANGLE_FAN); //连接成扇形的三角形系列
    glVertex2f(8.0,-6.0);
    glVertex2f(10.0,-3.0);
    glColor3f(0.8,0.2,0.5);
    glVertex2f(12.5,-4.5);
    glColor3f(0.2,0.5,0.8);
    glVertex2f(13.0,-7.5);
    glColor3f(0.8,0.5,0.2);
    glVertex2f(10.5,-9.0);
  glEnd();

/**************************************************************************************************************/
//OpenGL基本状态
glEnable():启动一个功能
glDisable():关闭一个功能


/**************************************************************************************************************/
//视图和模型变换:形成模型视图矩阵,这个矩阵作用于物体坐标,产生视觉坐标
//视图变换:修改观察点的位置和方向
//模型变换:glTranslatef,glRotatef,glScalef
物体坐标--(顶点xyzw)--模型视图矩阵--(视觉坐标)--投影矩阵--(裁剪坐标)--透视除法--(规范化设备坐标)--视口交换--(窗口坐标)--

//投影变换
//投影变换类似照相机的选择镜头,用于确定视野或视景体。
//     glFrustum透视投影:远处的物体看上去更小一些。glOrtho正投影:直接映射物体到屏幕上
指定视景体的形状和方向,决定了场景是如何投影到屏幕上的(正投影或透视投影),决定哪些部分被裁剪

//视口变换
//glViewport投影变换和视口变换共同决定了场景如何映射到屏幕上,投影变换指定了映射的发生机制,视口变换决定了场景所映射的有效屏幕区域的形状
指定如何把三维模型坐标转换成屏幕坐标

 

gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0,1.0,0.0);//类比照相机,把照相机放在(0,0,5),把镜头瞄准(0,0,0),把朝上向量指定为(0,1,0)

 


/**************************************************************************************************************/
//隐藏表面消除:消除实心物体被其它物体所遮挡的部分,使用深度缓冲区:glutInitDisplayMode (GLUT_DEPTH | GLUT_RGB);

 

 


/********************************************************************************************/
glMatrixMode设置当前矩阵模式:  
   GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.   
   GL_PROJECTION,对投影矩阵应用随后的矩阵操作.   
   GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.   
   与glLoadIdentity()一同使用   


void Reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);//GL_PROJECTION表示把当前矩阵指定为用于投影变换,并且后续的变换调用所影响的是投影矩阵
    glLoadIdentity();//把当前矩阵设置为单位矩阵,供变换使用

 glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);//透视投影
 //glOrtho(-10,10,-10,10,-30,30);  //正交投影

 glMatrixMode(GL_MODELVIEW);//GL_MODELVIEW表示之后的变换所影响的是模型视图矩阵,而不再是投影矩阵

 //glMatrixMode(mode):指定需要修改的mode,有模型视图矩阵GL_MODELVIEW,投影矩阵GL_PROJECTION,纹理矩阵GL_TEXTURE

 
}

void display (void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1,0,0);  //线的颜色
 glLoadIdentity ( );
 gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0,1.0,0.0);//类比照相机,把照相机放在(0,0,5),把镜头瞄准(0,0,0),把朝上向量指定为(0,1,0)

 glScalef(1,2,1);   //放缩函数:设置长宽高的比例为3:2:1
 //glRotatef(45,0.0,0,1.0); //旋转函数,设置倾斜45度
 //glTranslatef(0,0,0);  //平移函数,设置绘图位置
 glutWireCube(2.0);  //绘制
 glFlush();
}

 

/***********************************/
只绘制多边形的轮廓或顶点:
多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。
例如,可以通过下面两个调用,把多边形的正面画成填充形式,把背面画成轮廓形式:
 glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_LINE);

 

glShadeModel函数:用于控制opengl中绘制指定两点间其他点颜色的过渡模式
参数:GL_SMOOTH会出现过渡效果。GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点


  //启动光照
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0)


  //启用纹理
    glEnable(GL_TEXTURE_1D);
    glEnable(GL_TEXTURE_GEN_S);

//消隐剔除背向面
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);

 

 

 

==================================================================================================

什么是计算机图形学?

计算机图形学是研究通过计算机将数据转换为图形,并在专门显示设备上显示的原理、方法和技术的学科。它是建立在传统的图学理论、应用数学和计算机科学基础上的一门边缘学科。

 

 

什么是图形,图形与图像的区别:

图形是指能在人的视觉系统中产生视觉印象的客观对象,例如自然景物、拍摄到的图片,用数学方法描述的图形(如sin函数曲线)。图形可以是现实世界中已经存在的物体,也可以是完全虚构的物体。    图形是指由外部轮廓线条构成的矢量图。而图像是由像素点阵构成的位图。 

 

图形

图像

1

 数据量很少

数据量很大

2

有结构,便于编辑修改

无结构,不便于编辑修改

3

能准确表示3D 景物,易于生成所需的不同视图

3D 景物的信息巳部分丢失,很难生成所需的不同视图

4

生成视图需要复杂的计算

生成视图不需要复杂的计算

5

自然景物的表示很困难

自然景物的表示不困难

6

国际标准: GKS,PHIGS,OpenGL, WMF,VRML,CGM

国际标准:JPEG,TIFF等

7

编辑软件(绘图软件): AutoCAD, CorelDRAW, 3D Max等

编辑软件(图像处理软件):

Photoshop, Photostyler等

 

图形的表示方式:点阵和参数。几何数据和非几何数据

 

 

请举出10个计算机图形学的应用领域?

1.计算机辅助设计与制造——工业领域(CAD/CAM是CG在工业界最广泛、最活跃的应用领域。):飞机、汽车、船舶、机电、轻工、服装的外形设计。集成电路、印刷电路板的设计。建筑设计。

2.计算机动画——商业领域:广告设计,视频游戏,卡通动画片,影视特技

3.计算机艺术——艺术领域:计算机绘画。漫画创作。计算机平面合成艺术 。

4.非真实感绘制

5.系统环境模拟:飞行模拟

6事务和商务数据的图形显示

7地形地貌和自然资源的图形显示

8.科学计算可视化

9.虚拟手术仿真

10.多媒体应用

 

l       图形用户界面(GUI)

l       计算机辅助设计(CAD)

l       科学可视化( Scientific Visualization )

l       计算机艺术(Computer Art)

l       地理信息系统(GIS)

l       计算机动画、广告及娱乐

l       多媒体系统(Multimedia)

l       虚拟现实系统(Virtual Reality)

 

计算机图形学当前的研究热点

l       造型技术

l       真实感图形绘制技术

l       人机交互技术

l       与计算机网络技术的紧密结合

 

 

计算机图形系统的组成:

 

 

输入设备:三维鼠标,数据手套,头盔显示器,数据衣,扫描仪,数码相机,三维数字化仪

 

输出设备:光栅扫描显示器(阴极射线管显示器CRT,液晶显示器LCD等),平板显示器

阴极射线管显示器CRT组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏(荧光粉)。

CRT显示器分类:单色或彩色;偏转电场式或磁场式;随机扫描或光栅扫描。

电子枪:

n       电灯丝,阴极和控制栅组成

n       灯丝:产生热量

n       阴极:由灯丝加热发出电子束

n       控制栅:加上负电压后,能够控制通过其中小孔的带负电的电子束的强弱。通过调节负电压高低来控制电子数量,即控制荧光屏上相应点的亮度

CRT产生稳定图像所需要的最小刷新频率=1秒/荧光物质的持续发光时间

(例如)荧光物质的持续发光时间40毫秒,则CRT刷新频率就是 1000/40=25Hz

 

彩色CRT显示器:渗透型(随机扫描,射线穿透法)或多枪型(光栅扫描,影孔板法)。

如果每支电子枪发出的电子束的强度有256个等级,则显示器能同时显示256*256*256=16M种颜色,称为真彩系统(CRT三种)

 

 

光栅扫描显示系统组成:帧缓冲存储器,图形显示处理器,视频显示控制器。

帧缓冲存储器:帧缓冲存储器,俗称显存,可以是主存中划出的一个固定区域,也可以是一个独立的随机存取存储器。其主要功能是用来存储屏幕上像素的颜色值。帧缓存器中的存储单元与显示屏幕上的像素一一对应,帧缓存器中单元数目与显示器上像素的数目相同,各单元的数值决定了其对应像素的颜色,显示颜色的种类与帧缓存器中每个单元的数值位数有关。(黑白显示系统的帧缓冲器的每个单元只有一位)

 

RGB三基色:面向硬件设备(摄像机、扫描仪和投影仪等)

CMY三补色: 蓝绿(C, cyan),品红(M, magenta),黄(Y, yellow):用于彩色打印,

CMY与RGB关系:R=1-C,G=1-M,B=1-Y

 

显存容量:分辨率M*N、颜色个数K与显存容量V的关系:

 

2. 设计算机显示器的分辨率为1024×768,每个像素的颜色值用24位表示,回答下列问题:

(1)帧缓存的大小为多少?

(2)目前PC机的显存大小为什么要比所求值大很多?

(3)一个12×12的窗口中的图,最多同时可有多少种颜色?

答:1.若每个帧缓存中每个存储单元有24位(每种基色占8位),

即显示系统最多可同时产生2^24种颜色(24位真彩色)。

帧缓存的大小计算:1024×1024 × log2(2^24) /8 =3兆字节

2. 显存还包括深度缓冲、纹理内存等

3.12*12=144种

若存储器位长固定,则屏幕分辩率与同时可用的颜色种数成反比关系

 

 

 

多边形三种方法:逐点判断法;扫描线算法;边缘填充法

如何判断点在多边形的内外关系:射线法(射线与多边形交点个数,偶外奇内)

1.从待判别点 v 发出射线

2.求与多边形交点个数 k

3.k 的奇偶性决定了点与多边形的内外关系

 

扫描线算法的连贯性:

l       连贯性(Coherence)

n       边的连贯性(Edge Coherence)

u     某条边与当前扫描线相交,也可能与下一条扫描线相交

n       扫描线的连贯性(Scan-line Coherence)

u     当前扫描线与各边的交点顺序与 下一条扫描线与各边的交点顺序可能相同或类似

n       区间的连贯性(Span Coherence)

u     同一区间上的像素取同一颜色属性

 

 

 

区域填充:

区域的连通方式分为四连通和八连通。

种子填充算法

4连通区域:区域中任意两点可通过上下左右四个方向互相到达

8连通区域:区域中任意两点可通过上下左右和对角线八个方向互相到达

八连通算法可以填充四连通区域,但是四连通算法不能填充八连通区域。四连通和八连通对边界的要求也是不同的。四连通边界为O,八连通边界需为O和X。

 

区域填充算法:种子填充算法,扫描线算法

 

 

 

只绘制多边形的轮廓或顶点:

多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。

例如,可以通过下面两个调用,把多边形的正面画成填充形式,把背面画成轮廓形式:
 glPolygonMode(GL_FRONT, GL_FILL);

glPolygonMode(GL_BACK, GL_LINE);

 

glShadeModel函数:用于控制opengl中绘制指定两点间其他点颜色的过渡模式

参数:GL_SMOOTH会出现过渡效果。GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点

走样:用离散量(像素)表示连续的量(图形)而引起的失真,称为走样,或称为混淆。

光栅图形的走样现象:阶梯(锯齿)状边界。图形细节失真。狭小图形遗失:动画序列中时隐时现,产生闪烁。

反走样方法:在图形显示过程中,用于减少或消除走样(混淆)现象的方法

提高分辨率方法。非加权区域采样。加权区域采样

 

图形走样现象的变现形式:阶梯状的图形边界、图形细节失真(显示图形的最小单位为像素、细长的矩形显示后成了加宽的矩形、更细的矩形将丢失)、狭小图形的遗失与动态图形的闪烁(多边形分布在像素间,不覆盖像素中心,不被显示狭小图形运动时,会间隔覆盖像素的中心,产生闪烁)

 

解决图形设备与计算机的通讯接口等问题,称为设备驱动程序

 

双缓冲技术:

–     应用于绘制区域更新频繁时

–     前缓冲(Front Buffer):显示绘制完成的场景

–     离屏后缓冲(Back Buffer):保存当前正在绘制的场景

–     图形驱动器控制对其进行交换,避免图像撕裂(Tearing)现象

 

实验123

画图说明直线/圆弧的中点画法原理

 

 

相关函数库:

OpenGL核心库(GL)

n       OpenGL实用库(GLU)

n       OpenGL辅助库(GLAUX)

n       OpenGL工具库(GLUT)

n       OpenGL对窗口系统的扩展(WGL,等等)

 

“opengl32.lib glu32.lib glut32.lib glaux.lib"

 

 

 

 

设计出一种画抛物线的方法。Y=ax2+bx+c.

如何画宽度大于1的直线,并说明该方法可能存在的问题?

 

 

 

图元的生成:是指完成图元的参数表示形式到点阵表示形式的转换。通常也称扫描转换图元

 

为什么需要齐次坐标?

n       对多个点计算多次不同的变换时,分别利用矩阵计算各变换导致计算量大

n       运算表示形式不统一

u     平移为“+”

u     旋转和放缩为“·”

n       统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象

 

什么是齐次坐标,齐次坐标与非齐次坐标间如何相互转换?

所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,将平移,旋转,放缩等几何变换的表示形式统一起来。

二维点(x,y)的齐次坐标表示为(hx,hy,h)。

xy)点对应的齐次坐标为三维空间的一条直线

 

用齐次坐标表示的二维平移、放缩、旋转变换的变换矩阵?

用齐次坐标表示的二维平移、放缩、旋转变换的逆变换矩阵?

变换矩阵:

平移:

 

 

 

旋转:

 

 

 

放缩:

 

 

 

 

 

 

利用复合变换实现关于任意参考点P(xr,yr)的旋转变换(写成矩阵相乘的形式)

利用复合变换求(xp,yp)关于任意直线y=ax+by+c的对称点坐标

 

图形变换:

5种基本变换:平移,旋转,放缩,对称,错切

解释opengl中以下函数的用法

l       基本几何变换函数

n       平移函数:glTranslate{fd}(tx, ty, tz)

u     对二维变换而言,取tz=0

n       旋转函数:glRotate{fd}(theta, vx, vy, vz)

u     向量(vx, vy, vz)为通过坐标原点旋转轴

u     theta为旋转角的度数

n       放缩函数:glScale{fd}(sx, sy, sz)

u     相对坐标原点的缩放

u     当参数为负时,相对于平面进行对称变换

l       几个概念

n       裁剪窗口(Clipping Window) :需要显示的场景区域

u     又称为世界窗口或观察窗口,简称窗口

u     在世界坐标系(又称用户坐标系)内定义

n       视口(Viewport):指显示设备上用来显示图形的区域

u     又称视区,在设备(屏幕)坐标系内定义

n       裁剪(Clip):从场景中确定位于窗口内的图形

 

 

l       OpenGL视口函数

n       定义函数:glViewport(xvmin,yvmin,vpwidth,vpheight);

n       视口为矩形

l       三维图形的基本研究内容

n        投影

n        三维形体的表示

n        消除隐藏面与隐藏线

n        建立光照明模型、真实感图形绘制方法

 

 

n       裁剪窗口(Clipping Window) :需要显示的场景区域

u     又称为世界窗口或观察窗口,简称窗口

u     在世界坐标系(又称用户坐标系)内定义

n       视口(Viewport):指显示设备上用来显示图形的区域

u     又称视区,在设备(屏幕)坐标系内定义

n       裁剪(Clip):从场景中确定位于窗口内的图形

裁剪窗口和视区的关系:

n       改变视口位置可以在输出设备的不同位置上观察物体

n       使用多个视口可以在屏幕不同的位置观察场景的不同部分

n       改变窗口的尺寸达到改变视口内显示对象的多少

n       改变视口的尺寸实现对象放缩

 

 

窗口到视区的变换

 

简要说明二维观察的过程。窗口裁剪的作用是什么?

 

窗口裁剪的作用:对图形做出正确的判断,选取可见信息提供给显示系统显示,去除不可见部分。

 

 

l       如何投影?

 

 

 

 

 

 

什么是消隐,为什么要进行消隐? 

消隐是指消除被遮挡的不可见的线或面。消隐能体现真实感图形的绘制。

 

消隐算法中画家算法的基本思想?

 

消隐算法中的Z缓冲算法的基本思想?

Z 缓冲器算法:

帧缓冲器 -- 保存各像素颜色值,Z 缓冲器  -- 保存各像素处物体深度值

 

 

 

 

 

 

光照效果中的环境光、漫反射光、镜面反射光的特点

环境光指从周围环境的各个方向投射来的光,没有空间和方向上的特征,均匀地照射在物体的各个不同的表面上,并等量地向各个方向反射,是一种分布光源。

漫反射光是由物体表面的粗糙不平引起的,由点光源向周围所有方向发射等强度的光,它均匀地向各个方向传播,与视点无关。

镜面反射是物体表面对入射光的反射,产生高光效应。镜面反射光在空间的分布具有一定的方向性。

 

在计算光照效果中为什么要计算法向量?

 


 

 


 

 

 

 

 

posted @ 2012-06-01 20:07  汤姆是一只猫  阅读(3354)  评论(0编辑  收藏  举报