opengl实验四【太阳系】
实验三 基于OpenGL的圆柱绘制 OpenGL纹理光照资料

实验三基于OpenGL的圆柱绘制1. 实验目的通过圆柱的绘制,掌握OpenGL编程环境的设置,基本图元的使用,光照的设置以及纹理的设置,理解曲面绘制的基本原理。
2. 实验内容(1)设置OpenGL编程环境;(2)利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱;(3)设置光照(4)设置纹理:在圆柱的侧面上显示一张图片3.主要问题&结果截图①如何绘制圆柱?一种方法是调用gluc中的函数gluCylinder但本实验要求利用三角形和四边形等基本图元绘制所以这里主要采用类似微积分的方式绘制,就是将椭圆的侧面用多个四边形,底面用多个三角形来表示关键代码void Circle()底面的圆形void Cylinder()圆柱的侧面glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串glVertex3f(0.0f, 0.0f, 0.0f);//圆心:这是三角形作为圆心的顶点int i = 0;for (i = 0; i <= 360; i += 15) glBegin(GL_QUAD_STRIP);//连续填充四边形串int i = 0;for (i = 0; i <= 360; i += 15){float p = i * 3.14 / 180;glTexCoord2f(p/10,0.1f);{float p = i * 3.14 / 180;glVertex3f(sin(p), cos(p), 0.0f);//圆周:这是三角形作为扇形弧端点的顶点(p的值取0-2PI)就能画出一个类似圆形}glEnd();glVertex3f(sin(p), cos(p), 1.0f);//这个1.0f 指定的是高度glTexCoord2f(p/10,0.0f);glVertex3f(sin(p), cos(p), 0.0f);}glEnd();效果:再调用画圆形的函数画上两个底面Circle();glTranslatef(0, 0, 1);//设定高度为1,画上底面Circle();效果:②如何纹理贴图?关键代码:glEnable(GL_TEXTURE_2D);//执行纹理映射,启用二维文理glBindTexture(GL_TEXTURE_2D, ID);//允许建立一个绑定到目标纹理的有名称的纹理//ID ——纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用纹理贴图的原理是纹理映射,即将纹理图片上的点和图形中的点建立对应关系。
OPENGL_实验指导书

