HDU 2021 三维图形程序设计 期末复习提纲
- 说明
- 第一、二章
- 第四、五章
- 第九章
- 第十章
-
- 8、 帧缓存有几种,什么叫片元,片元的测试和操作有哪些?明白stencilbuffer的使用。
- 9、 请列举出3种以上的三维模型常见的表示格式
- 10、(选做)分析下面的程序并计算
- 11、 采用GPU编程,请说明Vertex Shader 和 Fragment Shader 的输入输出坐标系是什么? 输入输出的主要参数是什么?
- 12、 在shader编程中,如何使用纹理。
- 13、 在Compute Shader中, workgroup 和 工作单元等的关系。
- 14、 Buffer, Texture Buffer, Image Buffer 之间的区别和联系。
- 15、 Shader和主程序之间如何传递数据。
说明
只是对老师复习提纲的补充,可能不准,发布到网络只是为了为杭电数媒专业学弟学妹做一些参考。部分资料转载自网络。
教材:OPENGL红宝书第七、八版
第一、二章
1、 OpenGL中能渲染的基本元素是什么?GLU 可以渲染哪些基本元素?
OpenGL中能渲染的十种图元:
图形 | OPENGL数据类型 | 中文名 | 解释 |
---|---|---|---|
点 | GL_POINTS | 单个顶点集 | 将指定的各个顶点用于创建单个的点 |
线 | GL_LINES | 多组双顶点线段 | 将指定顶点用于创建线段。两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个 |
线 | GL_LINE_STRIP | 不闭合折线 | 将指定的顶点用于创建线段。每个顶点之后的每个顶点指定的是线条延伸到的下一个点 |
线 | GL_LINE_LOOP | 闭合折线 | 特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域。 |
三角形 | GL_TRIANGLES | 多组独立填充三角形 | 将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略。 |
三角形 | GL_TRIANGLE_STRIP | 线型连续填充三角形 | 将指定的顶点用于创建三角形。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用于构成下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。 |
三角形 | GL_TRAINGLE_FAN | 扇形连续填充三角形 | 初始顶点需要是扇形的圆心,前三个顶点逆时针构成第一个三角形。从第三个顶点开始就满足,就是 (n, 圆心, n-1) |
多边形 | GL_QUADS | 多组独立填充四边形 | 每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略 |
多边形 | GL_QUADS_STRIP | 连续填充四边形 | 将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致。 |
多边形 | GL_POLYGON | 单个简单填充凸多边形 | 将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形是封闭的。 |
GLU能渲染的基本元素:
1.NURBS(非均匀有理B样条)曲面、曲线
2.二次曲面
3.球、圆等
2、 用框图说明OpenGL的渲染流程,并简要说明每个坐标系。
坐标系 | 左右手 | 解释 |
---|---|---|
物体坐标系 | 右手坐标系 | 是绘制物体时的坐标系。 |
世界坐标系 | 右手坐标系 | 定义物理世界位置的客观空间。 |
观察者坐标系 | 右手坐标系 | 以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。 |
裁剪坐标系 | 右手坐标系 | 视区内的坐标。 |
规范化设备坐标系 | 左手坐标系 | 为使图形软件能在不同设备之间移植,采用规范化坐标系,其坐标轴取值范围是[-1, 1]或[0, 1]。 |
屏幕坐标坐标系 | 左手坐标系 | 屏幕上的设备坐标。 |
3、 投影变换的设置,gluPerspective, glFrustum, glOrtho等的具体含义,gluLookAt函数的具体参数和使用方法。
1.gluPerspective
//这个函数指定了观察的视景体在世界坐标系中的具体大小
void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
//lfet是眼睛上下睁开的幅度,角度值,值越小,视野范围越狭小(眯眼),值越大,视野范围越宽阔(睁大眼);
//zNear表示近裁剪面到眼睛的距离(始终为正)
//zFar表示远裁剪面到眼睛的距离(始终为正)
//aspect表示裁剪面的宽w高h比,这个影响到视野的截面有多大。
2.glFrustum
//它是将当前矩阵与一个透视矩阵相乘,把当前矩阵转变成透视矩阵
void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)
//left,right指明相对于垂直平面的左右坐标位置
//bottom,top指明相对于水平剪切面的下上位置
//near,far指明相对于深度剪切面的远近的距离,两个必须为正数
3.glOrtho
//这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
//left,right指明相对于垂直平面的左右坐标位置
//bottom,top指明相对于水平剪切面的下上位置
//near,far指明相对于深度剪切面的远近的距离
//所有的near和far值同时为正或同时为负, 值不能相同
4.gluLookAt
//该函数定义一个视图矩阵,并与当前矩阵相乘。
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
//第一组eyex, eyey,eyez 相机在世界坐标的位置
//第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
//第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
第四、五章
4、 写出OpenGL中局部光照的方程,要包含的系数有光源参数、材料参数、聚光灯的参数、衰减参数等,方程要表示是多个光源的。
顶点颜色 = 顶点处的材料发射颜色 + 全局环境光(在顶点处根据材料环境颜色属性进行缩放) + 经过适当衰减的来自所有光源的环境、散射和镜面光成分(第七版OPENGL红宝书中文版P146)
顶点颜色=材料自发光+
环境光颜色 * 材料的环境颜色属性+
对每个聚光灯加上(聚光灯衰减因子 * 聚光灯效果)*
【光源的环境颜色 * 材料的环境颜色+
Max{L * n,0} * 漫反射光颜色 * 材料的漫反射属性+
(Max{S * N,0}^镜面指数 * 灯的反射值 * 材料的反射属性】
后半部分即:每个光源的贡献=衰减因子 * 聚光灯效果 *(环境光成分+漫反射成分+镜面反射成分)
1.N:顶点的单位化法向量
2.V:聚光灯指向顶点的单位向量
3.D:聚光灯的方向向量,它是单位向量
4.T:顶点到光源的单位向量,当光源是聚光灯时,即为-V
5.P:顶点到视点的单位向量
6.S:Norm(T+P)
7.衰减因子= 1 k c + k k d + k q d 2 \frac{1}{k_c + k_kd + k_qd^2} \quad kc+kkd+kqd21d = 光源的位置和顶点之间的距离
三种k分别代表常数(GL_CONSTANT_ATTENUATION)、一次参数(GL_LINEAR_ATTENUATION)和二次参数(GL_QUADRATIC_ATTENUATION)
●如果光源为方向性光源,那么衰减因子为1。8.聚光灯效果:
●光源不是聚光灯(GL_SPOT_CUTOFF为180.0),取1;
●光源是聚光灯但是顶点位于聚光灯光锥外,取0;
●其他情况为Max{V*D,0}^exp (exp为镜面反射指数值)
5、 分析程序并计算
请看下面的一段程序,并计算三个顶点○1、○2和○3处的光照的颜色值。
void init(void)
{
GLfloat mat_specular[] = {
1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = {
50.0 };
GLfloat light_position[] = {
1.0, 1.0, 1.0, 0.0 };
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
//glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv