计算机图形学 光照及纹理报告

合集下载

图形学光照实验报告

图形学光照实验报告
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
for(int i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
deltax += 2;
deltay += 4;
x++;
y--;
}
CirclePt( x0, y0, x, y, mColor);
}
}
//根据中点圆算法填充圆域
void FlatCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);

计算机图形学实验报告4

计算机图形学实验报告4

计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。

二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。

三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。

通过设置线条颜色、填充颜色等属性,增强图形的表现力。

2、图形的几何变换实现图形的平移、旋转和缩放操作。

观察不同变换参数对图形的影响。

3、三维图形的生成构建简单的三维模型,如立方体、球体等。

应用光照和材质效果,使三维图形更加逼真。

四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。

然后,定义绘图窗口的大小和坐标范围。

接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。

最后,设置图形的颜色和填充属性,使图形更加美观。

2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。

对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。

对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。

3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。

然后,设置光照的位置、颜色和强度等参数。

接着,为模型添加材质属性,如颜色、反射率等。

最后,使用渲染函数将三维模型显示在屏幕上。

五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。

例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。

2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。

在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。

3、三维图形的生成生成的三维模型具有一定的立体感和真实感。

计算机图形学第五次实验报告

计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。

二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。

三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。

要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。

物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。

用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。

世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。

为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。

物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。

观察坐标系的原点一般即是观察点。

物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。

因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。

这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)————————————————————————————————作者:————————————————————————————————日期:大作业报告实验课程名称:计算机图形学学生姓名:班级:学院(系):学生学号:指导教师:成绩:一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。

二、主要功能模块设计1 矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。

代码设计:float vv(float * v1, float * v2){return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}void vxv(float * n, float * v1, float * v2){n[0] = v1[1] * v2[2] - v1[2] * v2[1];n[1] = v1[2] * v2[0] - v1[0] * v2[2];n[2] = v1[0] * v2[1] - v1[1] * v2[0];}void loadIdentity(Matrix m){Matrix identity = {{1.0,0.0,0.0,0.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0},{0.0,0.0,0.0,1.0}};for(int i = 0;i < 4; i++)for(int j = 0;j < 4; j++)m[i][j] = identity[i][j];}void preMultiply(Matrix p, Matrix m){int i , j;Matrix t;for( i = 0; i < 4; i ++)for( j = 0; j < 4; j++)t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];for( i = 0; i < 4; i ++)for( j = 0; j < 4; j ++)m[i][j] = t[i][j];}2 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。

图形学实验报告

图形学实验报告

图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。

通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。

实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。

我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。

通过改变像素的颜色值,我们可以创建出各种各样的图像效果。

实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。

我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。

这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。

实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。

我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。

通过这些技术,我们可以创建出更加复杂和精细的图像。

实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。

我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。

通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。

实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。

我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。

通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。

实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。

我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。

通过这些技术,我们可以创建出逼真的三维场景和动画效果。

总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。

我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验及课程设计:内容简介:《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》是《计算机图形学基础教程(Visual C++版)》教材的配套实验教材,提供了18个综合性教学实验和5个课程设计项目,可以满足计算机图形学课堂上机实验和设计周课程设计任务。

实验项目编排上由浅入深,通过定义基础类、直线类、变换类、填充类、光照类,最终构造了三维动态光照场景。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》的全部内容都基于MFC框架完成,彩插中展示的所有图形均使用CDC类的SetPixel()成员函数绘制,未包含任何图形学库。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》的教学实验和课程设计项目的源代码和实验拓展项目的可执行文件全部提供在笔者的个人网站上,请读者下载后参照源代码学习。

通读本书,读者可以轻松掌握柏拉图正多面体(正四面体、正六面体、正八面体、正十二面体和正二十面体)、球体、圆环等三维物体的线框模型、表面模型的建模方法。

