OpenGL
包含OpenGL绘图过程中踩过的一些坑和经常要用到的绘图内容
windxgz
这个作者很懒,什么都没留下…
展开
-
OpenGL总结16——深度测试下融混显示黑色
以下问题均发生在GL_MODELVIEW模式下。首先,在GL_MODELVIEW模式下要使用深度测试,否则图像会产生一种前后不分的效果。在编写三维图像的显示的过程中用到了透明度和融混的操作,但是在使用后发现显示有问题,图像使用融混后不能使用深度测试,否则图像的背面是黑色如果不使用深度测试就没办法判断前后顺序,混合就会按照输入的顺序进行,所以背面的图像会像是翻到前面来,但是如何使用深度测试,就会出现图像变为黑色,如果同时还是用了透明度测试,则图像会变暗,背面的透明度像是失效了一样。举个例子,正常的绘图顺原创 2020-10-16 10:12:02 · 516 阅读 · 0 评论 -
OpenGL总结15-光照模型
光照模型绘制地形图时发现图像看不出起伏,觉得应该是关照模型和法线的问题,所以查找了一些资料,这里做一个总结。在查看计算机图形学的时候,书中提到光照模型与表面绘制,为了避免属于混乱,定义了光照模型和表面绘制的定义。光照模型:对单个点进行光照计算的模型表面绘制:利用光照模型获得投影中所有表面像素颜色物体的表面光照一般包括反射、透明、纹理、阴影。一般采用物理模型对光照的显示进行模拟。光源分类点光源:通过RGB颜色值指定的单色光点,通过位置和颜色定义。一般用于距离较远的场景(包括距离以及相对物体原创 2020-08-17 10:30:05 · 1071 阅读 · 0 评论 -
OpenGL总结14-字符与文字输出
字符基础字符图元基础(根据计算机图形学进行简单的总结):字样:一组字符的完整设计风格字体:一组按照特定尺寸和格式的目标字符样式衬线字体:易于阅读无衬线字体:易于识别单一宽度字体:每个字符大小是相同的,不受字符本身的大小影响比例字体:每个字符的大小根据自身的大小决定字体的表示有两种方式(OpenGL本身不提供字符支持,通过调用window的接口实现):位图字体:与光栅化类似(也叫光栅化字体),在网格上用一个一个像素块拼出一个字符形状,位图字体比较简单,显示时方便,但是位图字体对于缩放等原创 2020-05-26 17:24:06 · 1281 阅读 · 0 评论 -
OpenGL总结13-固定管线绘图与可编程管线绘图的性能以及vao和vbo的使用
因为项目需要所以要进行三维纹理图像的绘制,用固定管线进行绘图的时候,每次绘制都要给GPU传递大量的坐标点,这个点的数量达到亿级,绘制图像的时候都不不敢使用四通道的图像(否则程序卡成JPG),这里我只是用了两通道的图像进行显示,此时图像绘制和由旋转之类的操作引发的重绘卡成了PPT。当使用庞大数量的点进行绘制的时候,固定管线的传输效率是非常不友好的,使用固定管线的函数开销非常大。之后查找了一些资料发...原创 2020-04-28 16:34:13 · 1429 阅读 · 0 评论 -
OpenGL总结12-OpenGL与多线程
因为处理三维纹理时间过长想要使用进度条来提高体验,使用进度条时用的是QT的progressBar结合QTimer做的,这个时候需要OpenGL的数据处理在后台,前台显示进度条。这里要用到多线程,我原本将OpenGL相关的处理写到一个类里,写线程的时候直接针对类对象进行,但是数据的显示始终不正确,切换数据后显示的仍然是第一个图像的数据。之后查找了相关资料后发现,OpenGL本身不是线程安全的,在...原创 2020-04-22 17:09:56 · 981 阅读 · 0 评论 -
OpenGL总结11-模型矩阵模式与纹理矩阵模式的差异
在使用OpenGL进行三维纹理渲染的时候,因为使用了混合和透明度,光使用透明度图像会比较难看,所以添加了混合,但是使用混合之后就不能使用深度测试,如果想使用深度测试有一种方法叫顺序无关的渲染,因为渲染顺序对混合有影响,所以要是用深度无关的渲染方法避免这个问题。但我之前为了避免这个问题,采用了一种比较取巧的办法,原本控制模型旋转是在GL_MODELVIEW下进行的,此时必然要使用深度测试,否则像素...原创 2020-04-09 11:06:27 · 475 阅读 · 0 评论 -
OpenGL总结10-绘制轮廓文字(可旋转)
在使用OpenGL进行绘图的时候需要为纹理添加一些提示信息(比如方向),并且要求模型旋转后相对位置不变,这就需要绘制可以旋转的文字。OpenGL是图形绘制的标准,其中并不包含绘制文字的内容,因此我们想要绘制文字必须使用操作系统中自带的文字绘制功能进行绘制,比如Windows就要用到MFC相关的接口。一般的绘制轮廓文字采用的是显式列表的形式,需要一些变量保存列表的相关信息。HDC m_HDC;...原创 2020-04-01 18:22:03 · 1586 阅读 · 0 评论 -
OpenGL总结9-万向锁
在使用OpenGL进行模型旋转的时候一个比较经典的问题就是万向锁,这是在使用OpenGL的旋转函数时会面临的问题。glRotatef(rot,x,y,z);这是OpenGL的旋转函数,第一个参数代表角度,其余参数分别代表旋转轴x,y,z。正常情况下,选择绕一个轴旋转是没有问题的,不管怎么旋转都是符合我们的预期的。但是当使用多个轴的时候就会出现问题,首先我们需要通过二维的坐标来控制三维的旋转,...原创 2020-03-26 11:13:44 · 373 阅读 · 0 评论 -
OpenGL总结8-纹理状态机
OpenGL中的各种设置都是采用状态机,也就是类似开关,如果一个状态打开后不进行关闭那么这个状态将会持续。OpenGL在进行纹理贴图的时候经常要用到glEnable这个函数,每次开启纹理后最好都进行一次关闭,因为在后续的绘制过程中,如使用glColor进行颜色的绘制时,如果纹理的状态机开着,那么很有可能会影响你的纹理图像,还有如果文理绑定失败,贴图时可能会贴之前的纹理。所以最好在每次使用之后都进...原创 2020-03-24 11:54:32 · 526 阅读 · 0 评论 -
OpenGL总结7-颜色与纹理共存
在使用OpenGL进行纹理贴图后,我需要在上面画一些线作为辅助,但是当我进行画线的时候发现glColor中的颜色会覆盖到纹理上,导致纹理的颜色很奇怪,经过查找资料和尝试发现了问题所在。首先,纹理在不使用的时候一定要进行关闭,因为如果不将纹理进行关闭,后面在绘图的时候会影响到纹理。其次,要对颜色进行保存,也就是压栈glPushAttrib,这样对颜色进行保存后才能保证画线的颜色不会影响到其他图像。...原创 2020-03-23 16:13:57 · 1169 阅读 · 1 评论 -
OpenGL总结6-圆柱纹理贴图
圆柱纹理贴图我采用了OpenGL中的函数gluCylinder,这个函数会生成空心的圆柱,这个圆柱固定生成为底面位于xy面,z=0,顶面从z=0开始向z轴正方向,也就是说圆柱体是冲着我们生成的,如果想要改变圆柱体的位置,需要用glRotate和glTranslate函数来调整。GLUquadricObj *cyliner = gluNewQuadric(); //绘制圆柱的对象gluQuadr...原创 2020-03-18 16:04:50 · 2185 阅读 · 0 评论 -
OpenGL总结5-纹理数组坑
因为图片的数量较多,不想过多开辟纹理的ID所以想要尝试纹理数组,但是经过纹理的设置后始终显示白色,以下是设置glGenTextures(1, &tex);glBindTexture(GL_TEXTURE_2D_ARRAY, tex);glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);...原创 2020-03-16 11:41:30 · 566 阅读 · 0 评论 -
QT总结6-OpenGL初始化
在qt中使用OpenGL时要注意OpenGL初始化的时间,intializeGL函数会在paint之前调用,但是只调用一次,因为这个函数不是显示的进行调用,所以我们可能无法确定它初始化的时间,这就给使用OpenGL进行纹理贴图的时候造成了麻烦。经过测试发现init不是在调用构造函数之后被调用的,而是在界面需要显示的时候进行调用。打个比方,有两个界面需要显示,OpenGL的界面是第二个界面,当前是...原创 2020-03-13 18:39:49 · 1223 阅读 · 0 评论 -
OpenGL总结4-3D纹理贴图坑
OpenGL在纹理贴图的时候用到了多个坐标系,最头痛的是两个,一个是顶点所在的顶点坐标系,另一个是纹理所在的纹理坐标系。顶点坐标系与纹理坐标系不同的地方在于,当纹理导入之后,纹理在纹理坐标系中的坐标始终保持(0,1)内,所以在进行纹理变换的时候要将纹理先移动到坐标中心再进行变化,否则整个纹理相当于绕着坐标轴旋转或者变化,经常会出现纹理找不到的情况,这是因为在变化的过程中纹理离开了你的视线范围,所...原创 2020-03-04 16:27:44 · 1355 阅读 · 0 评论 -
OpenGL总结3-修改背景色
OpenGL修改背景色,因为需要从qt中将信号传入OpenGL显示类,用来更新背景色,此时踩了个坑。OpenGL修改背景色要用到两个函数:glClearColor(color,color1,color2,alpha);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);OpenGL利用glClearColor中设置的颜色对背景色进行更新,...原创 2020-03-04 11:21:51 · 5141 阅读 · 0 评论 -
OpenGL总结2-glew
glew是OpenGL的一个扩展库,因为OpenGL是开源标准不同厂家的显卡有自己的实现,所以如果要进行跨平台的使用需要从供应商提供的接口中进行查找,找到需要的函数的指针进行调用,非常繁琐,利用glew可以对这个步骤进行封装,这样就可以直接使用函数名进行调用。c++中使用这个库的时候一定要在OpenGL库之前进行包含,否则会报错,在进行glew初始化得时候也要注意初始化得位置,如果初始化得位置不...原创 2020-02-28 15:59:34 · 819 阅读 · 0 评论 -
OpenGL总结1-纹理ID
利用OpenGL纹理贴图显示图像,需要在不同的图像之间进行切换或者不使用纹理,可以使用OpenGL纹理绑定进行设置。glBindTexture(GL_TEXTURE_2D, tex_id);纹理绑定函数的第一个参数GL_TEXTURE_2D代表绑定的是二维纹理,GL_TEXTURE_3D代表绑定的是三维纹理,OpenGL还可以绑定纹理数组GL_TEXTURE_2D_ARRAY。第二个参数表示...原创 2020-02-28 12:20:44 · 2529 阅读 · 5 评论