本实验为华南理工大学计算机科学与技术专业课程的一部分,旨在通过实践操作深化学生对计算机图形学理论的理解。参与者将学习并应用图形渲染、建模及动画制作等技能,增强其在计算机视觉和游戏开发领域的竞争力。
一、1. 请下载并安装glut库。
2. 使用以下代码编写一个完整的程序来绘制Sierpinski垫片:
```c++
void myinit(){
// 属性设置
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(1.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 50.0, 0.0, 50.0);
glMatrixMode(GL_MODELVIEW);}void display(){
GLfloat vertices[3][3] = {{0.0, 0.0, 0.0}, {25.0, 50.0, 0.0}, {50.0, 0.0, 0.0}}; // 在平面z= 0上的任意三角形
GLfloat p[3] = {7.5, 5.0, 0.0};
int j,k;
glBegin(GL_POINTS);
for (k = 0; k < 5000; k++){
// 随机选择一个顶点
j = rand()%3;
p[0] = (p[0]+vertices[j][0])/2;
p[1] = (p[1]+vertices[j][1])/2;
glVertex3fv(p);
}
glEnd();
glFlush();}
#include
void main(int argc, char **argv){
glutInit(&argc;, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow(Simple OpenGL Example);
glutDisplayFunc(display);
myinit();
glutMainLoop();}
3. 实现DDA和Bresenham画线算法:
(1)生成并绘制超过十万条随机直线,比较两种算法的平均时间。
(2)分别将屏幕上的1*1、5*5, 9*9像素视为直线段上的一点,观察线条失真情况。
二、编写一个OpenGL或WebGL程序完成以下任务:
(1)读取三维网格模型的obj文件;
(2)使用OpenGL函数glTranslatef()平移模型使其重心位于原点;
(3)利用glLookAt()设置视点,并绕着物体旋转一圈,以便从各个侧面观察透视投影效果;
(4)真实感绘制:用OpenGL函数设置光源和材质,在计算每个三角形的法向量后使用glNormal给待渲染的三角形设定法线。
三、本实验为综合性任务,请利用光线追踪算法进行Whitted全局光照处理,并对读入场景进行真实感渲染。
(1)参加对象: 课程所有学生,3-5人一组共同完成;
非三年级同学在组队时遇到困难可以与老师沟通。
(2)提交内容:
a.源代码;可执行文件;三维数据模型;
b.实验报告;
c.ppt展示绘制结果的视频。
(3)功能需求:
a.实现光线追踪算法,用Whitted光照模型渲染场景;
(可选)通过亚像素采样消除模糊效果。
b.材质:支持环境光、漫反射、高光和透射等光学现象;
(可选) 支持纹理绘制以获得额外分数。
c.光源:至少有一个点光源,支持阴影投射;
(可选)增加更多点光源可以获得更多加分。
d.场景:支持圆体及三角网格模型;
(可选) 增加椭球、参数曲面等形状可以获得额外加分。
e.输入输出:读取网格文件,并保存渲染图像为位图格式,大小可通过参数调整;
(可选) 从mtl材质库中读入材质信息。
f.加速:使用空间划分(八叉树或BSP)进行优化处理。