虚拟飞行技术基础实验指导书梅跃松实验1. OpenGL程序框架及基础图形绘制一、实验目的:了解OpenGL的程序框架,并学会在Windows环境下绘制点、线、面等基础图形,并会设置背景及对象颜色。
二、实验内容:要求创造一个窗口,窗口标题为“绘制几何图元”,窗口大小为320*240,窗口左上角坐标(100,150),在创建窗口时使用单缓冲区窗口(GLUT_SINGLE)并使用RGB颜色模式(GLUT_RGB),背景白色,在(50.0,50.0),(150.0,60.),(100.0,200.0)位置各画三个点,点大小为4个像素,以(200.0,50.0),(300.0,70.0),(290.0,100.0),(210.0,200.0)为四个顶点画四边形,点和四边形皆为红色,裁剪区域为(0,0)到(300,240)。
三、实验要求:下课前通过Email:mys001@提交程序。
实验2. OpenGL平移、旋转和缩放技术一、实验目的:了解OpenGL中从未加工的顶点数据到屏幕坐标的过程,掌握平移、旋转和缩放方法。
二、实验内容:要求设计一个正方体,该正方体六个面无重复颜色,并且绕(0,0,0)和(-1,1,0)两点所确定的轴旋转。
三、实验要求:下课前通过Email:mys001@提交程序。
实验3. OpenGL矩阵堆栈技术和投影技术一、实验目的:掌握OpenGL程序的矩阵堆栈技术和投影技术,以及鼠标和键盘的使用。
二、实验内容:仿照课堂上讲解的原子核程序设计一个飞机绕原子核飞行的程序,亦即绘制一个纸飞机,使其替换掉绕Y轴旋转的电子,要求程序中使用投影技术,并且可以用鼠标来控制飞机的飞行,鼠标左键点击,飞机沿逆Y轴方向逆时针飞行,鼠标右键点击,飞机则顺时针飞行。
三、实验要求:下课前通过Email:mys001@提交程序。
实验4. OpenGL光照技术和材质技术一、实验目的:掌握OpenGL程序的光照技术和材质技术,学会环境光、散射光、镜面光和辐射光四种场景光的使用,学会光源的使用,并了解不同材质设定下的不同的作用效果,学会多光源的使用。
三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。
1、新建一个Win32 Application的工程。
2、向工程项目添加C++源文件。
3、将OpenGL框架复制到文件中。
4、设置OpenGL窗口标题。
二、场景设置。
1、视线处于一具有地板及前、左、右三面墙壁的空间中。
2、空间顶部中央有一光源。
3、空间中央有一地球仪,不断旋转。
三、建立视口结构及视点属性。
1、在坐标系上建立视图结构。
如图。
2、参数设置。
窗口大小:800*600。
视口大小:800*600。
透视深度:0.1~100。
透视角:60°。
视点位置:(0.0, 2.0, 15.0)。
视线方向:z轴负方向。
视点上方向:y轴正方向。
3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。
四、绘制三维图形。
1、开启深度测试模式。
为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。
直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。
2、绘制地面与墙壁。
调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。
坐标系结构如图。
3、绘制地球仪。
设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。
(1)参数设置。
球面半径:2。
球面细度:水平100,垂直100。
柱面半径:0.05。
柱面高度:1。
柱面细度:水平50,垂直1。
(2)结构如图。
4、绘制模拟光源。
(1)绘制“灯罩”。
调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。
(2)绘制“灯泡”。
OpenGL上机实验全

OpenGL上机实验全⽬录1 OpenGL的基本框架1.1 OpenGL简介 (1)1.2 OpenGL的⼯作⽅式 (2)1.3 OpenGL的操作步骤 (3)1.4 OpenGL的组成 (3)1.5 OpenGL的数据类型 (4)1.6 OpenGL函数命名约定 (4)1.7 ⽤OpenGL绘制图形 (4)1.8 ⽤OpenGL制作动画 (9)2 图形的绘制2.1 空间点的绘制 (13)2.2 直线的绘制 (14)2.3多边形⾯的绘制 (18)2.4平⾯多⾯体的绘制 (24)3 图形变换3.1OpenGL中的变换 (30)3.2模型视图矩阵 (31)3.3 矩阵堆栈 (35)4 OpenGL中的颜⾊、光照和材质4.1 颜⾊ (42)4.2 光照模型 (42)4.3 材质属性 (43)4.4 使⽤光照 (43)4.5 使⽤光源 (48)附录:参考函数1.1 颜⾊使⽤ (58)1.2 绘制⼏何图元 (59)1.3 坐标转换 (63)1.4 堆栈操作 (66)1.5 使⽤光照和材质 (68)1.6 帧缓存操作 (72)1.7 查询函数 (72)1.8 窗⼝初始化和启动事件处理 (75)1.9 窗⼝管理 (77)1.10 菜单管理 (80)1.11 注册回调函数 (82)1.12 ⼏何图形绘制 (84)1OpenGL的基本框架1.1OpenGL简介在计算机发展初期,⼈们就开始从事计算机图形的开发,但直到20世纪80年代末90年代初,三维图形才开始迅速发展。
于是各种三维图形⼯具软件包相继推出,如GL,RenderMan等,但没有⼀种软件包能够在三维图形建模能⼒和编程⽅便程度上与OpenGL相⽐拟。
OpenGL(Open Graphics Library,开放图形库),是⼀个三维的计算机图形和模型库,它源于SGI公司为其图形⼯作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。
SGI公司在1992年6⽉发布1.0版,后成为⼯业标准。
实验七 OpenGL光照效果

