opengl笔记
opengl学习(三)----绘制简单图形(一)

opengl学习(三)----绘制简单图形(⼀)今天说⼀说⼏种简单的图元。
所有的⼏何图元都是根据它们的顶点来描绘的。
⽽顶点就是它们在屏幕上的坐标位置。
我喜欢把这⼏个简单的图元称为点线⾯。
点,可以看到⼀个顶点;线,就是两个顶点指定的⼀条有限长度的线段;⾯,其实更准确讲是⼀个凸多边形。
opengl⾥所讲的多边形是内部⽤颜⾊填充的,视觉上称为⾯我个⼈认为是更贴近的。
当然,多边形也是由指定的顶点组成的。
需要注意的是,要想被opengl按照设计被绘制必须正确的认识到,所谓的多边形是顶点都处于⼀个平⾯上,凸多边形。
凸多边形不能理解的,请问度娘。
来看⼀个例⼦:C++代码1. glBegin(GL_POLYGON);2. glVertex2f(0.0, 0.0);3. glVertex2f(0.0, 3.0);4. glVertex2f(4.0, 3.0);5. glVertex2f(6.0, 1.5);6. glVertex2f(4.0, 0.0);7. glEnd();先不去关⼼代码本⾝,这段代码最终的结果是要指定5个顶点绘制⼀个凸五边形。
注意,不是5条线段⽽是⼀个凸五边形的平⾯。
不管是点线⾯的哪⼀种,都是需要指定⼀组顶点的。
如何判定顶点指定的开始和结束就是glBegin和glEnd的⼯作。
引⽤void glBegin(Glenum mode);标志着⼀个顶点数据列表的开始,它描述了⼀个⼏何图元。
mode参数指定了图元的类型。
void glEnd(void);标志着⼀个顶点数据列表的结束。
mode设置的不同,代表着将要绘制的图元也不同。
下⾯这个表就是图元的名称和含义:值含义GL_POINTS 单个的点GL_LINES ⼀对顶点被解释为⼀条直线GL_LINE_STRIP ⼀系列的连接直线GL_LINE_LOOP 和上⾯相同,但第⼀个顶点和最后⼀个顶点彼此相连GL_TRIANGLES 3个顶点被解释为⼀个三⾓形GL_TRIANGLES_STRIP 三⾓形的连接串GL_TRIANGLES_FAN 连接成扇形的三⾓形系列GL_QUADS 4个顶点被解释为⼀个四边形GL_QUADS_STRIP 四边形的连接串GL_POLYGON 简单的凸多边形的边界试想着,如果将glBegin(GL_POLYGON)修改为glBegin(GL_POINTS),绘制出来的将是什么图形呢? 哈哈,那就是5个点⽽已么。
OpenGL入门学习

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
2、强大的可移植性。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。
下面我将对Windows下的OpenGL编程进行简单介绍。
第一步:选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择VC++ 6.0作为学习OpenGL的环境。
第二步:安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
3、glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。
opengl常用函数

opengl常用函数第一章使用颜色l. l glshadeModel--选择平面明暗模式或光滑明暗模式1. 2 glColor--设置当前颜色1. 3 glColorPointer--定义颜色数组1. 4 gllndex--设置当前颜色索引1. 5 gllndexPointer--定义颜色索引数组1. 6 glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小1. 7 glColorsubTableEXT--指定需要替代的目标纹理调色板的一部分第二章绘制几何图原及物体2. l glVertex--指定顶点2. 2 glVertexPointer--定义顶点数据数组2. 3 glArrayElement--指定用来绘制顶点的数组元素2. 4 glBegin, glEnd--限定一个或多个图原顶点的绘制2. 5 glEdgeFlag, glEdgeFlagy--指定边界标记2. 6 glPointsize--指定光栅化点的直径2. 7 glLinewidth--指定光栅化直线的宽度2. 8 glLinestipple--指定点划线2. 9 glPolygonMode--选择多边形光栅化模式2. 10 glFrontFace--定义正面多边形和反反面多边形2. 11 glPolygonstipple--设置多边形点划图2. 12 glDrawElements--从数组数据绘制图原2. 13 glRect--绘制矩形第三章坐标转换3. l glTranslate--用平移矩阵乘以当前矩阵3. 2 glRotate--用旋转矩阵乘以当前矩阵3. 3 glscale--用缩放矩阵乘以当前矩阵3. 4 glViewport--设置机口3. 5 glFrustum--用透视矩阵乘以当前矩阵3. 6 glorthO--用正视矩阵乘以当前矩阵3. 7 glClipPlane--指定切割几何物体的平面第四章堆栈操作4. l glLoadMatrix--用任意矩阵替换当前矩阵4. 2 glMultMatrix--用任意矩阵乘以当前矩阵 4. 3 glMatrixMode--指定哪一个矩阵是当前矩阵4. 4 glPushMatrix, glPopMatrix--压人和弹出当前矩阵堆栈4. 5 glPushAttrib, glPopAttrib--压人和弹出属性堆栈4. 6 glPushClientAttrib, glPopClientAttrib--在客户属性堆栈中保存和恢复客户状态变量组4. 7 glPushName, gPopName--压人和弹出名称堆栈4. 8 gllnitNames--初始名称堆栈4, 9 glLoadName--向名称堆栈中装载名称第五章显示列表5. l glNewList, glEndList--创建或替换一个显示列表5. 2 glCallLISt--执行一个显示列表5. 3 glCallLISts--执行一列显示列表5. 4 glGenLists--生成一组空的相邻的显示列表5. 5 glDeleteLists--删除一组相邻的显示列表5. 6 gllSLISt--检验显示列表的存在第六章使用光照和材质6. l glNormal--设置当前的法向量6. 2 glNormalPointer--定义法向量数组6. 3 glLight--设置光源参数6. 4 glLightModel--设置光照模型参数6. 5 glMaterial--为光照模型指定材质参数6. 6 glColorMateria--使材质颜色跟踪当前颜色第七章像素操作7. l glRasterPos--为像素操作指定光栅位置7. 2 glBitmap--绘制位图7. 3 glReadPixels--从帧缓存中读取一块像素7. 4 glDrawPixels--将一个像素块写人帧缓存7. 5 glCopyPixels--在帧缓存中拷贝像素7. 6 glCopyTexlmage1D--将像素从帧缓存拷贝到一维纹理图像中7. 7 glCopyTexlmageZD--把像素从帧缓存拷贝到二维纹理图像中7. 8 glCopyTexsublmagelD--从帧缓存中拷贝一维纹理图像的子图像7. 9 glCopyTexsublmageZD--从帧缓存中拷贝二维纹理图像的子图像7. 10 glPixelZoom--指定像素缩放因子7. 11 glPixelstore--设置像素存储模式7. 12 glPixelTransfer--设置像素传输模式7. 13 glPixelMap--设置像素传输映射表第八章纹理映射8. l glTexlmagelD--指定一维纹理图像8. 2 glTexlmageZD--指定二维纹理映射8. 3 glTexParameter--设置纹理参数8. 4 glTexsublmage1D--指定已存在的一维纹理图像的一部分8. 5 glTexsublmageZD--指定已存在的二维纹理图像的一部分8. 6 glTexEnv--设置纹理环境参数8. 7 glTexCoord--设置当前纹理坐标8. 8 glTexGen--控制纹理坐标的生成8. 9 glTexCoordPointer--定义纹理坐标数组8. 10 glDeleteTextures--删除命名的纹理第九章特殊效果操作9. l glBlendFunc--指定像素的数学算法9. 2 glHint--指定由实现确定的控制行为9. 3 glFOg--指定雾化参数第十章帧缓存操作10. l glClear--将缓存清除为预先的设置值10. 2 glClearAccum--设置累加缓存的清除值10. 3 glClearColor--设置颜色缓存的清除值10. 4 glClearDepth--设置深度缓存的清除值10. 5 glClearlndex--设置颜色索引缓存的清除值10. 6 glClearstencil--设置模板缓存的清除值10. 7 glDrawBuffer--指定绘制的颜色缓存10. 8 gllndexMask--控制颜色索引缓存中单个位的写操作10. 9 glColorMask--激活或关闭帧缓存颜色分量的写操作10. 10 glDepthMask--激活或关闭对深度缓存的写操作10. 11 glstencilMask--控制模板平面中单个位的写操作10. 12 glAlphaFunc-一指定alpha检验函数10. 13 glstencilFunc--设置模板检验函数和参考值10. 14 glstencilop--设置模板检验操作10. 15 glDepthFunc--指定深度比较中使用的数值10. 16 glDepthRange--指定从单位化的设备坐标到窗口坐标的z 值映射10. 17 glLOgiCOp--为颜色索引绘制指定逻辑像素操作10. 18 glACCum--对累加缓存进行操作第十一章绘制曲线和曲面11. l glEvalCoord--求取激活的一维和二维纹理图11. 2 glMapl--定义一维求值器11. 3 glMapZ--定义二维求值器11. 4 glMapGrid--定义一维或二维网格11. 5 glEvalMesh--计算一维或二维点网格或线网格11. 6 glEvalPoint--生成并求取网格中的单个点第十二章查询函数12. l glGet--返回所选择的参数值12. 2 glGetClipPlane--返回指定的切平面系数12. 3 glGetColorTableEXT--获得当前目标纹理调色板的颜色表数据12. 4 glGetColorTableParameterfvEXT, glGetColorTableParameterlvEXT-从颜色表中获得调色板参数12. 5 glGetError--返回错误信息12. 6 glGetLight--返回光源参数值12. 7 glGetMap--返回求值器参数12. 8 glGetMaterial--返回材质参数12. 9 glGetPixelMap--返回指定的像素映像12. 10 glGetPointery--返回顶点数据数组地J12. 11 glGetPolygonstipple--返回多边形点戈12. 12 glGetstring--返回描述当前OpenGL12. 13 glGetTexEnv--返回纹理环境参数12. 14 glGetTexGen--返回纹理坐标生成参数12. 15 glGetTexlmage--返回纹理图像12. 16 glGetTexLevelParameter--返回指定细节水平的纹理参数值12. 17 glGetTexParameter--返回纹理参数值。
OpenGL学习笔记:三维数学基础(一)坐标系、向量、矩阵