在三维动态光照场景中,可以调整物体表面模型的材质、添加纹理细节,改变视点和光源的位置,完成三维真实感图形的动态绘制。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》内容全面、案例丰富、注重理实一体化,适合作为本科计算机图形学的实验和课程设计教材。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》为源代码提供了详尽的注释,可供计算机图形学爱好者从编程的角度理解和掌握计算机图形学原理。

计算机图形学实验报告--纹理映射

计算机图形学实验报告--纹理映射

glRotatef(x,1.0f,0.0f,0.0f); glRotatef(y,0.0f,1.0f,0.0f); glRotatef(z,0.0f,1.0f,1.0f);
// 在 X 轴上旋转立方体 // 在 Y 轴上旋转立方体 // 在 YZ 轴上旋转立方体
glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[4]); glBegin(GL_QUADS); // Left Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
//Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (TextureImage[0]=LoadBMP("Data/Crate.bmp")) { Status=TRUE; // Set The Status To TRUE // Create The Texture
if (TextureImage[0]) {if (TextureImage[0]->data) {
// If Texture Exists // If Texture Image Exists

计算机图形学实验报告-实验5Phong光照模型

计算机图形学实验报告-实验5Phong光照模型

计算机图形学实验报告班级计算机工硕班学号 **********姓名王泽晶实验五: Phong光照模型实验目的通过本次试验,学生可以掌握简单光照明模型的计算,以及真实感绘制中三维场景搭建的初步知识。

实验内容:对给定的光源、相机状态,对球进行Phong光照明模型绘制。

搭建三维场景:a)在三维空间中摆放1个球,半径为R,默认为50 ,摆放位置为(0,0,0)b)球的材质默认值为Ka = (0.1,0.1,0.1), Kd = (0,0,0.8), Ks = 0.2, n = 10c)视点方向初始为(0,0,1),光源方向初始为(1,1,1)d)视口设置为x0 = -100, y0 = -75, w = 200, h = 150使用phong模型绘制场景试验步骤:添加成员函数,编写成员数代码为override public function computeIntersection( viewStart:Vec3, viewDir:Vec3):Boolean {// See /geometry/sphereline/var viewEnd:Vec3 = viewStart.add(viewDir);var A:Number = Math.pow(viewEnd.getVec(0) - viewStart.getVec(0), 2)+Math.pow(viewEnd.getVec(1) - viewStart.getVec(1), 2) +Math.pow(viewEnd.getVec(2) - viewStart.getVec(2), 2);var B:Number =((viewEnd.getVec(0) - viewStart.getVec(0)) * (viewStart.getVec(0) - _position.getVec(0)) +(viewEnd.getVec(1) - viewStart.getVec(1)) * (viewStart.getVec(1) -_position.getVec(1)) +(viewEnd.getVec(2) - viewStart.getVec(2)) * (viewStart.getVec(2) -_position.getVec(2))) * 2.0;var C:Number = Math.pow(_position.getVec(0) - viewStart.getVec(0), 2) + Math.pow(_position.getVec(1) - viewStart.getVec(1), 2) +Math.pow(_position.getVec(2) - viewStart.getVec(2), 2) - _radius*_radius;// Solve C + Bt + At^2 = 0var delta:Number = B*B - 4*A*C;if ( delta<0.0 || A==0.0 ) return false;// We don't consider whether 0<t<1 here because real viewer is at infinite place var t1:Number = (-B + Math.sqrt(delta)) / (2*A);var t2:Number = (-B - Math.sqrt(delta)) / (2*A);if ( t1<t2 )point = viewStart.multiplyk(1.0 - t1).add(viewEnd.multiplyk(t1));elsepoint = viewStart.multiplyk(1.0 - t2).add(viewEnd.multiplyk(t2));normal = Vec3.normalize(point.minus(_position));return true;}public var _width :Number =0.0;public var _height:Number = 0.0;public var data:Array = new Array();protected function group1_creationCompleteHandler(event:FlexEvent):void{draw();}public function draw():void{graphics.clear();if(txtViewDir.text == "")return;var ary:Array = txtViewDir.text.split(",");var flag:Boolean = false;for(var i:int= 0;i<ary.length;i++){if(ary[i] == "" || isNaN(ary[i])){flag = true;break;}}if(flag)txtViewDir.setStyle("color",0xff0000);return;}txtViewDir.setStyle("color",0x000000);var viewDir:Vec3 = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));ary = txtLight.text.split(",");flag = false;for(i= 0;i<ary.length;i++){if(ary[i] == "" || isNaN(ary[i])){flag = true;break;}}if(flag){txtLight.setStyle("color",0xff0000);return;}txtLight.setStyle("color",0x000000);var light:Light = new Light();light.direction = new Vec3(Number(ary[0]), Number(ary[1]),Number(ary[2])).negative();light.ambient = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));light.intensity = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));var material:Material = new Material();material.diffuse =new Vec3(0.0, 0.0, 0.8);material.specular =new Vec3(0.2, 0.2, 0.2);material.ambient =new Vec3(0.1, 0.1, 0.1);data = createSceneImage( 200, 150, viewDir, light, material );drawImg();}public function drawImg():void{for(var y:int = 0 ;y<150;y++)for(var x:int =0;x<200;x++){var index:int = (y*200 + x) * 3;var r:Number = data[index+0];var g:Number = data[index+1];var b:Number = data[index+2];var cl:uint =(r << 16) | (g << 8) | b;this.graphics.beginFill(cl)this.graphics.drawCircle(x,y,1);this.graphics.endFill();}}}public function allocateBuffer( width:int,height: int ):Array{var data:Array = new Array();data.length = width * height * 3;_width = width;_height = heightreturn data;}public function createSceneImage( width:int,height: int ,viewDir:Vec3, light:Light, material:Material ):Array{var data:Array = new Array();var sphere:SphereObject = new SphereObject(50.0);sphere.setPosition(new Vec3(0.0, 0.0, 0.0) );sphere.setMaterial( material );var halfW:int = width / 2var halfH:int = height / 2;for ( var y:int=0; y<height; ++y ){for ( var x:int=0; x<width; ++x ){var viewStart:Vec3 = new Vec3(Number(x - halfW), Number(y - halfH), 0.0);if ( puteIntersection(viewStart, viewDir) )sphere.color = puteColor(light, viewDir, sphere.normal);elsesphere.color = new Vec3(0.1, 0.1, 0.1);var index:int = (y*width + x) * 3;data[index+0] = (sphere.color.getVec(0) * 255.0);data[index+1] = (sphere.color.getVec(1) * 255.0);data[index+2] = (sphere.color.getVec(2) * 255.0);}}return data;}protected function button1_clickHandler(event:MouseEvent):void {// TODO Auto-generated method stubdraw();}编译运行得到如下结果:。

计算机图形学实验报告

计算机图形学实验报告

实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。

图形学 实验报告

图形学 实验报告

图形学实验报告一、实验介绍图形学是计算机科学中的一个重要领域,主要研究计算机图形的生成、显示和处理。

本次实验旨在通过学习图形学的基本概念和算法,深入理解计算机图形的原理与应用。

二、实验内容本次实验主要包含以下内容:1. 图形学的基本概念和历史发展2. 图形学中常用的几何变换和投影算法3. 光栅化算法及其在图形渲染中的应用4. 着色和光照模型的原理及实现方法5. 三维场景建模与渲染技术三、实验步骤和结果1. 图形学的基本概念和历史发展首先我们了解了图形学的基本概念和历史发展。

图形学起源于20世纪60年代,当时主要用于计算机辅助设计(CAD)和计算机辅助制造(CAM)领域。

随着计算机技术的不断发展,图形学逐渐应用于计算机图形的显示和处理领域。

2. 几何变换和投影算法接下来我们学习了图形学中常用的几何变换和投影算法。

几何变换包括平移、旋转和缩放等操作,通过改变图形的位置、角度和尺寸,实现对图形的变换和组合。

投影算法主要用于将三维空间中的图形投影到二维屏幕上,实现透视效果。

3. 光栅化算法及其应用在图形渲染中,光栅化算法是非常常用的技术。

光栅化算法将连续的几何图形转化为离散的像素,实现图形在屏幕上的显示。

常见的光栅化算法包括扫描线算法和边界填充算法。

4. 着色和光照模型的原理与实现为了实现真实感的图形渲染,着色和光照模型是不可或缺的。

着色模型描述了在光照条件下物体表面的颜色,常见的着色模型包括平面着色模型和高洛德着色模型。

光照模型则描述了光线在物体表面的反射和折射过程,常见的光照模型包括冯氏光照模型和布林-菲菲尔德模型。

5. 三维场景建模与渲染技术最后我们学习了三维场景建模与渲染技术。

三维场景建模主要包括建立三维模型和场景的几何结构信息。

三维渲染技术则是将建模得到的三维场景转换为可显示的二维图像。

四、实验总结通过本次实验的学习,我们深入了解了图形学的基本概念和算法。

图形学在计算机图形的生成、显示和处理中具有重要应用,对于计算机科学专业学生来说,学习图形学是必不可少的。

-计算机图形学实验报告

-计算机图形学实验报告

计算机图形学实验报告姓名:_____________学号:_____________班级:_____________时间:_____2016年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。

学会配置OpenGL环境,并在该环境中编程绘图。

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

OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。

当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。

OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。

OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令〉〈可选的参数个数><可选的参数类型〉。

了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。

3.实验代码及结果3。

1点的绘制:#include〈gl/glut。

h>void Initial(void){glClearColor(1.0f,1.0f,1。

0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告引言计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。

本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。

实验目的1. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。

实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。

首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。

其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。

实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。

通过矩阵运算,我们可以很方便地实现这些变换。

例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。

类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。

2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。

它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。

其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。

通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。

3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。

通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。

4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。

通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。

其中,常用的绘制算法有Bresenham算法和扫描线算法等。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。

本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。

一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。

本次实验主要涉及三维图形的建模、渲染和动画。

二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。

通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。

这些基本操作为后续的图形处理和渲染打下了基础。

2. 光照和着色光照和着色是图形学中重要的概念。

我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。

通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。

3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。

通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。

在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。

4. 动画和交互动画和交互是计算机图形学的重要应用领域。

在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。

通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。

三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。

然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。

在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。

四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。

我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。

计算机图形学实验报告

计算机图形学实验报告
等领域。
实验内容:通 过实验掌握光 照模型的原理 和实现方法, 了解不同光照 模型对物体表 面光照效果的
影响。
纹理映射
定义:将纹理图像映射到三维物 体表面的过程
方法:根据物体表面的几何形状, 将纹理图像按照一定的规则和算 法进行拉伸、扭曲和拼接等操作, 最终覆盖在物体表面
添加标题
添加标题
添加标题
添加标题
提高编程能力
熟练使用相关编程语言和工 具
掌握计算机图形学的基本原 理和算法
学会分析和解决图形学中的 问题
提高编程技巧和解决问题的 能力
02
实验内容
图形渲染流程
加载场景和模型 设置相机和光源 几何着色器处理顶点数据 光栅化着色器生成像素数据
OpenGL基本操作
创建窗口:使用OpenGL创建 窗口,设置渲染上下文
熟悉图形渲染流程
了解图形渲染的 基本原理和流程
掌握图形渲染的 关键技术和技巧
熟悉图形渲染的 应用场景和优势
Hale Waihona Puke 掌握图形渲染的 未来发展方向和 趋势
掌握OpenGL的使用
学习OpenGL的基本概念和原理 掌握OpenGL的编程接口和开发流程 理解OpenGL在计算机图形学中的应用和优势 学会使用OpenGL进行基本的图形渲染和交互操作
目的:增加物体的表面细节和真 实感
应用:游戏开发、电影制作、虚 拟现实等领域
03
实验过程
实验环境搭建
安装操作系统: 选择适合的操
作系统,如 Windows或
Linux
安装开发工具: 安装所需的集
成开发环境 (IDE)和编
译器
安装图形库: 安装OpenGL、
DirectX或其 他的图形库

计算机形学中的光照与纹理映射技术

计算机形学中的光照与纹理映射技术

计算机形学中的光照与纹理映射技术计算机形学是计算机科学中的一个重要分支,主要研究计算机生成的图像和动画。

在计算机形学中,光照与纹理映射技术是非常关键的部分。

本文将介绍光照模型和纹理映射技术的基本原理,并探讨它们在计算机图形学中的应用。

一、光照模型光照模型是计算机形学中用于模拟光照效果的数学模型。

它考虑光源、物体表面的特性以及观察者的位置和视角等因素,通过计算光的入射方向和强度来确定场景中物体的明暗效果。

常见的光照模型包括环境光、漫反射光和镜面反射光等。

1. 环境光环境光是指来自各个方向的均匀光,其强度在整个场景中保持不变。

它可以被看作是光线在场景中多次反射后形成的间接光,用于模拟室外环境或场景中的全局光照效果。

2. 漫反射光漫反射光是指光线射向物体表面后,根据表面法线的方向发生均匀散射产生的光。

根据光线入射方向和表面法线的夹角,漫反射光的强度会有所变化。

这种光照效果模拟了物体表面的粗糙程度以及光线的入射角度对物体整体明暗效果的影响。

3. 镜面反射光镜面反射光是指光线射向物体表面后,根据表面法线的方向发生反射产生的光。

镜面反射光的强度与入射光线与表面法线的夹角以及镜面反射系数有关。

这种光照效果模拟了物体表面的光亮部分,使其看起来更加真实。

二、纹理映射技术纹理映射是将二维图像(称为纹理)映射到三维物体表面的技术。

通过在三维模型的表面上贴上纹理,可以赋予物体更加真实的外观,增加细节和表现力。

1. 纹理坐标纹理坐标定义了二维纹理中的每个像素在三维物体表面的位置。

它以UV坐标的形式存在,其中U和V分别代表纹理上的水平和垂直方向。

2. 纹理坐标映射纹理坐标映射是通过计算物体表面上每个点的纹理坐标来确定纹理中对应的像素颜色。

根据纹理坐标的变化规律,可以实现图像在物体表面上的平铺、拉伸、旋转等操作,以达到所需的效果。

3. 纹理滤波纹理滤波用于解决纹理映射过程中的采样问题,使得物体表面看起来更加平滑。

最常用的纹理滤波算法包括最近邻插值、双线性插值和三线性插值等。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告SA03006073 魏思介绍:所有实验用一个MFC程序完成。

组合成一个类似于画图程序。

程序左边面板上有所有的按钮,要完成功能只要点击相应按钮然后在客户区操作就可以了。

实验一、图元的生成实验要求:能够生成直线、圆、椭圆、可以按照给定的边界顶点完成区域填充。

实验内容:直线生成:使用Bresenhan方法绘制直线。

使用介绍:鼠标点击左边按钮区域的直线按钮,然后在右边客户区域内点下鼠标左键,拖动鼠标倒你想要绘制的地方,就可以形成一条直线。

这个直线是用MFC提供的CDC类的LinetTo() 函数绘制的。

然后开始自己的直线生成算法来重新绘制,使用红色的线条来绘制直线,系统提供的直线函数是用来做参考的。

椭圆和圆的生成:使用Bresenhan方法绘制椭圆和圆。

使用介绍:和直线基本类似,鼠标点击按钮区域的椭圆或者是圆按钮,然后在右边客户区域内点下鼠标左键,拖动鼠标倒你想要绘制的地方,就可以形成一个圆或者是椭圆。

这个圆或者是椭圆是使用MFC提供的CDC类的Ellipse() 函数绘制的。

然后开始自己的椭圆和圆生成算法来重新绘制,使用红色的线条来绘制,系统提供的椭圆或者是圆函数是用来做参考的。

区域填充:使用边扫描填充法完成区域填充使用介绍:鼠标点击按钮区域的正方形按钮,会弹出一个输入对话框。

在这个对话框里,输入包含你要求填充的区域的线条坐标。

格式如下(以正方形为例):(0,0),(100,0)(100,0),(100,100)(100,100),(0,100)(0,100),(0,0)点击确定以后,首先根据输入的线条坐标绘制出区域的边界。

然后使用填充算法来填充区域。

为了方便观察,采用了延时100毫秒显示下一个点。

所以有缓慢的感觉,不是算法的问题。

实验二、样条曲线的生成实验要求:能够生成Bezier曲线、B-样条曲线实验内容:Bezier曲线生成:鼠标点击按钮区域的Bezier按钮,弹出一个对话框。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学》综合训练项目报告关键代码及界面展示1.源代码//头文件#ifndef GLWIDGET_H#define GLWIDGET_H#include <QtOpenGL>#include <QWidget>class GLWidget : public QGLWidget{Q_OBJECTpublic:explicit GLWidget(QGLWidget *parent = 0);~GLWidget();protected:void initializeGL();void paintGL();void resizeGL(int width, int height);void keyPressEvent(QKeyEvent *e);void loadTextures();bool fullscreen;GLuint texture[3];private:float rotate_angle;float zoom;float rotate_speed;int filter;bool light;bool blend;};#endif // GLWIDGET_H//主函数#include "glwidget.h"#include <QApplication>#include <QGraphicsView>#include <QGraphicsScene>#include <QGraphicsItem>int main(int argc, char *argv[]){QApplication a(argc, argv);GLWidget w;w.show();return a.exec();}//程序主要代码void GLWidget::initializeGL(){setGeometry(300, 150, 500, 500);//设置窗口初始位置和大小loadTextures();glEnable(GL_TEXTURE_2D);//允许采用2D纹理技术glShadeModel(GL_SMOOTH);//设置阴影平滑模式glClearColor(0.0, 0.0, 0.0, 0);//改变窗口的背景颜色,不过我这里貌似设置后并没有什么效果glClearDepth(1.0);//设置深度缓存glEnable(GL_DEPTH_TEST);//允许深度测试glDepthFunc(GL_LEQUAL);//设置深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//进行透视校正/*opengl中支持8个光源,即GL_LIGHT0~GL_LIGHT7*/glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);//指定光源1的环境光参数glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);//指定光源1的漫射光参数glLightfv(GL_LIGHT1, GL_POSITION, light_position);//指定光源1的位置glEnable(GL_LIGHT1);//允许光源1的使用// glEnable(GL_LIGHTING);//我们还需要启动总光源开关,默认的时候不开,后面的L键来控制开启和关闭glColor4f(1.0, 1.0, 1.0, 0.5);//后面的步骤都是以全亮绘制物体,并且50%的透明度glBlendFunc(GL_SRC_ALPHA, GL_ONE);}void GLWidget::paintGL(){//glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/*下面开始画立方体,并对其进行纹理映射*/glLoadIdentity();glTranslatef(0.0, 0.0, zoom);glRotatef(rotate_angle, -0.4f, 0.4f, -1.0f);glBindTexture(GL_TEXTURE_2D, texture[filter]);//这句代码一定要,因为在initializeGL()函数中已绑定一个固定的纹理目标了glBegin(GL_QUADS);//上顶面glNormal3f(0.0, 1.0, 0.0);//该函数指定是法线的方向为向量(x, y, z)方向,在使用光源且对空间物体进行纹理映射时,每个面都需要指定其法线的方向,否则会出现各种意外的结果。

glTexCoord2f(0.0, 1.0);//将2D的纹理坐标映射到3D的空间物体表面上glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, -1.0f);//下顶面glNormal3f(0.0, -1.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, -1.0f, -1.0f);//正前面glNormal3f(0.0, 0.0, 1.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, 1.0f);//右侧面glNormal3f(1.0, 0.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, -1.0f);//背后面glNormal3f(0.0, 0.0, -1.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(1.0f, 1.0f, -1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(-1.0f, -1.0f, -1.0f);//左侧面glNormal3f(-1.0, 0.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(-1.0f, 1.0f, 1.0f);glEnd();rotate_angle += rotate_speed;}void GLWidget::resizeGL(int width, int height){if(0 == height)height = 1;//防止一条边为0glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了glMatrixMode(GL_PROJECTION);//选择投影矩阵glLoadIdentity();//重置选择好的投影矩阵gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵glMatrixMode(GL_MODELVIEW);//以下2句和上面出现的解释一样glLoadIdentity();}void GLWidget::keyPressEvent(QKeyEvent *e){switch(e->key()){/*L键位开启光照的开关*/case Qt::Key_L:light = !light;if(!light)glDisable(GL_LIGHTING);glEnable(GL_LIGHTING);updateGL();break;/*B键位选择是否采用色彩融合*/case Qt::Key_B:blend = !blend;if(blend){glEnable(GL_BLEND);glDisable(GL_DEPTH_TEST);}else{glDisable(GL_BLEND);glEnable(GL_DEPTH_TEST);}updateGL();break;/*F键位选择纹理滤波的方式*/case Qt::Key_F:filter += 1;if(filter > 2)filter = 0;updateGL();break;/*PageUp键为将木箱移到屏幕内部方向*/ case Qt::Key_PageUp:zoom -= 0.2;updateGL();break;/*PageDown键为将木箱移到屏幕外部方向*/ case Qt::Key_PageDown:zoom += 0.2;updateGL();break;/*Up键为加快立方体旋转的速度*/case Qt::Key_Up:rotate_speed += 1.0;updateGL();break;/*Down键为减慢立方体旋转的速度*/case Qt::Key_Down:rotate_speed -= 1.0;updateGL();/*F1键为全屏和普通屏显示切换键*/case Qt::Key_F1:fullscreen = !fullscreen;if(fullscreen)showFullScreen();else{setGeometry(300, 150, 500, 500);showNormal();}updateGL();break;/*Ese为退出程序键*/case Qt::Key_Escape:close();}}/*加载纹理*/void GLWidget::loadTextures(){QImage tex, buf;if(!buf.load(":resources/c.jpg"))// if(!buf.load(":resources/c.jpg")){qWarning("Cannot open the image...");QImage dummy(128, 128, QImage::Format_RGB32);//当没找到所需打开的图片时,创建一副128*128大小,深度为32位的位图dummy.fill(Qt::green);buf = dummy;}tex = convertToGLFormat(buf);//将Qt图片的格式buf转换成opengl的图片格式texglGenTextures(3, &texture[0]);//开辟3个纹理内存,索引指向texture[0] /*建立第一个纹理*/glBindTexture(GL_TEXTURE_2D, texture[0]);glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);/*建立第二个纹理*/glBindTexture(GL_TEXTURE_2D, texture[1]);glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);/*建立第三个纹理*/glBindTexture(GL_TEXTURE_2D, texture[2]);gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tex.width(), tex.height(), GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());//该函数对所加载的纹理像素没有要求是2的n次方,可以是任意的像素glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);//mipmap方式是当物体很远时,也能保留很好的细节,所以它的运算量很大,速度很慢,这里GL_LINEAR_MIPMAP_NEAREST是混合使用}2.界面展示。

相关文档
最新文档