
OpenGL
文章平均质量分 89
-牧野-
这个作者很懒,什么都没留下…
展开
-
OpenGL+VS2012编译环境配置
OpenGL库主体分为三部分,分别是gl(OpenGL核心库)glu(Utility Library,OpenGL实用库)glut(Utility Toolkit,OpenGL实用工具库)glgl是OpenGL的核心,提供了OpenGL的基本函数,每个函数都以GL开头。核心库包含有115个函数,用于常规的、核心的图形处理。gl.h是OpenGL核心库原创 2016-11-06 21:58:14 · 6907 阅读 · 6 评论 -
OpenGL(十一) BMP真彩文件的显示和复制操作
glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型:glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);第一到第四个参数分别表示图象宽度、图象高度、像原创 2016-11-14 22:54:52 · 2672 阅读 · 5 评论 -
OpenGL图形渲染管线、VBO、VAO、EBO概念及用例
图形渲染管线(Pipeline)图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上的整个过程。图形渲染管线的整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为下一个阶段的输入数据,是一个串行的,面向过程的执行过程。每一个阶段分别在GPU上运行各自的数据处理程序,这个程序就是着色器。部分着色器允许我们使用着色语言(OpenGL原创 2016-12-10 13:07:25 · 51109 阅读 · 12 评论 -
OpenGL(十六) 鼠标、键盘交互响应事件
OpenGL中通过鼠标和键盘跟程序交互的实现需要实现注册鼠标和键盘响应事件,在一定条件下,该事件被触发,事件里的程序被执行,达到交互的目的。通过glutMouseFunc(&OnMouse)注册鼠标事件,OnMouse是鼠标事件的响应,函数格式是void OnMouse(int button,int state,int x,int y);通过glutKeyboardFunc原创 2016-11-18 22:56:40 · 40708 阅读 · 3 评论 -
OpenGL(十七) 绘制折线图、柱状图、饼图
一、绘制折线图glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j])函数可以绘制GLUT位图字符,第一个参数是GLUT中指定的特定字形集,第二个参数是要写入的单个字符;#include GLsizei windowWidth=600,windowHeight=600;GLubyte label[36]={'O','n','e',原创 2016-11-22 21:49:02 · 7382 阅读 · 1 评论 -
OpenGL(二十三) 各向异性纹理过滤
如果使用一般的纹理过滤,当观察方向跟模型表面不是相互垂直的的情况下,会出现纹理信息的丢失,表现为图像看上去比较模糊,如下图所示,远处场景的细节信息很差:针对这种情况,可以采用同向异性过滤的方式处理纹理,在过滤纹理的时候,考虑到观察角度不同,使纹理本身沿着模型表面倾斜的方向进行延伸。使用如下语句查询当前系统支持的最大同向异性过滤的数值,数值越大,表示沿着最大变化方原创 2016-12-05 21:18:56 · 10322 阅读 · 0 评论 -
OpenGL(十八) 顶点数组和抗锯齿(反走样)设置
顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用。使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERTEX_ARRAY(顶点数据)和GL_COLOR_ARRAY(颜色数组),颜色数组可以为每个顶点分别分配颜色。glVertexPointer (GLint size, GLenum type原创 2016-11-23 21:50:25 · 2087 阅读 · 0 评论 -
OpenGL(二十四) VAO、VBO和着色器使用示例
1. 新建一个工程,新建一个头文件Shader.h,内容如下:#ifndef _SHADER_H_ #define _SHADER_H_#include #include #include #include class Shader{public: static GLuint createShader(GLenum eShaderType, const std:原创 2016-12-06 23:33:52 · 2493 阅读 · 1 评论 -
OpenGL(二十) glutSpecialFunc响应键盘方向控制键
OpenGL的glut中使用glutMouseFunc函数注册鼠标响应事件,使用glutKeyboardFunc函数注册键盘响应事件,对键盘上特殊的4个方向按键的响应函数是glutSpecialFunc。方向键响应事件的实现函数的格式是void SpecialKey(GLint key,GLint x,GLint y);其中key对应4个方向按键,上下左右按键分别对应于GL原创 2016-11-25 21:49:35 · 16673 阅读 · 0 评论 -
OpenGL(十九) gluOrtho2D、glViewport、glutInitWindowSize区别与关系
gluOrtho2D定义剪裁面,通过正交投影,把景物(模型)按照1:1的比例绘制到一个剪裁面上,相当于对世界坐标窗口的一个截取。glViewport定义视口,即视见窗口,是从世界坐标系窗口到屏幕坐标系窗口的映射,决定了gluOrtho2D定义的剪裁main如何映射到屏幕上,通过调节glViewport的参数, 可以调节模型在屏幕窗口上的缩放和显示位置。glutInitWindowSize定原创 2016-11-25 21:29:59 · 15019 阅读 · 0 评论 -
OpenGL(二十一) glPolygonOffset设置深度偏移解决z-fighting闪烁问题
开启深度测试后OpenGL就不会再去绘制模型被遮挡的部分,这样实现的显示画面更为真实,但是由于深度缓冲区精度的限制,对于深度相差非常小的情况(例如在同一平面上进行两次绘制),OpenGL就不能正确判定两者的深度值,会导致深度测试的结果不可预测,显示出来的现象时交错闪烁的前后两个画面,这种情况称为z-fighting,在旋转(深度值发生变化)的情况下表现的更为明显,如下图所示:原创 2016-11-25 21:52:54 · 13930 阅读 · 0 评论 -
OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行是在GPU上。GLSL中着色器主要分为顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)两部分,代替了固定渲染管线的一部分,使渲染管线中不同层次具有可编程性,程序控制更加原创 2016-12-14 23:34:37 · 26538 阅读 · 1 评论 -
OpenGL中GLSL渲染茶壶光照完整程序
顶点着色器VertexShader.txt:uniform vec3 lightposition;//光源位置uniform vec3 eyeposition;//相机位置uniform vec4 ambient;//环境光颜色uniform vec4 lightcolor;//光源颜色uniform float Ns;//高光系数uniform float attenuation;原创 2017-01-04 22:21:01 · 5387 阅读 · 2 评论 -
OpenGL(十) 截屏并保存BMP文件
BMP文件格式BMP图像又称为Bitmap(位图),是Windows系统中广泛采用的图像格式。BMP文件的数据按照从文件头开始的先后顺序分为四个部分:我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像称为真彩色,这种格式不需要调色表,所以位图信息头后紧跟的、从文件头开始偏移54个字节就是位图数据了。BMP图像文件四字原创 2016-11-14 21:33:08 · 8774 阅读 · 4 评论 -
OpenGL(十五) OpenCV+OpenGL实现水面倒影
有两幅原始图片,一个是景物图像,一个是水面图像,尝试生成景物在水中的倒影:在OpenGL中,加载并显示这个景物图像可以把这个图像作为纹理载入即可,把图像直接选择180度的效果就相当于是在镜面中倒影的效果,剩下水纹的效果本来也想作为纹理叠加上去的,但是试了一下没有成功,干脆直接把水面和景物先融合一下,作为倒影的图像,一次加入到倒影平面的纹理中。融合使用了OpenC原创 2016-11-18 00:03:20 · 8350 阅读 · 1 评论 -
OpenGL(十四) 模板测试
启用模板测试时,OpenGL会在内存中开辟一块空间作为模板缓冲区,里边保存了每个像素的“模板值”,模板测试的过程就是把每一个像素的模板值与一个设定的模板参考值进行比较,符合设定条件的通过测试,不符合条件的则不会绘制。glClearStencil函数用来指定模板值复位后的初始值,跟使用glClearColor函数指定复位后画板的颜色一样。glStencilFunc函数用来设置模板测试条件。第原创 2016-11-17 22:33:20 · 3625 阅读 · 0 评论 -
OpenGL(一)绘制圆、五角星、正弦曲线
OpenGL入门之“顶点”OpenGL规定,一个多边形必须是一个“凸多边形”,即连接多边形上任意两点,其连线都在多边形内部。多边形可以由其边上的端点(这里可称为顶点)来确定。所以“顶点”的概念在图形学中非常重要,定义了顶点数组和顶点的连接方式,就可以组合出各种形态。OpenGL中顶点连接形式顶点的连接形式由glBegin函数定义,每种参数对应的连接形式如下:原创 2016-11-06 23:11:24 · 35757 阅读 · 1 评论 -
OpenGl(二)点线设置、多边形镂空
1. 改变点的大小OpenGL中默认点的大小是1个像素,使用函数glPointSIze可以调整点的大小,入参是GLfloat,相当于是浮点数。相关代码:void myDisplay(void) { //设置点的大小 glClear(GL_COLOR_BUFFER_BIT); glPointSize(5); //设置点的大小为5个像素 glColor4原创 2016-11-07 22:18:42 · 5962 阅读 · 0 评论 -
OpenGL(三) RGBA颜色设置
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色,对于颜色索引模式,保存的是该颜色在颜色索引表中的位置,通过查颜色索引表对应相应的颜色上。颜色索引模式的优点是占用空间小,运行速度快,缺点是显示效果稍差,随着硬件的提速升级,RGBA颜色模式成为主流。原创 2016-11-07 23:29:37 · 21672 阅读 · 1 评论 -
OpenGL(四) 左右手坐标系及基本坐标变换
左手坐标系、右手坐标系、笛卡尔坐标系左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。左右手坐标系的示意图如下:左手和右手坐标注系的区别在于两者Z轴的方向是相反的。在高等数学中使用的三维空间是笛卡尔坐标系,如下:原创 2016-11-08 22:35:14 · 23649 阅读 · 1 评论 -
OpenGL(六) gluLookAt和gluPerspective函数解析
在调用gluLookAt和gluPerspective函数之前一般要先调用一下glLoadIdentity函数,先说一下这个函数是做什么的。glLoadIdentityglLoadIdentity是一个无参的无值函数,其功能是用一个4*4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化为单位矩阵。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复原创 2016-11-09 23:38:39 · 38391 阅读 · 18 评论 -
OpenGL(七) 光照模型及设置
OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。光源就是光的来源,是“光”这种物质的提供者; 材质是指被光源照射的物体的表面的反射、漫反射(OpenGL不考虑折射)特性;材质反映的是光照射到物体上后物体表现出来的对光的吸收、漫反射、反射等性能; 光照环境反应环境中所有光源发出的光经过无数次反射、漫反射之后整体环境所表现出来的光照效果。指定合适的光照原创 2016-11-10 23:42:53 · 47374 阅读 · 6 评论 -
OpenGL(八) 显示列表
OpenGL在即时模式(Immediate Mode)下绘图时,程序中每条语句产生的图形对象被直接送进绘图流水线,在显示终端立即绘制出来。当需要在程序中多次绘制同一个复杂的图像对象时,这种即时模式会消耗大量的系统资源,降低程序的运行效率,为此,OpenGL提供了一种更有效组织OpenGL语句的形式——显示列表。OpenGL使用显示列表方式绘图一般要比瞬时方式快,尤其是显示列表方式可以大量地提高原创 2016-11-11 22:27:56 · 8501 阅读 · 0 评论 -
OpenGL(十二) 纹理映射(贴图)
OpenGL绘制纹理的步骤:1. 开启纹理功能使用glEnable(GL_TEXTURE_2D)开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)关闭纹理,默认情况下纹理是关闭的。2. 读取纹理图片到内存读取的时候注意以下3点: 1) BMP文件数据前54位是文件头和信息头数据,偏移54位之后才是要读取的图像数据。 2) 要检测图像宽度的位数是否是4的整原创 2016-11-16 07:15:25 · 39226 阅读 · 19 评论 -
OpenGL(二十二) gluBuild2DMipmaps 加载Mip纹理贴图
当纹理被用于渲染一个面积比它本身小很多的对象时,会由于纹理图像的降采样率不足而导致混叠现象,主要的表现特征是纹理图像的闪烁,出现纹理躁动。特别是在场景远近移动变换时,这种闪烁情况更为明显,严重可能会影响到模型的视觉质量。一个纹理躁动的示例如下:上图中可以看到,近处的场景渲染比较清晰,但是远处的纹理出现很多碎点,并且随着场景的远近变化,这种碎点闪烁现象也在无规律的躁动变化,影响视原创 2016-11-28 22:34:48 · 6388 阅读 · 0 评论 -
OpenGL(九) 三维混色和深度缓存设置
颜色的混合在现实世界中非常常见,例如隔着有色玻璃观看物体,此时在观察者严重呈现出来物体的颜色就是玻璃的颜色和物体的颜色的混合。OpenGL在RGBA颜色模式下使用函数glenable(GL_BLEND)开启混色功能,使用glDisable(GL_BLEDN)关闭混色功能。混色功能开启之后,最终显示的颜色的RGBA分量是两个颜色各自的RGBA分量经过一定的公式计算出来。源因子和目标因原创 2016-11-12 21:09:40 · 1900 阅读 · 0 评论 -
OpenGL(十三) Alpha测试、剪裁测试
Alpha测试测试就是测试每一个像素的Alpha值是否满足某一个特定的条件,如果满足,则该像素会被绘制,如果不满足则不绘制,跟深度测试的机制是一样的,只不过深度测试考察的是像素的“深度”属性,Alpha测试考察的是像素的“Alpha”属性。利用Alpha测试的这一特性,可以模拟两幅图像叠加,但是又要求前景图像有一部分是透明的场景,这时候可以把要求透明的区域内的每一个像素的Alpha值设置为0,原创 2016-11-17 21:52:14 · 3821 阅读 · 0 评论 -
CUDA+OpenGL混合编程
CUDA+OpenGL混合编程示例:#include #include #include "GL\glew.h" #include "GL\glut.h" #include #include #include #define GET_PROC_ADDRESS(str) wglGetProcAddress(str) #define DIM 512原创 2017-02-07 22:49:25 · 5112 阅读 · 0 评论