OpenGL学习笔记:三维数学基础(⼀)坐标系、向量、矩阵接触OpenGL和计算机图形学有⼀段时间了,⼀直想写⼀点东西,记录⾃⼰的学习历程,或许也能够为有意愿向计算机图形学发展的菜鸟们提供⼀条捷径。
闲话不多说,本章主要介绍计算机图形学中三维数学的⼀些基础知识,主要包括2D、3D笛卡尔坐标系,向量、矩阵的数学和⼏何意义以及公式。
由于篇幅限制,其中的推导过程本⽂不作叙述,感兴趣的读者可以去看《3D数学基础+图形与游戏开发》,已上传,链接地址在本⽂末尾。
⼀、计算机图形学计算机图形学(Computer Graphics)是⼀种使⽤数学算法将⼆维或三维图形转化为计算机显⽰器的栅格形式的科学。
其⼴泛应⽤于游戏、动画、仿真、虚拟现实(VR)、增强现实(AR)等领域。
在数学之中,研究⾃然数和整数的领域称为离散数学,研究实数的领域称作连续数学。
在计算机图形学中,为虚拟世界选择度量单位的关键是选择离散的精度。
⼀种错误的观点认为short、int是离散的,⽽float、double是连续的,⽽事实上,这些数据类型都是离散的。
于是,计算机图形学有如下准则:计算机图形学第⼀准则:近似原则——如果它看上去是对的,它就是对的。
⼆、笛卡尔坐标系2D笛卡尔坐标系是⼀个精确定位点的框架。
2D坐标的标准表⽰法是(x,y),相信⼤家初中都学过。
⼀般,标准的笛卡尔坐标系是x轴向右,y轴向上。
⽽计算机图形学中的屏幕坐标往往是x轴向右,y轴向下。
如图1所⽰。
图1:2D笛卡尔坐标系和2D屏幕坐标系3D笛卡尔坐标系类似,增加了第三个维度,z轴。
3D坐标系分为完全不同的2种坐标系,左⼿坐标系和右⼿坐标系。
判断⽅法为,左⼿坐标系:伸出左⼿,让拇指和⾷指成“L”形,⼤拇指向右,⾷指向上,其余⼿指指向前⽅。
此时,拇指、⾷指和其余三指分别代表x、y、z轴的正⽅向。
右⼿坐标系,相同,只是把左⼿换成右⼿。
如图2所⽰。
图2:左⼿坐标系与右⼿坐标系其中左⼿坐标系⼴泛应⽤于计算机图形学、D3D之中,⽽右⼿坐标系⼴泛应⽤于OpenGL、线性代数、3DSMax之中。
十三讲OpenGL技术简介ppt课件

首先,用时需要在project-settings-linkobject/library中加入 opengl32.lib glu32.lib glaux.lib 三个库。
• 如果是MFC程序
在视图类或OpenGL显示类中加入头文件 gl/glaux.h, gl/gl.h 及gl/glu.h三个头文件。
• 库类型
gl代表基本库,glu代表实用库,aux代表辅助库, wgl代表Windows专用库 。
• 函数参数信息
指明该函数有多少个参数,参数都是什么类型,如i 表示int,s表示short,f表示float,d表示double,v 表示参数为向量(即数组)。
OpenGL的工作流程
• 作为一个图形应用程序开发标准,OpenGL 具有软硬件平台无关性,它采用了 Client/Server的工作方式,其工作流程如下:
说明:将一个旋转矩阵与当前矩阵相乘,该矩阵将 物体绕原点到点(x,y,z)直线逆时针旋转angle 度
• glScale*(TYPE x, TYPE y, TYPE z)
说明:将物体缩放或沿坐标轴反射物体,物体上的 每个点坐标都分别乘以参数x、y、z。
• glMultMatrix*(const TYPE *m)
• OpenGL是什么?
Open Graphics Library,SGI公司推出的开放式图形 程序库(API),现已成为广泛接受的图形应用程序 开发标准。
• OpenGL跟其他图形库相同吗?
具有其他流行图形系统的大部分特点。
• 通过OpenGL编程能获得什么?
能更深入地理解图形学中所学的知识,若要掌握
• 2.剪裁
场景被渲染到矩形窗口中,所以要剪掉位于窗口之 外的物体。பைடு நூலகம்
LearnOpenGL概念(一)

LearnOpenGL概念(⼀)OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是⽤于渲染2D、3D⽮量图形的跨语⾔、跨平台的应⽤程序编程接⼝(API)。
这个接⼝由近350个不同的函数调⽤组成,⽤来绘制从简单的图形⽐特到复杂的三维景象。
⽽另⼀种程序接⼝系统是仅⽤于Microsoft Windows上的Direct3D。
OpenGL常⽤于CAD、虚拟现实、科学可视化程序和电⼦游戏开发。
OpenGL被设计为只有输出的,所以它只提供渲染功能。
核⼼API没有窗⼝系统、⾳频、打印、键盘/⿏标或其他输⼊设备的概念。
虽然这⼀开始看起来像是⼀种限制,但它允许进⾏渲染的代码完全独⽴于他运⾏的操作系统,允许跨平台开发。
OpenGL没有提供着⾊器编译器,⽽是由显卡驱动来完成着⾊器的编译⼯作,也就是说,只要显卡驱动⽀持对GLSL的编译它就能运⾏,所以能够跨平台。
⽽DirectX是由微软控制着⾊器的编译,就算⽤了不同的硬件,同⼀个着⾊器的编译也是⼀样,所以⽀持的平台只有微软⾃⼰的产品。
OpenGL:⼀般它被认为是⼀个API(Application Programming Interface, 应⽤程序编程接⼝),包含了⼀系列可以操作图形、图像的函数。
实际仅仅是由Khronos组织制定并维护的规范(Specification)。
OpenGL规范严格规定了每个函数该如何执⾏,以及它们的输出值。
⾄于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者⾃⾏决定。
实际的OpenGL库的开发者通常是显卡的⽣产商。
核⼼模式与⽴即渲染模式:早期OpenGL使⽤⽴即渲染(Immediate mode,也就是固定渲染管线)容易使⽤和理解,但是效率太低。
从OpenGL3.2开始废弃⽴即渲染模式,⿎励使⽤核⼼模式(Core-profile)。
核⼼模式:要求使⽤者真正理解OpenGL和图形编程,有⼀些难度,然⽽提供了更多的灵活性,更⾼的效率,可以更深⼊理解图形编程。
opengl算法学习---纹理映射