1.实验七OpenGL光照效果(选做)1.实验七:OpenGL光照效果。
2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。
3.实验要求:(1)先做实验项目:实验六“OpenGL组合图形”。
(2)每人一组,独立完成。
(3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形”中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一定的光照明暗效果。
4.实验原理及内容:在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。
OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定的真实感光照效果。
(1)颜色:OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red, green, blue[, alpha]);glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。
在该函数之后绘制的所有物体都将使用该颜色。
(2)光线:OpenGL的光照模型中将光源分成四种:发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。
环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。
被环境光照射的物体,各个表面都均等受光。
散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。
镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。
高亮度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。
对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。
除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。
在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。
太阳系行星运行模拟C程序语言

太阳系行星运行模拟组员:2011年9月2日概述太阳系(Solar System)就是我们现在所在的恒星系统。
它是以太阳为中心,和所有受到太阳引力约束的天体的集合体:8颗行星冥王星已被开除、至少165颗已知的卫星,和数以亿计的太阳系小天体。
这些小天体包括小行星、柯伊伯带的天体、彗星和星际尘埃。
广义上,太阳系的领域包括太阳、4颗像地球的内行星、由许多小岩石组成的小行星带、4颗充满气体的巨大外行星、充满冰冻小岩石、被称为柯伊伯带的第二个小天体区。
在柯伊伯带之外还有黄道离散盘面、太阳圈和依然属于假设的奥尔特云。
模拟太阳系不仅仅是完成作业,也能让我们更近一步的了解太阳系,拓广知识面,对行星的运行有基本的感性和理性感知。
增加我们对宇宙探索的渴望,可能培养出又一批天文学家。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。
它具有七大功能: 1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
2.变换:OpenGL图形库的变换包括基本变换和投影变换。
基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
OpenGL中的光照模型
OpenGL中的光照模型一、OpenGL的光照模型在OpenGL的简单光照模型中反射光可以分成三个分量,环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light):a、环境光Ambient,是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。
当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。
特征:入射方向和出射方向均为任意方向。
b、漫射光Diffuse,来自特定方向,它垂直于物体时比倾斜时更明亮。
一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮。
特征:入射方向唯一、出射方向为任意方向。
c、镜面光Specular,来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。
特征:入射方向和出射方向均唯一。
二、创建光源定义光源特性的函数:glLight*(light , pname, param)其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7;第二个参数pname指定光源特性,这个参数的辅助信息见表1所示;最GL_LIGHT0,其他几个光源的GL_DIFFUSE和GL_SPECULAR缺省值为(0.0,0.0,0.0,1.0)。
三、启用光源和明暗处理如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算。
要启用光照或关闭光照,调用函数:glEnable(GL_LIGHTING) 或glDisable(GL_LIGHTING)。
启用光照后必须调用函数glEnable(GL_LIGHT0) ,使所定义的光源有效。
其它光源类似,只是光源号不同而已。
在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为Gourand明暗处理(Gourand Shading)。
基于opengl的3D天体运动模型设计方案 精品
基于opengl的3D天体运动模型设计方案学生: ____???___学号: ************指导老师: ___???___一、背景简介1.1设计概述本3D建模设计运用Win32程序设计的基本原理,基于OpenGL接口函数,以Microsoft Visual Studio 2008为开发工具,以C++语言为开发语言,设计了一个星空背景下的太阳—地球—月球公转自转运动模型,模拟了太阳的光照效果,并实现了可以加速和减速地球和月球的自转、公转速度,而且还可以调整视图的远近和方位,方便各方面的观察。
1.2 OpenGL的基本特点OpenGL即开放图形库(Open Graphics Library),是一个三维的计算机图形和模型库。
OpenGL作为一个性能优越的图形应用程序设计接口,适用于广泛的计算机环境。
从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。
OpenGL是一个与硬件图形发生器的软件接口,它包括了100多个图形操作函数,开发者可以利用这些函数来构造景物模型、进行三维图形交互软件的开发。
正如上一章所述,OpenGL是一个高性能的图形开发软件包。
OpenGL支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。
OpenGL作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似于飞机、汽车、分子形状等复杂形体的图形操作函数。
用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型。
当然,像OpenInventor那样更高一级的基于OpenGL的三维图形建模开发软件包将提供方便的工具。
因此OpenGL的图形操作函数十分基本、灵活。
它具有如下特点。
(1)图形质量好、性能高。
无论是三维动画、CAD,还是视觉模拟、可视化计算等,都利用了OpenGL高图形质量、高性能的特点。
这个特点使得程序开发者在广播、CAD/CAM/CAE、娱乐、医学图像和虚拟现实等领域中创造和显示出难以想象的2D和3D图形。
5、CG实验2014版
计算机图形学实验指导书西北工业大学计算机学院二○一四年二月二十日1目录目录 (i)第一部分算法实验:基本算法实践 (2)实验一OpenGL基本框架实现 (2)实验二直线生成算法 (5)实验三直线生成、圆生成算法 (6)实验四圆(椭圆)的生成算法 (7)实验五区域填充算法 (7)实验六裁剪算法 (8)实验七曲线、曲面生成算法 (8)实验八图形变换 (8)第二部分应用实验(选作) (9)实验一太阳系运动模拟 (9)实验二圆内接正n角星的绘制 (9)实验三机械零件的三视图绘制 (9)实验四机械零件的正等轴测投影图 (10)实验五凸多面体的消隐处理 (10)实验六球面的消隐处理 (10)第三部分附录 (11)一、参考书籍 (11)二、网络资源 (11)i第一部分算法实验:基本算法实践实验一OpenGL基本框架实现一、实验教学目标与基本要求1.实现OpenGL程序的基本框架;2. 掌握基本的OpenGL辅助开发工具;3.实现基本的OpenGL演示程序;二、实验课程内容(2学时)基于GLFW辅助库,在VS2005/2008环境中实现旋转三角演示系统。
1. 熟悉OpenGL库配置过程;2. 掌握GLFW辅助库基本用法;3. 实现旋转演示程序,改动坐标等属性并观察执行效果,熟悉程序框架。
三、程序框架#include<GL/glfw.h>#include<stdlib.h>#include<stdio.h>#pragma comment( lib, "opengl32.lib") // OpenGL32连接库#pragma comment( lib, "glu32.lib") // GLu32连接库#pragma comment( lib, "glfw.lib") // GLu32连接库#define WINDOW_WIDTH 800#define WINDOW_HEIGHT 600static float xrot = 0.0f ,yrot = 0.0f ,zrot = 0.0f ;void initScene(int w,int h){// 启用阴影平滑glShadeModel( GL_SMOOTH );// 黑色背景glClearColor( 0.0, 0.0, 0.0, 0.0 );// 设置深度缓存glClearDepth( 1.0 );// 启用深度测试glEnable( GL_DEPTH_TEST );// 所作深度测试的类型glDepthFunc( GL_LEQUAL );2// 告诉系统对透视进行修正glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );}//根据实际算法修改此求值函数void GetLintPoint(int nStart[2],int nEnd[2],int * nPoint){int i = 0 ;int nXLen = nStart[0] - nEnd[0] ;int flag = -1 ;if( nXLen < 0 ){nXLen = -nXLen ;flag = 1 ;}for( i = 0 ; i <= nXLen ; ++i ){nPoint[i*2] = nStart[0]+i*flag ;nPoint[i*2+1] = nStart[1] ;}return ;}//这里进行所有的绘图工作void drawScene(int * nPoint,int nLen){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity(); // Reset The ViewglTranslatef(0.0f ,0.0f ,-5.0f );glRotatef(xrot,1.0f ,0.0f ,0.0f );glRotatef(yrot,0.0f ,1.0f ,0.0f );glRotatef(zrot,0.0f ,0.0f ,1.0f );//此处添加绘制函数利用算法更改vertex中坐标即可int i = 0 ;glPointSize(5) ;// 绘制示意空间点集glBegin(GL_POINTS);glColor3f(1.0,0.0,1.0) ;for (i = 0 ; i < nLen ; ++i ){glVertex3f(*(nPoint+i*2),*(nPoint+i*2+1),0.5f) ;}glEnd() ;glPointSize(1) ;//绘制示意直线glBegin(GL_LINES);for (i = 0 ; i < nLen ; ++i ){glColor3f(1.0,0.0,0.0) ;3glVertex3f(-2.0,0.0,1.0f) ;glColor3f(0.0,1.0,0.0) ;glVertex3f(2.0,0.0,1.0f) ;}glEnd() ;//绘制一个正方形glBegin(GL_QUADS);glColor3f(1.0f,0.0f,0.0f);glVertex3f(-1.0f , -1.0f , -0.0f );glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f , -1.0f , -0.0f );glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f , 1.0f , -0.0f );glColor3f(1.0f,1.0f,0.0f);glVertex3f(-1.0f , 1.0f , -0.0f );glEnd();// 交换缓冲区// xrot+=0.3f ;yrot+=0.2f ;// zrot+=0.4f ;glfwSwapBuffers();}//重置窗口大小后的回调函数void GLFWCALL resizeGL(int width, int height ){// 防止窗口大小变为if ( height == 0 ){height = 1;}// 重置当前的视口glViewport( 0, 0, (GLint)width, (GLint)height );// 选择投影矩阵glMatrixMode( GL_PROJECTION );// 重置投影矩阵glLoadIdentity();// 设置视口的大小gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );// 选择模型观察矩阵glMatrixMode( GL_MODELVIEW );glLoadIdentity();}int main( void ){//记录程序运行状态int running = GL_TRUE;//初始化GLFW4if( !glfwInit() ){exit( EXIT_FAILURE );}// 创建一个OpenGL 窗口if( !glfwOpenWindow( WINDOW_WIDTH,WINDOW_HEIGHT,6,6,6,0,32,0,GLFW_WINDOW) ){glfwTerminate();exit( EXIT_FAILURE );}//初始化OpenGL窗口initScene(WINDOW_WIDTH, WINDOW_HEIGHT);//设置窗口大小发生变化时的回调函数glfwSetWindowSizeCallback(resizeGL);//利用图形算法计算坐标int nStart[2] = {3,0} ;int nEnd[2] = {-3,0} ;int nXLen = nStart[0]-nEnd[0] ;if( nXLen < 0 )nXLen = -nXLen ;int nYLen= nStart[1]-nEnd[1] ;if( nYLen < 0 )nYLen = -nYLen ;int nAllLen = nXLen + nYLen + 2;int * nPos = new int[2*nAllLen] ;GetLintPoint(nStart,nEnd,nPos) ;//主循环while( running ){// OpenGL rendering goes here...glClear( GL_COLOR_BUFFER_BIT );// 当按下ESC键的时候触发running = !glfwGetKey( GLFW_KEY_ESC ) &&glfwGetWindowParam( GLFW_OPENED );drawScene(nPos,nAllLen);//延时.05秒glfwSleep(0.02 );// drawRotateScene() ;}glfwTerminate();//退出程序exit( EXIT_SUCCESS );}实验二直线生成算法一、实验教学目标与基本要求51.实现C语言的基本绘图方法;2. 实现直线基本生成算法;3.了解光栅图形显示器的工作原理和特点;4.掌握课本所介绍的图形算法的原理和实现。
OpenGL
OpenGL Shader实现光照发光体特效⽬录内发光原理发光体实现扩展效果⼩太阳光源移动效果内发光原理内发光原理简单概况是:采样周边像素alpha取平均值叠加效果。
概括来说似乎好像特别简单,但需要⼀定的理解和消化。
发光物体可以当做是⼀个圆形对象,去采集圆形对象周边像素值。
例如已知圆形半径是R,⾓度是Angle,然后根据半径和⾓度推导算出当前像素坐标位置,⽤当前像素坐标位置得到透明度再去做计算。
但其实在中似乎已经介绍过了同样能够通过。
不同点在于阴影遮盖是利⽤圆形绘制向外部晕染⽽内发光效果是作⽤于内部。
发光体实现⾸先采⽤绘制圆的⽅法实现RGB叠加。
可以看到中⼼位置绘制圆的位置颜⾊较深,向外扩散颜⾊逐渐暗淡。
效果虽然不对但已经知道下⼀步该怎么实现了。
void main() {vec2 uv = gl_FragCoord.xy / iResolution.xy;uv -= 0.5;uv.x *= iResolution.x/iResolution.y;vec3 color = vec3(0.);float glow = length(uv);color += glow;gl_FragColor = vec4(color,1.);}通过取反操作,可⽤⼀个数除以length(uv)再相乘⼀个⼩数来稍微减⼩值的⼤⼩。
从最终结果可以看到所期望的效果。
对⽐之前效果展⽰相除相当于对原结果取反,原先内部是数值最⼩,相除之后内部数值变成最⼤。
void main() {vec2 uv = gl_FragCoord.xy / iResolution.xy;uv -= 0.5;uv.x *= iResolution.x/iResolution.y;vec3 color = vec3(0.);float glow = 0.05 * 3./length(uv);color += glow;gl_FragColor = vec4(color,1.);}但过渡效果泛⽩范围似乎过⼤了⼀些继续对原算法进⾏优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实用标准 文档 学院 专业 班 学号 姓名: 教师评定:
#include #include #include #include #include #pragma comment(lib,"glaux.lib") //将glaux.lib连接到工程 enum //枚举鼠标变量 { BUTTON_LEFT ,//鼠标左键 }; int mButton = -1; int mOldY, mOldX; float z=0,c=0; float eye[3] = {0.0f, 0.0f, 2.0f}; //观察视角 float rot[3] = {45.0f, 45.0f, 0.0f}; //旋转变量 const int GL_WIN_WIDTH = 800; //窗口大小 const int GL_WIN_HEIGHT = 600; const int GL_WIN_INITIAL_X = 0; 实用标准 文档 const int GL_WIN_INITIAL_Y = 0; const int n = 1000,m=20; const float R = 1.2f,r=0.15f;//半径 const float Pi = 3.1415926536f; GLuint g_TexturesArray[7];//纹理指针 int iMode=1;
void ProcessMenu(int value)//弹出处理函数 { iMode=value; glutPostRedisplay();//强制刷新显示 }
void CreatePopMenu()//生成弹出式菜单函数 { int nMainMenu;//主菜单变量 nMainMenu=glutCreateMenu(ProcessMenu);//生成一个主菜单并指定菜单处理函数 glutAddMenuEntry("填充",1);//添加一个主菜单 glutAddMenuEntry("轮廓",2);//添加一个主菜单 实用标准 文档 glutAttachMenu(GLUT_RIGHT_BUTTON);//指定激活菜单的鼠标右键 }
bool LoadBMP(char *filename, GLuint &texture) //调贴图大小为2的幂 { AUX_RGBImageRec *pImage = NULL; pImage = auxDIBImageLoad(filename); // 装入位图 if(pImage == NULL) return false; // 位图没装入返回错误 glGenTextures(1, &texture); // 生成贴图(纹理) glBindTexture (GL_TEXTURE_2D,texture);// 捆绑贴图(纹理) gluBuild2DMipmaps(GL_TEXTURE_2D,4, //建立图形 pImage->sizeX, // 图形宽pImage->sizeX pImage->sizeY, // 图形高pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data // 图形数据 ); free(pImage->data); // 释放位图数据占据的内存资源 free(pImage); return true; // 返回成功 } 实用标准 文档 void Init() { glEnable(GL_DEPTH_TEST); //开启深度缓冲 glClearColor(0.0,0.0,0.0,1.0); glEnable(GL_TEXTURE_2D); //启用二维文理 //----------------载入图片-------------- LoadBMP("data/11.bmp",g_TexturesArray[0]); LoadBMP("data/12.bmp",g_TexturesArray[1]); LoadBMP("data/13.bmp",g_TexturesArray[2]); LoadBMP("data/14.bmp",g_TexturesArray[3]); LoadBMP("data/15.bmp",g_TexturesArray[4]); LoadBMP("data/16.bmp",g_TexturesArray[5]); LoadBMP("data/17.bmp",g_TexturesArray[6]); }
void glutResize(int width, int height)//重置OpenGL窗口大小 { glViewport(0, 0, width, height); //重置当前视口 glMatrixMode(GL_PROJECTION); //选择投影矩阵 glLoadIdentity(); //重置投影矩阵 实用标准 文档 gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);//设置视口大小 }
void glutDisplay(void) //显示函数 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//表示物体的前向和后向面用填充面显示 glPushMatrix(); //入栈 glTranslatef (-eye[0], -eye[1], -10); //视口 glBindTexture(GL_TEXTURE_2D, g_TexturesArray[0]); //----------------背景------------ glBegin(GL_QUADS); glTexCoord2f(1.0f, 0.0f); glVertex3f(8,-8,0); glTexCoord2f(1.0f, 1.0f); glVertex3f(8,8,0); glTexCoord2f(0.0f, 1.0f); glVertex3f(-8,8,0); glTexCoord2f(0.0f, 0.0f); glVertex3f(-8,-8,0); glEnd(); glPopMatrix(); //出栈
glPushMatrix(); //入栈 实用标准 文档 glTranslatef (-eye[0], -eye[1], -eye[2]); glRotatef(rot[0], 1.0f, 0.0f, 0.0f); glRotatef(rot[1], 0.0f, 1.0f, 0.0f); glRotatef(rot[2], 0.0f, 0.0f, 1.0f); //---------------太阳-------------- if(iMode==1) { GLUquadricObj * quadric1; //建立一个曲面对象指针 quadric1 = gluNewQuadric(); //建立一个曲面对象指针 gluQuadricTexture(quadric1,GLU_TRUE); //建立纹理坐标 gluQuadricDrawStyle(quadric1,GLU_FILL); //用面填充绘制场景 glBindTexture(GL_TEXTURE_2D, g_TexturesArray[1]);//绑定纹理 gluSphere(quadric1,0.3f,64,64);//画一个填充太阳 } else if(iMode==2) { glDisable(GL_TEXTURE_2D);//取消纹理 glColor3f(1.0,1.0,1.0); glutWireSphere(0.3f,32,32);//画一个线条太阳 glEnable(GL_TEXTURE_2D);//启用纹理 } //-----------土星公转轨道 ------------ 实用标准 文档 glDisable(GL_TEXTURE_2D);//取消纹理 glColor3f(1.0,1.0,1.0); glBegin(GL_LINE_LOOP); for(int j=0; jglVertex3f(R*cos(2*Pi/n*j),0,R*sin(2*Pi/n*j)); glEnd(); glEnable(GL_TEXTURE_2D);//启用纹理 //-----------地球公转轨道--------------- glDisable(GL_TEXTURE_2D);//取消纹理 glColor3f(1.0,1.0,1.0); glBegin(GL_LINE_LOOP); for(j=0; jglVertex3f(0.7*cos(2*Pi/n*j),0,0.7*sin(2*Pi/n*j)); glEnd(); glEnable(GL_TEXTURE_2D);//启用纹理 //------------------土星--------------------------- glPushMatrix();//入栈 glRotatef(z, 0.0f, 1.0f, 0.0f); glTranslatef (1.2, 0, 0); glPushMatrix(); //入栈 glRotatef(c, 0.0f, 1.0f, 0.0f); glRotatef(90, 1.0f, 0.0f, 0.0f);