opengl算法学习---纹理映射纹理映射纹理映射(Texture Mapping),⼜称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
简单来说,就是把⼀幅图像贴到三维物体的表⾯上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多⾮常漂亮的效果。
纹理纹理可看成是⼀个或多个变量的函数,因此根据纹理定义域的不同,纹理可分为⼀维纹理、⼆维纹理、三维纹理和⾼维纹理。
基于纹理的表现形式,纹理⼜可分为颜⾊纹理、⼏何纹理两⼤类。
颜⾊纹理指的是呈现在物体表⾯上的各种花纹、图案和⽂字等,即通过颜⾊⾊彩或明暗度的变化体现出来的细节。
如⼤理⽯墙⾯、墙上贴的字画器⽫上的图案等。
⼏何纹理(也可称为凹凸纹理)是指基于景物表⾯微观⼏何形状的表⾯纹理,如桔⼦、树⼲、岩⽯、⼭脉等表⾯呈现的凸凹不平的纹理细节。
⽣成颜⾊纹理的⼀般⽅法是在⼀个平⾯区域(即纹理空间)上预先定义纹理图案,然后建⽴物体表⾯的点与纹理空间的点之间的对应—即映射。
以纹理空间的对应点的值乘以亮度值,就可把纹理图案附到物体表⾯上⽤类似的⽅法给物体表⾯产⽣凹凸不平的外观或称凹凸纹理。
普通纹理映射常见的2D纹理映射实际上是从纹理平⾯到三维物体表⾯的⼀个映射。
凹凸纹理映射前述各种纹理映射技术只能在光滑表⾯上描述各种事先定义的花纹图案,但不能表现由于表⾯的微观⼏何形状凹凸不平⽽呈现出来的粗糙质感,如布纹,植物和⽔果的表⽪等1978年Blinn提出了⼀种⽆需修改表⾯⼏何模型,即能模拟表⾯凹凸不平效果的有效⽅法⼀⼏何(凹凸)纹理映射(bump mapping)技术⼀个好的扰动⽅法应使得扰动后的法向量与表⾯的⼏何变换⽆关,不论表⾯如何运动或观察者从哪⼀⽅向观察表⾯,扰动后的表⾯法向量保持不变。
Blinn表⾯法⽮扰动法在表⾯任⼀点处沿其法向附加⼀微⼩增量,从⽽⽣成⼀张新的表⾯,计算新⽣成表⾯的法⽮量以取代原表⾯上相应点的法⽮量。
透明效果与混合光学原理:透射,折射,反射颜⾊调和法设a为透明体的不透明度,0≤a≤1,则I=αI a+(1−α)I ba=1,完全不透明a=0,完全透明alpha融合技术BlendingRGBA(a)不透明度a表⽰穿透该表⾯光线的数量a=1,完全不透明;a=0,完全透明gl.blendFunc(src_ factor,dst factor)混合后颜⾊=源颜⾊src_factor+⽬标颜⾊dst_factor源颜⾊:当前对象⽬标颜⾊:帧缓存像素透明与Z-Buffer消隐当对象A是透明的,即B透过A是部分可见时先画B再画A,可以处理先画A再画B,深度缓冲会从B取⼀个像素,同时注意到⼰经绘制了⼀个更近的像素(A),然后它的选择是不绘制BZ-Buffer消隐不能很好处理透明的物体,需要修正才⾏开启深度测试gl.enable(gl.DEPTH_TEST);绘制所有不透明物体(a=1.0)锁定深度缓冲区gl.depthMask(false);按从后向前次序绘制所有半透明物体释放深度缓冲区gl.depthMask(true);光线跟踪光线跟踪算法[WH1T80]是⽣成⾼度真实感图形的主要算法之⼀。
opengl学习心得体会

opengl学习心得体会篇一:opengl学习总结OpenGL学习总结一.OpenGL是做什么的一种图形硬件的接口。
而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。
二.OpenGL的主要功能是什么建模,变换,颜色模式设置,光照和材质设置,纹理映射,位图显示和图像。
三.OpenGL的体系结构是什么最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,第五层为应用软件。
四.怎么样利用OpenGL来实现我们想要做的事情首先要明白一点,OpenGL是一个与平台无关的三维图形接口,操作系统必须提供像素格式管理和渲染环境管理。
因此要使用OpenGL来做我们想做的事情的时候,一定要先为OpenGL搭建一个窗口环境。
在这个窗口环境中,我们才能够使用OpenGL来实现我们自己的目的。
另外要注意的是OpenGL应用的不是保留模式,而是直接模式。
即我们去操作的并非是已经封装好的一些建好的图形信息,而仅是相当于操作一个图形界面。
也就是说如果我们要画一个复杂的形体,我们要把这个形体的几何信息,包括点、线和面的一些信息包括进去,然后使用一定的方法,把这些基本的信息合起来,构成我们要创建的那个物体。
五.绘制图元能干什么此处我们当明白,OpenGL能够绘制复杂和有趣的图形,但这些图形都是由几个为数不多的基本图形元素构建而成的。
所以,能够绘制图元是我们构建一个复杂有趣图形的一个基础。
这些基本的图元,包括点、线和面。
glBegin();glEnd();六.变换能干什么当我们绘制出一个复杂或者简单图形的时候,我们要把这个图形显示到我们的电脑屏幕上。
这个时候我们可能会需要用到变换,变换的目的是让我们能够从一个合适的角度,观察到我们对图形中所关注的那部分。
变换包括,视图变换,模型变换,投影变换。
经过这几个变换中的一个变换、几个变换或者几种变换的相互组合,我们可以得到我们想要达到的效果。
七.光照能干什么我们绘制图形的时候要深切地知道一个事情。
OPenGL知识点

1.创建一个OpenG L窗口:在这个教程里,我将教你在Wi ndows环境中创建OpenG L程序.它将显示一个空的Ope nGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.理解OpenG L如何工作非常重要,你可以在教程的末尾下载源程序,但我强烈建议你至少读一遍教程,然后再开始编程. 2.你的第一个多边形:在第一个教程的基础上,我们添加了一个三角形和一个四边形。
也许你认为这很简单,但你已经迈出了一大步,要知道任何在O penGL中绘制的模型都会被分解为这两种简单的图形。
读完了这一课,你会学到如何在空间放置模型,并且会知道深度缓存的概念。
3.添加颜色: 作为第二课的扩展,我将叫你如何使用颜色。
你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色。
注意三角形上的颜色是如何混合的。
颜色为OpenG lL 工程增加很多。
通过理解平面着色(f lat c olori ng)和平滑着色(s mooth colo ring),你能显著的改善你的OpenG L Dem o的样子。
4.旋转: 在这一课里,我将教会你如何旋转三角形和四边形。
左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。
这一章将引入两个变量, r tri 被用来存储三角形的角度, rqu ad存储四边形的角度。
和容易创建一个多边形组成的场景。
让这些物体动起来是整个场景变得生动起来。
在后面的课程钟我将教给你如何绕屏幕上的一个点旋转物体,使得物体绕屏幕而不是它的轴转动。
5.3D形体:既然我们已经领会到多边形,方形,色彩和旋转。
现在该建立3D物体了。
计算机图形学OpenGL(第三版)第二章

const int screenWidth = 640; // width of screen window in pixels const int screenHeight = 480; // height of screen window in pixels GLdouble A, B, C, D; // values used for scaling and shifting void myInit(void) {glClearColor(1.0,1.0,1.0,0.0); // background color is white glColor3f(0.0f, 0.0f, 0.0f); // drawing color is black glPointSize(2.0); // a 'dot' is 2 by 2 pixels glMatrixMode(GL_PROJECTION); // set "camera shape" glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)screenWidth, 0.0, (GLdouble)screenHeight); A = screenWidth / 4.0; // x方向的缩放量A B = 0.0; //x方向的平移量B C = D = screenHeight / 2.0;// y方向的缩放量C和平移量D } void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT); // clear the screen glBegin(GL_POINTS); for(GLdouble x = 0; x < 4.0 ; x += 0.005) { Gldouble func = exp(-x) * cos(2 * 3.14159265 * x); //sx= A * x + B, sy =C * y + D glVertex2d(A * x + B, C * func + D); } glEnd(); glFlush(); // send all output to display }
笔记opcl

笔记opclOpencl基于的异构平台=CPU,GPU或其他类型的处理器Opencl =kernels语⾔ +API含有任务分割和数据分割的并⾏计算机制OpenGL⽤于三维图形OpenAL计算机⾳频CUDA架构:ISA指令集架构;硬件计算引擎。
OpenCL API编程,可以选择C for CUDA语⾔来编程。
OpenCL API编程好处就是可以访问⽐较低层次的硬件资源但内存管理上靠编程⼈员⼿动控制,需要编程⼈员要拥有⾼超的编程技术和深厚的经验积累编程语⾔——驱动程序——PTX代码(CUDA的指令集)——硬件执⾏(opencl-1.0.48.pdf)The OpenCL Architecture1. Platform Model2.Memory Model3.Execution Model4.Programming Model Platform ModelExecution Model⼀.Context and Command QueuesA. Devices: The collection of OpenCL devices to be used by the host.B. Kernels: The OpenCL functions that run on OpenCL devices.C. Program Objects: The program source and executable that implement the kernels.D. Memory Objects: A set of memory objects visible to the host and the OpenCL devices. Memory objects contain values that can be operated on by instances of a kernel. Kernel execution commandsMemory commandsSynchronization commands⼆.Categories of KernelsOpenCL kernelsNative kernelsMemory Model⼀.Memory ConsistencyWithin a work-item memory has load / store consistency. Local memory is consistent across work-items in a single work-group at a work-group barrier. Global memory is consistent across work-items in a single work-group at a work-group barrier, but there are no guarantees of memory consistency between different work-groups executing a kernel.Programming Model⼀. Data Parallel Programming ModelIn a strictly data parallel model, there is a one-to-one mapping between the work-item and the element in a memory object over which a kernel can be executed in parallelOpenCL provides a hierarchical data parallel programming model⼆.Task Parallel Programming Model三SynchronizationThere are two domains of synchronization in OpenCL:- Work-items in a single work-groupSynchronization between work-items in a single work-group is done using a work-group barrier. There is no mechanism for synchronization between work-groups.- Commands enqueued to command-queue(s) in a single context- Command-queue barrier- Waiting on an eventThe OpenCL FrameworkOpenCL Platform layerOpenCL RuntimeOpenCL CompilerThe OpenCL Platform LayerQuerying Platform Info1. The list of platforms available can be obtained using the following function:cl_int clGetPlatformIDs (cl_uint num_entries,cl_platform_id *platforms,cl_uint *num_platforms)2.specific information about the OpenCL platform be obtained using the following function:cl_int clGetPlatformInfo (cl_platform_id platform,cl_platform_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)platform refers to the platform ID returned by clGetPlatformIDs or can be NULL.Querying DevicesThe list of devices available on a platform can be obtained using the following function.cl_int clGetDeviceIDs(cl_platform_id platform,cl_device_type device_type,cl_uint num_entries,cl_device_id *devices,cl_uint *num_devices)cl_int clGetDeviceInfo (cl_device_id device,cl_device_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret) (pg30:相关Device函数)Contextscl_context clCreateContext (const cl_context_properties *properties,cl_uint num_devices,const cl_device_id *devices,void(*pfn_notify)(const char *errinfo,const void *private_info, size_t cb,void *user_data),void *user_data,cl_int *errcode_ret)cl_context clCreateContextFromType (const cl_context_properties *properties,cl_device_type device_type,void(*pfn_notify)(const char *errinfo,constvoid*private_info,size_tcb,void *user_data),void *user_data,cl_int *errcode_ret)The function creates an OpenCL context from a device type that identifies the specific device(s) to use.cl_int clRetainContext (cl_context context)The function increments the context reference count.cl_int clReleaseContext (cl_context context)The function decrements the context reference count. clReleaseContext returnscl_int clGetContextInfo (cl_context context,cl_context_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function can be used to query information about a context.The OpenCL RuntimeCommand Queuescl_command_queue clCreateCommandQueue (cl_context context,cl_device_id device,cl_command_queue_properties properties,cl_int *errcode_ret)The function creates a command-queue on a specific device.cl_int clRetainCommandQueue (cl_command_queue command_queue) The function increments the command_queue reference count.cl_int clReleaseCommandQueue (cl_command_queue command_queue) The function decrements the command_queue referencecount.cl_int clGetCommandQueueInfo (cl_command_queue command_queue,cl_command_queue_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function can be used to query information about a command-queue.cl_int clSetCommandQueueProperty (cl_command_queue command_queue,cl_command_queue_properties properties,cl_bool enable,cl_command_queue_properties *old_properties) The function can be used to enable or disable the properties of a command-queue.(pg50)Memory Objectstwo types: buffer objects, and image objects.Creating Buffer Objectscl_mem clCreateBuffer (cl_context context,cl_mem_flags flags,size_t size,void *host_ptr,cl_int *errcode_ret)A buffer object is created using the following functionReading, Writing and Copying Buffer ObjectsThe following functions enqueue commands to read from a buffer object to host memory or write to a buffer object from host memory. cl_int clEnqueueReadBuffer (cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_read,size_t offset,size_t cb,void *ptr,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)cl_int clEnqueueWriteBuffer (cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_write,size_t offset,size_t cb,const void *ptr,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)cl_int clEnqueueCopyBuffer (cl_command_queue command_queue,cl_mem src_buffer,cl_mem dst_buffer,size_t src_offset,size_t dst_offset,size_t cb,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to copy a buffer object identified by src_buffer to another buffer object identified by dst_buffer Retaining and Releasing Memory Objectscl_int clRetainMemObject (cl_mem memobj)The function increments the memobj reference count.clCreateBuffer and clCreateImage{2D|3D} perform an implicit retain.cl_int clReleaseMemObject (cl_mem memobj)The function decrements the memobj reference count.Creating Image ObjectsAn image (1D, or 2D) object is created using the following functioncl_mem clCreateImage2D (cl_context context,cl_mem_flags flags,const cl_image_format *image_format,size_t image_width,size_t image_height,size_t image_row_pitch,void *host_ptr,cl_int *errcode_ret)A 3D image object is created using the following functioncl_mem clCreateImage3D (cl_context context,cl_mem_flags flags,const cl_image_format *image_format,size_t image_width,size_t image_height,size_t image_depth,size_t image_row_pitch,size_t image_slice_pitch,void *host_ptr,cl_int *errcode_ret)Image Format DescriptorThe image format descriptor structure is defined astypedef struct _cl_image_format {cl_channel_order image_channel_order;cl_channel_type image_channel_data_type;} cl_image_format;Querying List of Supported Image Formatscl_int clGetSupportedImageFormats (cl_context context,cl_mem_flags flags,cl_mem_object_type image_type,cl_uint num_entries,cl_image_format *image_formats,cl_uint *num_image_formats)The function can be used to get the list of image formats supported by an OpenCL implementation when the following information about an image memory object is specified:ContextImage type –2D or 3D imageImage object allocation informatioReading, Writing and Copying Image ObjectsThe following functions enqueue commands to read from a 2D or 3D image object to host memory or write to a 2D or 3D image object from host memory.cl_int clEnqueueReadImage (cl_command_queue command_queue,cl_mem image,cl_bool blocking_read,const size_t origin[3],const size_t region[3],size_t row_pitch,size_t slice_pitch,void *ptr,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)cl_int clEnqueueWriteImage (cl_command_queue command_queue,cl_mem image,cl_bool blocking_write,const size_t origin[3],size_t input_row_pitch,size_t input_slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)cl_int clEnqueueCopyImage (cl_command_queue command_queue,cl_mem src_image,cl_mem dst_image,const size_t src_origin[3],const size_t dst_origin[3],const size_t region[3],cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to copy image objects. src_image and dst_image can be 2D or 3D image objects allowing us to perform the following actions:Copy a 2D image object to a 2D image object.Copy a 2D image object to a 2D slice of a 3D image object.Copy a 2D slice of a 3D image object to a 2D image object.Copy a 3D image object to a 3D image object.Copying between Image and Buffer Objectscl_int clEnqueueCopyImageToBuffer (cl_command_queue command_queue,cl_mem src_image,cl_mem dst_buffer,const size_t src_origin[3],const size_t region[3],size_t dst_offset,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to copy an image object to a buffer object.cl_int clEnqueueCopyBufferToImage (cl_command_queue command_qucl_mem src_buffer,cl_mem dst_image,size_t src_offset,const size_t dst_origin[3],cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to copy a buffer object to an image object.Mapping and Unmapping Memory Objectsvoid * clEnqueueMapBuffer (cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_map,cl_map_flags map_flags,size_t offset,size_t cb,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event,cl_int *errcode_ret)The function enqueues a command to map a region of the buffer object given by buffer into the host address space and returns a pointer to this mapped region.void * clEnqueueMapImage (cl_command_queue command_queue,cl_mem image,cl_bool blocking_map,cl_map_flags map_flags,const size_t origin[3],const size_t region[3],size_t *image_row_pitch,size_t *image_slice_pitch,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event,cl_int *errcode_ret)The function enqueues a command to map a region in the image object given by image into the host address space and returns a pointer to this mapped region.cl_int clEnqueueUnmapMemObject (cl_command_queue command_queue,cl_mem memobj,void *mapped_ptr,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to unmap a previously mapped region of a memory object.Memory Object QueriesTo get information that is common to all memory objects (buffer and image objects), use the following functioncl_int clGetMemObjectInfo (cl_mem memobj,cl_mem_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)To get information specific to an image object created with clCreateImage{2D|3D}, use the following functioncl_int clGetImageInfo (cl_mem image,cl_image_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)Sampler Objectscl_sampler clCreateSampler (cl_context context,cl_bool normalized_coords,cl_addressing_mode addressing_mode,cl_filter_mode filter_mode,cl_int *errcode_ret)The function creates a sampler object.cl_int clRetainSampler (cl_sampler sampler)The function increments the sampler reference count.cl_int clReleaseSampler (cl_sampler sampler)The function decrements the sampler reference count.cl_int clGetSamplerInfo (cl_sampler sampler,cl_sampler_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns information about the sampler object.Program Objectscl_program clCreateProgramWithSource (cl_context context,cl_uint count,const char **strings,const size_t *lengths,cl_int *errcode_ret)The function creates a program object for a context, and loads the source code specified by the text strings in the strings array into theprogram object. The devices associated with the program object are the devices associated with context.cl_program clCreateProgramWithBinary (cl_context context,cl_uint num_devices,constcl_device_id*device_list,const size_t *lengths,const unsigned char **binaries,cl_int *binary_status,cl_int *errcode_ret)The function creates a program object for a context, and loads the binary bits specified by binary into the program object.cl_int clRetainProgram (cl_program program)The function increments the program reference count.cl_int clReleaseProgram (cl_program program)The function decrements the program reference count. The program object isBuilding Program Executablescl_int clBuildProgram (cl_program program,cl_uint num_devices,const cl_device_id *device_list,const char *options,void (*pfn_notify)(cl_program, void *user_data),void *user_data)The function builds (compiles & links) a program executable from the program source or binary for all the devices or a specific device(s) in the OpenCL context associated with program.Build OptionsPreprocessor optionsD name Predefine name as a macro, with definition 1.Math Intrinsics Options-cl-single-precision-constantTreat double precision floating-point constant as single precision constant.-cl-denorms-are-zeroThis option controls how single precision and double precision denormalized numbersare handled.Optimization Options-cl-opt-disableThis option disables all optimizations. The default is optimizations are enabled.-cl-strict-aliasingThis option allows the compiler to assume the strictest aliasing rules.-cl-mad-enableAllow a * b + c to be replaced by a mad. The mad computes a * b + c withreduced accuracy-cl-no-signed-zerosAllow optimizations for floating-point arithmetic that ignore the signedness of zero.-cl-unsafe-math-optimizations-cl-finite-math-onlyAllow optimizations for floating-point arithmetic that assume that arguments and resultsare not NaNs or ±∞-cl-fast-relaxed-mathThis option causes the preprocessor macro __FAST_RELAXED_MA TH__ to be defined in the OpenCL program. Options to Request or Suppress Warnings-w Inhibit all warning messages.-Werror Make all warnings into errors.Unloading the OpenCL Compilercl_int clUnloadCompiler (void)The function allows the implementation to release the resources allocated by the OpenCL compilerProgram Object Queriescl_int clGetProgramInfo (cl_program program,cl_program_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns information about the program object.cl_int clGetProgramBuildInfo (cl_program program,cl_device_id device,cl_program_build_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns build information for each device in the program object.(pag 100)Kernel ObjectsCreating Kernel ObjectsTo create a kernel object, use the functioncl_kernel clCreateKernel (cl_program program,const char *kernel_name,cl_int *errcode_ret)cl_int clCreateKernelsInProgram (cl_program program,cl_uint num_kernels,cl_kernel *kernels,cl_uint *num_kernels_ret)The function creates kernel objects for all kernel functions in program. Kernel objects are not cl_int clRetainKernel (cl_kernel kernel)The function increments the kernel reference countcl_int clReleaseKernel (cl_kernel kernel)The function decrements the kernel reference count. clReleaseKernel returnsSetting Kernel Argumentscl_int clSetKernelArg (cl_kernel kernel,cl_uint arg_index,size_t arg_size,const void *arg_value)The function is used to set the argument value for a specific argument of a kernel.Kernel Object Queriescl_int clGetKernelInfo (cl_kernel kernel,cl_kernel_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns information about the kernel object.cl_intclGetKernelWorkGroupInfo(cl_kernelkernel,cl_device_iddevice,cl_kernel_work_group_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns information about the kernel object that may be specific to a device. Executing Kernelscl_int clEnqueueNDRangeKernel (cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,const size_t *global_work_offset,const size_t *global_work_size,const size_t *local_work_size,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to execute a kernel on a device.cl_kernel kernel,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to execute a kernel on a device. The kernel is executed using a single work-item.cl_int clEnqueueNativeKernel (cl_command_queue command_queue,void (*user_func)(void *)void *args,size_t cb_args,cl_uint num_mem_objects,const cl_mem *mem_list,const void **args_mem_loc,cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)The function enqueues a command to execute a native C/C++ function not compiled using the OpenCL compiler.Event Objectscl_int clWaitForEvents (cl_uint num_events, const cl_event *event_list)The function waits on the host thread for commands identified by event objects in event_list to completecl_int clGetEventInfo (cl_event event,cl_event_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)The function returns information about the event object.cl_int clRetainEvent (cl_event event)The function increments the event reference count.To release an event, use the following function to decrements the event reference count cl_int clReleaseEvent (cl_event event) Out-of-order Execution of Kernels and Memory Object Commandscl_int clEnqueueMarker (cl_command_queue command_queue,cl_event *event)The function enqueues a marker command to command_queue. The marker command returns an event whichcl_int clEnqueueWaitForEvents (cl_command_queue command_queue,cl_uint num_events,const cl_event *event_list)The function enqueues a wait for a specific event or a list of events to complete before any future commands queued in the command-queue are executed. num_events specifies the number of events givenThe function enqueues a barrier operationProfiling Operations on Memory Objects and Kernelscl_int clGetEventProfilingInfo(cl_eventevent,cl_profiling_info param_name,size_t param_value_size,void *param_value,size_t *param_value_size_ret)If profiling is enabled, the function returns profiling information for the command associated with event.Flush and Finishcl_int clFlush (cl_command_queue command_queue)The function issues all previously queued OpenCL commands in command_queue to the device associated with command_queue. cl_int clFinish (cl_command_queue command_queue)The function blocks until all previously queued OpenCL commands in command_queue are issued to the associated device and have completed.(pag 125)The OpenCL C Programming LanguageSupported Data TypesBuilt-in Scalar Data Types。
OPENGL基础教程

OpenGL Step by Step 第一、准备好OpenGL。
第二、准备好开发环境。
1.OpenGL库和头文件2.GLUT库3.GLAUX库第三、准备好窗口。
第四、建立OpenGL应用程序框架。
第五、OpenGL原理与程序基本框架。
第六、坐标变换。
第八、法向与封闭实心物体第八、颜色与表面材质第九、颜色、颜色模型及表面材质第九、法向与面的朝向第十、光照效果第十、表面纹理细节第十一、表面纹理第十二、运动、相对运动、反向运动第十三、帧缓冲第十四、雾第十五、α融合OPENGL 基础教程 (4)1.前言 (4)1.1 OPENGL 简介及发展 (4)1.2 OPENGL与DIRECTX的关系 (6)1.3 OPENGL的准备工作 (6)2. 基本图元的绘制 (7)2.1 点、直线和多边形 (7)2.2 绘制三角形和四边形 (8)2.3 绘制三棱锥 (12)2.4 绘制圆 (13)2.5 绘制五角星............................................................................. 错误!未定义书签。
2.6 绘制正弦函数图形 (13)2.7 小结 (14)3. 基于VC的OPENGL建模程序 (15)3.1 openGL几何图元——点 (15)3.2 openGL几何图元——线 (21)3.3 绘制矩形 (25)3.4 绘制圆 (28)3.5 绘制五角星 (29)3.6 绘制正弦曲线 (30)3.7 清除屏幕颜色 (32)3.8 绘制多边形 (33)3.9 OPENGL中的颜色设置 (36)3.10 在3D空间中画直线 (42)OPENGL 基础教程1.前言1.1OPENGL 简介及发展OpenGL是OpenGraphicsLib的缩写,是一套三维图形处理库,也是该领域的工业标准。
计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。
第五章 OpenGL

VC++游戏编程——OpenGL
如果不使用OpenGL,在Windows中绘图一般要借 助GDI(图形设备接口)来完成。每个窗口都有一个设备 环境,勇于接收实际图形输出,每个GDI函数都接受一个 设备环境作为参数,它决定这个函数的操作将影响那个窗 口,可以使用多个设备环境,但一个窗口只能用一个。 OpenGL也有一种设备环境标示符,叫渲染环境 (rendering context)。 OpenGL渲染环境是OpenGL 在其中存储状态信息的数据结构,渲染图像的时候要用到 这些信息。它们包括纹理、服务器端的缓存对象、函数入 口点、混合状态以及编译过的渲染器对象。 调用wglCreateContext函数创建一个OpenGL渲染环境
显示设置: 显示设置: ChangeDisplaySettings 创建窗口 CreateGLWindow 调整窗口大小: 调整窗口大小: AdjustWindowRectEx 创建: 创建:CreateWindowEx 进入主窗口消息循环 选择像素格式: 选择像素格式: 像素格式 ChoosePixelFormat 退出 设置像素格式: 设置像素格式: 像素格式 SetPixelFormat
创建OpenGL渲染上下 渲染上下 创建 文: wglCreateContext 激活OpenGL渲染上下 渲染上下 激活 文: wglMakeCurrent 显示窗口:ShowWindow 显示窗口: 调整OpenGL视口大小: 视口大小: 调整 视口大小 ReSizeGLScene OpenGL绘制选项初始化: 绘制选项初始化: 绘制选项初始化 InitGL
vc环境下OpenGL编程:Win32应用编程
VC++游戏编程——OpenGL
VC环境下OpenGL编程:Win32应用编程 一、程序主流程
计算机图形学基础OpenGL

计算机图形学基础OpenGL1. 使用OpenGL在屏幕上画一条直线,其中端点的坐标分别是(2,3)和(6,9)。
答案:glBegin(GL_LINES);glVertex2f(2,3);glVertex2f(6,9);glEnd(;2. 如何使用OpenGL把一个三角形绘制在屏幕上,其三个顶点的坐标分别是(1,3)、(6,7)和(9,6)?答案:glBegin(GL_TRIANGLES);glVertex2f(1,3);glVertex2f(6,7);glVertex2f(9,6);glEnd(;3. 如何使用OpenGL在屏幕上绘制一个正方形,正方形的中心点坐标为(4,6),边长为5?答案:glBegin(GL_QUADS);glVertex2f(4-2.5, 6+2.5);glVertex2f(4+2.5, 6+2.5);glVertex2f(4+2.5, 6-2.5);glVertex2f(4-2.5, 6-2.5);glEnd(;4. 如何使用OpenGL在屏幕上绘制一个圆,圆心坐标为(7,3),半径为4?答案:glBegin(GL_POLYGON);int i;for(i=0;i<360;i++)glVertex2f(7+4*cos(i*PI/180.0f),3+4*sin(i*PI/180.0f));}glEnd(;5. 如何使用OpenGL在屏幕上绘制一个贝塞尔曲线,其中(1,2)、(3,4)、(5,6)、(7,7)是控制点?答案:GLfloat points[4][2] = {{1,2}, {3,4}, {5,6}, {7,7}};glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &points[0][0]);glEnable(GL_MAP1_VERTEX_3);glBegin(GL_LINE_STRIP);int i;for (i=0;i<=30;i++)glEvalCoord1f((GLfloat) i/30.0f);glEnd(;6. 如何使用OpenGL实现2D矢量图形的缩放操作,指定缩放中心点为(-2,4),缩放比例为1.3?答案:glTranslatef(-2,4,0);。
OpenCV学习笔记(15)使用OpenGL显示双目视觉三维重构效果

// Detect Memory Leaks or comment #ifdef _DEBUG CMemLeakDetect memLeakDetect; #endif enum { STEREO_BM=0, STEREO_SGBM=1 }; int alg = STEREO_BM; int stereo_rectify = 1, adaptThresh = 1; int SADWindowSize = 15, numberOfDisparities = 64, SADWS_alpha = 8, MaxDisp_beta = 4, uniqRatio = 25, thresRatio = 60; int saveFrames = 1; bool fullDP = false; double m_ObjectWidth[10] = {0.0}; // 目标宽度 double m_ObjectHeight[10] = {0.0}; // 目标高度 double m_ObjectDisparity[10] = {0.0}; // 视差 double m_ObjectDistance[10] = {0.0}; // 距离 char img1name[100], img2name[100], dispImgName[100], dispDataName[100]; //---OpenGL float imgdata[500][500][3]; // 存放三维坐标数据 float texture[500][500][3]; // 存放纹理数据 int width=0, height=0, rx = 0, ry = 0; int eyex = 115, eyez = 115, atx = 100, atz = 50; float scalar=1; //scalar of converting pixel color to float coordinates
OpenAl笔记

OpenAl学习笔记Openal的基本组成就是上图所描述的,包括一个设备device,设备里面包含至少一个context,和若干个缓冲,而context里面只包含一个listener,和若干个源。
源(source)是指向放声音的空间。
明白源是非常的重要。
源只播放内存中的背景声音数据。
源也给出了特殊的属性如位置和速度。
使用openal的第一步就是包含头文件了:#include <al/al.h>#include <al/alc.h>#include <al/alu.h>#include <al/alut.h>使用过opengl的肯定对al的头文件感觉熟悉,其实al就是模仿gl写的。
关于设备的创建:ALCdevice *alcOpenDevice(const ALCchar *devicename);1,上面是创建的函数,返回一个指向设备的指针,如果返回NULL,那肯定是出了问题。
2,传入值是一个ALCchar*,其实就是一个字符串,在alc.h头文件中有这样的代码:typedef char ALCchar;说明ALCchar就是char。
那传入什么值才可以?你可以传入一个现有的设备的名字,或者是一个NULL,NULL代表新建一个默认设备。
插曲:如何知道当前可用的设备,那就使用glcGetString函数const ALCchar * alcGetString(ALCdevice *device,ALenum param);Parametersdevice a pointer to the device to be queriedparam an attribute to be retrieved:ALC_DEFAULT_DEVICE_SPECIFIERALC_CAPTURE_DEFAULT_DEVICE_SPECIFIERALC_DEVICE_SPECIFIERALC_CAPTURE_DEVICE_SPECIFIERALC_EXTENSIONS传给该函数ALC_DEVICE_SPECIFIER就可以返回一个指针,指向的是一个字符串(设备名).3,判断是否出错,使用alGetError该函数返回当前错误状态,并清除该项纪录。
LearnOpenGL学习笔记(四)——着色器类编写

LearnOpenGL学习笔记(四)——着⾊器类编写之前我们将着⾊器的代码⽤glsl写好之后,保存为字符串指针,然后⽤⼀个函数去编译它,这是⼀种⼿段,对于简单的着⾊器代码可以这样。
但当我们针对复杂的着⾊器,我们发现编写、编译、管理着⾊器是⼀件⿇烦事。
我们⽤⼀个类将着⾊器的所有编译,链接,管理都放在⼀个⽂件⾥。
再将着⾊器源码单独设置成.glsl⽂件⽤来,从⽂件流读取,不再放到c++编译器⾥了。
这样主函数就⽐较简洁了。
我们建⽴⼀个类shader,将⼀切着⾊器的步骤都在这个类⾥封装了,这样我们在主函数实例化它,我们就直接可以使⽤着⾊器不⽤在意内部的具体情况(从⽂件流读取,编译,链接)。
因为我们是在.h⽂件⾥⾯实现的这些步骤,包括函数的具体实现我们都放到.h⽂件⾥了,所以我们还需要⼀些特殊处理#ifndef SHADER_H //先测试x是否被宏定义过#define SHADER_H //如果没有宏定义下⾯就宏定义x并编译下⾯的语句#include <glad/glad.h>; // 包含glad来获取所有的必须OpenGL头⽂件#include <string>#include <fstream> //file stream ,fstream是C++ STL中对⽂件操作的合集,包含了常⽤的所有⽂件操作。
#include <sstream> //字符串流,可以⽀持C风格的串流的输⼊输出操作。
#include <iostream>#endif //如果已经定义了则编译#endif后⾯的语句然后我们可以声明这个类的结构了:class Shader {public:// 程序IDunsigned int ID;// 构造器读取并构建着⾊器Shader(const GLchar* vertexPath, const GLchar* fragmentPath);// 使⽤/激活程序void use();// uniform⼯具函数void setBool(const std::string &name, bool value) const;void setInt(const std::string &name, int value) const;void setFloat(const std::string &name, float value) const;};看着⽐较简单,接下来我们对函数的具体实现,分析,⾸先是最重要的构造函数,这⼀个函数⾥⾯,将⼀切编译链接都做完了。
SharpGL学习笔记(四)正射投影

SharpGL学习笔记(四)正射投影上节谈到投影变换分为透视投影(perspective projection)和正射投影(orthographic projection)两种.透视投影我们已经介绍过了, 现在谈谈正视投影.正射投影,⼜叫*⾏投影.这种投影是⼀个矩形长⽅体的*⾏管道. 它最⼤的特点是, ⽆论物体距离相机多远投影后的物体⼤⼩尺⼨不变.正视投影函数有两个, ⼀个是Ortho, 原形如下:Ortho(double left, double right, double bottom, double top, double near, double far)其参数 left,right,bottom, top的意义见下图所⽰.near, far 可以认为是Z轴⽅向上的*裁剪*⾯和远裁剪*⾯.下⾯这张⽰意图是把三维体放置在视景体中, 看上去更形象些.笔者为了理解什么是正射投影以及Ortho函数的效果, 在⽹上翻遍了资料, 都是笼统的⽂字叙述, 或者是表达有误. 甚⾄找不到⼀个直观⽰意效果图.后来还是在3dsmax的摄像机属性中看到了"正交投影" 这个属性. 在3dsmax和autoCAD中, Ortho这个单词都被翻译为"正交". 因此"正交"和"正射"表达的是⼀个东西.事实证明, 有了3dsmax这样的⼯具, 可以有效的实践⼀些原理上的东西, 确实对学习OpenGL很有帮助.请看下⾯的实验, 它帮助笔者理解了什么是正射投影? 它的效果是怎么样的? 这样的疑惑.下图是在3dsmax创建的⼀个场景:注意其Camera01视图, 它显⽰的是摄像机在透视投影下看到⼀个⽴⽅体(线框显⽰)同样的场景, 把摄像机改为"正交投影", 可以看到现在的⽴⽅体完全没有了透视效果. 这是因为这⽴⽅体相当于放置在⼀个矩形长⽅体管道中,投影完全*⾏, 没有了像透视投影那样的⾓度发散的效果.这就是正射投影的最⼤特点: ⽆论物体距离相机有多远投影后的物体⼤⼩尺⼨不变.下⾯我们⽤代码来继续讨论⼀下Ortho() 函数.先上个透视投影的效果图, 如下:这个三⾓形是画在Z为0的世界坐标系*⾯上的, 因此LookAt的前三个参数设置0,0,1, 表⽰摄像机xy指向世界坐标系原点, 摄像机的Z向世界坐标系统的Z正⽅向⾛1个单位, 即远离了三⾓形⼀个单位, 因此我们能看到三⾓形了.现在我们把Perspective改为Ortho.gl.Ortho(-2, 2, -3,3, -2, -5);gl.LookAt(0, 0, 1, 0, 0, -10, 0, 1, 0);跑起来, 屏幕上什么都没有.这是因为LookAt的第三个参数eyez, 没有位于Ortho参数near和far(即-2, -5)之间的原因.gl.LookAt(0, 0, -3, 0, 0, -10, 0, 1, 0);eyez改为-3就可以看到三⾓形了.我来总结⼀下:经过 gl.Ortho(-2, 2, -3,3, -2, -5) 正射投影之后, 三⾓形就被置于这个矩形长⽅体(-2, 2, -3,3, -2, -5)的视景体中了, 以后LooAt 就是在看这个视影体中的内容, 如果摄像机的视点设置有超出这视景体的部分将看不到, 相当于被剪切了.另外⼀个函数是 Ortho2D(), 它和Ortho不同的是缺少最后两上参数Near, Far, 这个Ortho2D()实际上是默认near为-1, far为1的Ortho()函数.笔者并不清楚它有什么作⽤, 如果以后遇到好的例⼦, 我会在这⾥续写这个知识点.本节源代码直接使⽤上节的源码原创⽂章,出⾃"博客园, 猪悟能'S博客" :。
SharpGL学习笔记(十四)材质:十二个材质球

参数名缺省值说明GL_AMBIENT(0.2, 0.2, 0.2, 1.0)材料的环境光颜⾊GL_DIFFUSE (0.8, 0.8, 0.8, 1.0)材料的漫反射光颜⾊GL_AMBIENT_AND_DIFFUSE?材料的环境光和漫反射光颜⾊GL_SPECULAR (0.0, 0.0, 0.0, 1.0)材料的镜⾯反射光颜⾊GL_SHINESS 0.0镜⾯指数(光亮度)GL_EMISSION (0.0, 0.0, 0.0, 1.0)材料的辐射光颜⾊GL_COLOR_INDEXES (0, 1, 1)材料的环境光、漫反射光和镜⾯光颜⾊函数glMaterial*()参数pname 的缺省值SharpGL 学习笔记(⼗四)材质:⼗⼆个材质球材质颜⾊OpenGL ⽤材料对光的红、绿、蓝三原⾊的反射率来近似定义材料的颜⾊。
象光源⼀样,材料颜⾊也分成环境、漫反射和镜⾯反射成分,它们决定了材料对环境光、漫反射光和镜⾯反射光的反射程度。
在进⾏光照计算时,材料对环境光的反射率与每个进⼊光源的环境光结合,对漫反射光的反射率与每个进⼊光源的漫反射光结合,对镜⾯光的反射率与每个进⼊光源的镜⾯反射光结合。
对环境光与漫反射光的反射程度决定了材料的颜⾊,并且它们很相似。
对镜⾯反射光的反射率通常是⽩⾊或灰⾊(即对镜⾯反射光中红、绿、蓝的反射率相同)。
镜⾯反射⾼光最亮的地⽅将变成具有光源镜⾯光强度的颜⾊。
例如⼀个光亮的红⾊塑料球,球的⼤部分表现为红⾊,光亮的⾼光将是⽩⾊的。
在真实世界中,⽩⾊物体在绿光照射下看起来是绿⾊⽽不是⽩⾊,红⾊物体在绿光照射下看起来是⿊⾊,⽽有时同样颜⾊的物体在同样的光照下亮度却不同,这都是由于物体的材质不同造成的.场景中物体的颜⾊取决于物体材质的反射和透射属性.材质RGB 值与光源RGB 值的关系材质的颜⾊与光源的颜⾊有些不同。
对于光源,R 、G 、B 值等于R 、G 、B 对其最⼤强度的百分⽐。
若光源颜⾊的R 、G 、B 值都是1.0,则是最强的⽩光;若值变为0.5,颜⾊仍为⽩⾊,但强度为原来的⼀半,于是表现为灰⾊;若R =G =1.0,B =0.0,则光源为黄⾊。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2016.9.25开启opengl之旅缓冲区:1.以字符“gl”作为前缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数。
2.以“glut”开头的函数,它们来自第三方库OpenGL Utility Toolkit(GLUT)。
3.与函数命名约定类似,OpenGL 库中定义的常量也是GL_COLOR_BUFFER_BIT 的形式。
4.所有的常量都以GL_ 作为前缀,并且使用下划线来分隔单词。
(常量的定义是通过#define 来完成的)5.glutDisplayFunc(),它设置了显示回调(display callback),即GLUT在每次更新窗口内容的时候会自动调用的例程6.函数中调用的最后一个函数是glutMainLoop(),这是一个无限执行的循环,它会负责一直处理窗口和操作系统的用户输入等操作(特别要注意:的是,glutMainLoop() 是一个无限循环,因此不会执行在它之后的所有命令。
)函数介绍:数组1.void glGenVertexArrays(GLsizei n, GLuint *arrays);返回n 个未使用的对象名到数组arrays 中,用作顶点数组对象。
返回的名字可以用来分配更多的缓存对象,并且它们已经使用未初始化的顶点数组集合的默认状态进行了数值的初始化。
2.void glBindVertexArray(GLuint array);glBindVertexArray() 完成了三项工作。
如果输入的变量array 非0,并且是glGenVertexArrays() 所返回的,那么它将创建一个新的顶点数组对象并且与其名称关联起来。
如果绑定到一个已经创建的顶点数组对象中,那么会激活这个顶点数组对象,并且直接影响对象中所保存的顶点数组状态。
如果输入的变量array 为0,那么OpenGL 将不再使用程序所分配的任何顶点数组对象,并且将渲染状态重设为顶点数组的默认状态。
3.void glDeleteVertexArrays(GLsizei n, GLuint *arrays);删除n 个在arrays 中定义的顶点数组对象,这样所有的名称可以再次用作顶点数组。
如果绑定的顶点数组已经被删除,那么当前绑定的顶点数组对象被重设为0(类似执行了glBindBuffer() 函数,并且输入参数为0),而默认的顶点数组会变成当前对象。
在arrays 当中未使用的名称都会被释放,但是当前顶点数组的状态不会发生任何变化。
4.GLboolean glIsVertexArray(GLuint array);如果array 是一个已经用glGenV ertexArrays() 创建且没有被删除的顶点数组对象的名称,那么返回GL_TRUE。
如果array 为0 或者不是任何顶点数组对象的名称,那么返回GL_FALSE。
5.void glBindBuffer(GLenum target, GLuint buffer);glBindBuffer() 完成了三项工作:1)如果是第一次绑定buffer,且它是一个非零的无符号整型,那么将创建一个与该名称相对应的新缓存对象。
2)如果绑定到一个已经创建的缓存对象,那么它将成为当前被激活的缓存对象。
3)如果绑定的buffer 值为0,那么OpenGL 将不再对当前target 应用任何缓存对象。
6.void glDeleteBuffers(GLsizei n, constGLuint *buffers);删除n 个保存在buffers 数组中的缓存对象。
被释放的缓存对象可以重用(例如,使用glGenBuffers())。
7.void glBufferData(GLenum target, GLsizeiptr size, constGLvoid *data, GLenum usage);size表示存储数据的总数量。
这个数值等于data 中存储的元素的总数乘以单位元素存储空间的结果。
data 要么是一个客户端内存的指针,以便初始化缓存对象,要么是NULL。
如果传入的指针合法,那么将会有size 大小的数据从客户端拷贝到服务端。
如果传入NULL,那么将保留size 大小的未初始化的数据,以备后用。
usage 用于设置分配数据之后的读取和写入方式功能介绍1着色器1.1传递着色器:它只负责将输入数据拷贝到输出数据中例1.2 triangles.cpp 对应的顶点着色器:triangles.vertExample 1.2 Vertex Shader for triangles.cpp: triangles.vert#version 430 core//指定了我们所用的OpenGL 着色语言的版本layout(location = 0) in vec4 vPosition;voidmain(){gl_Position = vPosition;}“ core”表示我们将使用OpenGL 核心模式(core profile),这与之前GLUT 的函数glutInitContextProfile() 设置的内容应当一致。
*/每个着色器的第一行都应该设置“ #version”,否则系统会假设使用“110”版本,但是这与OpenGL 核心模式并不兼容。
2.片元着色器:配合顶点着色器的工作例1.3 triangles.cpp 对应的片元着色器:triangles.fragExample 1.3 Fragment Shader for triangles.cpp: triangles.frag#version 430 coreout vec4 fColor;voidmain(){fColor = vec4(0.0, 0.0, 1.0, 1.0);}1.1声明的变量名为fColor. 它使用了out限定符。
着色器将会把fColor对应的数值输出,1.2设定片元的颜色,每个片元设置一个四维的向量。
分别是(R,G,B,alpha)(alpha专用于度量透明度),2.OpenGL 进行渲染v oid display( void){glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(VAOs[Triangles]);glDrawArrays(GL_TRIANGLES, 0, NumVertices);glFlush();}2.1void glClear(GLbitfield mask);清除指定的缓存数据并重设为当前的清除值。
mask 是一个可以通过逻辑“或”操作(一般为:glClear(GL_COLOR_BUFFER_BIT);)glClearColor(1, 1, 1, 1)四维参数为rgbalpha2.2使用O p e n G L 进行绘制:首先调用glBindVertexArray() 来选择作为顶点数据使用的顶点数组,其次使用glDrawArrays() 来实现顶点数据向OpenGL 管线的传输。
void glDrawArrays(GLenum mode, GLint first, GLsizei count);使用当前绑定的顶点数组元素来建立一系列的几何图元,起始位置为first,而结束位置为first + count-1。
mode 设置了构建图元的类型,它可以是GL_POINTS、GL_ LINES、GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLES、GL_TRIANGLE_ STRIP、GL_TRIANGLE_FAN 和GL_PATCHES 中的任意一种。
2.3glEnable() 会开启一个模式,glDisable() 会关闭它第二章着色器基础2.1OpenGL 的可编程管线2.1.1顶点着色阶段(vertex shading stage)将接收你在顶点缓存对象中给出的顶点数据,独立处理每个顶点。
2.1.2 细分着色阶段(tessellation shading stage)是一个可选的阶段,与应用程序中显式地指定几何图元的方法不同,它会在OpenGL 管线内部生成新的几何体.2.1.3几何着色阶段(geometry shading stage)也是一个可选的阶段,它会在OpenGL 管线内部对所有几何图元进行修改。
2.1.4片元着色阶段(Fragment shading stage)这个阶段会处理OpenGL 光栅化之后生成的独立片元(如果启用了采样着色的模式,就是采样数据),并且这个阶段也必须绑定一个着色器。
2.1.5计算着色阶段(Compute shading stage)和上述阶段不同,它并不是图形管线的一部分,而是在程序中相对独立的一个阶段例 2.1 一个简单的顶点着色器Example 2.1 A Simple Vertex Shader#version 330 corein vec4 vPosition;in vec4 vColor;out vec4 color;uniform mat4 ModelViewProjectionMatrix;voidmain(){color = vColor;gl_Position = ModelViewProjectionMatrix * vPosition;}2.2使用GLSL 构建着色器#version 330 corevoidmain(){// Your code goes he}在这里编写代码变量的声明:GLSL 是一种强类型语言,所有变量都必须事先声明,并且要给出变量的类型变量名称的命名规范与C 语言相同:可以使用字母、数字,以及下划线字符(_)来组成变量的名字。
变量的作用域同C++变量的初始化所有变量都必须在声明的同时初始化,例如:inti,numParticles = 1500;整型变量可以表示八进制,十进制,十六进制,可以加符号表示负数,也可以在前面加上U 表示无符号。
浮点变量可以在数后面加f布尔变量可以是trueorfalse对他进行初始化。
构造函数int f = false;这样的写法会编译出错,因为布尔值不能赋予整型变量。
所有其他的数值转换都需要提供显式的转换构造函数。
float f = 10.0;int ten = int(f);这里用到了一个int转换构造函数来完成转换。
此外,还有其他类型也有转换构造函数,包括float、d o u b l e、uint、bool,以及这些类型的向量和矩阵。
每种构造函数都可以传入多个其他类型的值并且进行显式转换。
这体现了GLSL的一个特性就是函数的重载。
结构体结构体可以简化多组数据传入函数的过程。
如果定义了一个结构体,那么他会自动创建一个新类型,并隐式定义一个构造函数,将各种元素的结构体元素作为输入参数。