OpenGL
文章平均质量分 85
使用Qt的封装,来实现OpenGL,代码大部分是一样的。
灬Sunnnnn
承接各种定制开发,Qt、音视频、流媒体、客户端、服务端,需要的私聊。
展开
-
OpenGL 实现各种美颜滤镜效果
在OpenGL中,滤镜的效果通常是在片元着色器中完成。灰度滤镜:这种滤镜会将图像中每个像素的红、绿、蓝(RGB)分量取平均值,然后使用这个值替换原来的RGB分量,从而实现灰度效果。在片元着色器中,可以通过计算颜色值的平均值并赋予每个分量该值来实现这一点。高斯模糊:高斯模糊需要使用邻域算子,它考虑了当前像素周围一定范围内的像素值。这通常涉及到为每个像素及其邻近像素分配权重,然后根据这些权重计算新的像素值。在OpenGL中,这可能需要使用自定义的片元着色器和多次渲染传递。原创 2024-03-05 14:13:18 · 822 阅读 · 0 评论 -
OpenGL 实现分屏(2分屏、4分屏、9分屏、16分屏)
分屏滤镜的实现主要是通过修改纹理坐标与纹理的对应关系来实现。在OpenGL中,这通常是在片元着色器中完成。在实现分屏效果时,顶点着色器的代码通常不需要改动。只有片元着色器中的纹理坐标处理需要进行修改。在修改了纹理坐标后,每个分屏区域内的纹理坐标对应关系都会有所不同。这意味着每个屏幕区域的纹理采样也会不同。示例:4分屏原理,其他的分屏以此类推。从这个图我们可以得出一个通用结论:在四分屏中滤镜中假如当纹理片段坐标为(x,y),当x小于0.5的时候,则采样纹理图片对应的x值为0到1,原创 2024-03-05 10:27:43 · 801 阅读 · 0 评论 -
OpenGL 实现色温、色调、亮度、对比度、饱和度、高光
色温:简单理解是色彩的温度,越低越冷如蓝色,约高越暖如红色。亮度:增加就是给图片所有色彩加白色,减少加黑色。注意是只加黑白两种颜色,不然容易跟纯度弄混。对比度:增加就是让白的更白,黑的更黑;减少就是白的不那么白,黑的不那么黑。饱和度:就是增加图片各种颜色的纯度。比如蓝色,增加纯度就是在蓝色上加蓝色,降低纯度就是加入蓝色的对比色,让它变灰色或者黑色。高光:增加就是给图片白色的部分再加点白色,减少就是减少点白色。色调:可以简单理解为色彩倾向,倾向于红橙还是黄绿。原创 2024-03-04 17:09:49 · 1160 阅读 · 0 评论 -
OpenGL ES2加载3D模型
本文使用Qt,使用OpenGL ES来渲染。运行环境:国产嵌入式操作系统kylin V10。CPU:rk3588。OpenGL ES 2.0(OpenGL for Embedded Systems 2.0)是一种用于嵌入式系统的图形渲染API,在嵌入式设备上,需要编译Qt库,在Qt生成Makefile的过程中,需要指定编译opengl es2,否则编译出来的Qt库不支持opengl es2,就没法加载3D模型。原创 2024-01-16 20:14:43 · 1415 阅读 · 2 评论 -
OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)
本博客以.glb格式为例,加载glb格式的3d模型,网上找了一圈,基本上都是根据OpenGL官方示例,加载.obj格式的3d模型。下面以.obj和.glb格式的3D模型简单介绍一下。常见的.obj格式的3D模型如下所示:纹理都已经被剥离出来了。所以在使用Assimp库加载的时候,加载了指定的路径即可。但是.glb格式的3D模型如下所示,就只有一个glb文件,纹理嵌入到模型当中,假如我们使用Assimp库去加载的时候,能够加载出模型,但是加载出来的效果全是黑的,加载不了纹理。加载的效果如下图所示,黑的一片。原创 2024-01-15 21:34:26 · 2405 阅读 · 1 评论 -
OpenGL 抗锯齿
你可以看到,我们只是绘制了一个简单的立方体,你就能注意到它存在锯齿边缘。可能不是非常明显,但如果你离近仔细观察立方体的边缘,你就应该能够看到锯齿状的图案。如果放大的话,你会看到下面的图案:你能够清楚看见形成边缘的像素。这种现象被称之为走样(Aliasing)。有很多种抗锯齿(Anti-aliasing,也被称为反走样)的技术能够帮助我们缓解这种现象,从而产生更平滑的边缘。原创 2023-06-27 20:34:07 · 1298 阅读 · 1 评论 -
OpenGL 实例化
假设你有一个绘制了很多模型的场景,而大部分的模型包含的是同一组顶点数据,只不过进行的是不同的世界空间变换。想象一个充满草的场景:每根草都是一个包含几个三角形的小模型。你可能会需要绘制很多根草,最终在每帧中你可能会需要渲染上千或者上万根草。因为每一根草仅仅是由几个三角形构成,渲染几乎是瞬间完成的,但上千个渲染函数调用却会极大地影响性能。如果像这样绘制模型的大量实例(Instance),很快就会因为绘制调用过多而达到性能瓶颈。原创 2023-06-27 07:00:00 · 294 阅读 · 0 评论 -
OpenGL 几何着色器
在顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。示例几何着色器代码:} gl_in[];声明从顶点着色器输入的图元类型。这需要在in关键字前声明一个布局修饰符。points:绘制GL_POINTS图元时(1)。lines。原创 2023-06-26 20:46:19 · 750 阅读 · 0 评论 -
OpenGL 模板测试
当片段着色器处理完一个片段之后,模板测试会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲。一个模板缓冲中,(通常)每个模板值是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或是保留这个片段了。模板缓冲首先会被清除为0,之后在模板缓冲中使用1填充了一个空心矩形。原创 2023-06-25 21:36:19 · 509 阅读 · 0 评论 -
OpenGL 帧缓冲
我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。渲染场景到不同的帧缓冲能够让我们在场景中加入类似镜子的东西,或者做出很酷的后期处理效果。原创 2023-06-25 19:27:04 · 1440 阅读 · 0 评论 -
OpenGL模型控制(旋转、平移)
首先做一个鼠标双击事件,表示平移模型对象,当然,我们需要遍历当前哪个模型对象被选中,才能进行该对象的平移操作。然后再绘制的时候, 使用model.translate(modelInfo.worldPos)即可。开启平移后,重写鼠标移动事件,将物体的需要移动到的像素坐标转化为世界坐标。首先判断当前的模型是否被选中。重写鼠标左键单击事件。重写鼠标移动事件,改变其欧拉角。原创 2023-06-23 19:00:00 · 2109 阅读 · 0 评论 -
OpenGL 鼠标拾取模型
在我们的场景中,使用鼠标光标点击或“挑选”一个3d对象是很有用的。一种方法是从鼠标投射3d光线,通过相机,进入场景,然后检查光线是否与任何物体相交。这通常被称为光线投射。我们不是从局部空间中的网格开始,而是从视口空间中的2d鼠标光标位置开始。我们用逆矩阵来逆向进行变换,得到世界空间中的一条射线。首先在局部空间中有一个局部坐标(0.5,1,0)然后乘以model矩阵变换到世界空间坐标(10.5,1,-20,1),这里增加了齐次坐标w=1。原创 2023-06-23 14:17:19 · 2918 阅读 · 1 评论 -
OpenGL 齐次坐标
在计算机图形学里面会经常碰到几何体的平移,旋转,缩放以及投影变换. 一般情况下会涉及到齐次坐标与变换矩阵.问题:两条平行线可以相交?在欧氏空间(几何学)中,同一平面上的两条平行线不能相交,或者说不能永远相交。这是一个大家都熟悉的常识。但是,在投影空间中就不一样了,比如,下图上的火车铁路在远离眼睛的时候会变得更窄。最后,两条平行的铁轨在地平线处相交,也就是无限远处的一点。铁路变窄,在地平线处相交。转载 2023-06-23 12:47:43 · 362 阅读 · 0 评论 -
OpenGL 面剔除
OpenGL能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面,节省我们很多的片段着色器调用(它们的开销很大!但我们仍要告诉OpenGL哪些面是正向面,哪些面是背向面。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序。原创 2023-06-23 11:05:08 · 431 阅读 · 0 评论 -
OpenGL 混合
混合(Blending)通常是实现物体透明度的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。原创 2023-06-19 20:48:43 · 1072 阅读 · 0 评论 -
OpenGL 深度测试
深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。原创 2023-06-19 20:17:42 · 877 阅读 · 0 评论 -
OpenGL模型加载
网格(Mesh)代表的是单个的可绘制实体。一个网格应该至少需要一系列的顶点,每个顶点包含一个位置向量、一个法向量和一个纹理坐标向量。一个网格还应该包含用于索引绘制的索引以及纹理形式的材质数据(漫反射/镜面光贴图)。//位置//法向量//纹理坐标//纹理ID//类型//路径public:private:private://创建VBO和VAO对象,并赋予ID//绑定VBO和VAO对象//为当前绑定到target的缓冲区对象创建一个新的数据存储。原创 2023-06-17 12:18:32 · 880 阅读 · 1 评论 -
OpenGL 光照贴图
现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成。想想一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那么有光泽,所以它没有镜面高光,轮毂非常闪亮。2.漫反射贴图用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值,它是一个表现了物体所有的漫反射颜色的纹理图像。这次我们会将纹理储存为Material结构体中的一个sampler2D。我们将之前定义的vec3漫反射颜色向量替换为漫反射贴图。原创 2023-06-11 13:21:59 · 1350 阅读 · 0 评论 -
OpenGL 材质实现
在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射,因而产生较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的高光点。如果我们想要在OpenGL中模拟多种类型的物体,我们必须针对每种表面定义不同的材质(Material)属性。环境光照(Ambient Lighting)漫反射光照(Diffuse Lighting)镜面光照(Specular Lighting)原创 2023-06-11 12:52:38 · 981 阅读 · 0 评论 -
OpenGL 冯氏光照模型
环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子。环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。原创 2023-06-11 11:00:30 · 862 阅读 · 0 评论 -
OpenGL 光照场景
我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的颜色。换句话说,那些不能被物体所吸收的颜色就是我们能够感知到的物体的颜色。例如,太阳光能被看见的白光其实是由许多不同的颜色组合而成的。如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有子颜色,不被吸收的蓝色光被反射到我们的眼中,让这个玩具看起来是蓝色的。下图显示的是一个珊瑚红的玩具,它以不同强度反射了多个颜色。当我们在OpenGL中创建一个光源时,我们希望给光源一个颜色,我们将光源设置为白色。原创 2023-06-10 10:25:12 · 236 阅读 · 0 评论 -
OpenGL 摄像机
OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。要定义一个摄像机,我们需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。获取摄像机位置很简单。摄像机位置简单来说就是世界空间中一个指向摄像机位置的向量。不要忘记正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。//摄像机位置这里指的是摄像机指向哪个方向。原创 2023-06-09 20:50:17 · 1157 阅读 · 0 评论 -
OpenGL 坐标系统
OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标。也就是说,每个顶点的xyz坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。局部空间(Local Space,或者称为物体空间(Object Space))世界空间(World Space)观察空间(View Space,或者称为视觉空间(Eye Space))裁剪空间(Clip Space)原创 2023-06-09 18:46:29 · 1169 阅读 · 0 评论 -
OpenGL 纹理
纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。原创 2023-06-05 20:16:05 · 1201 阅读 · 0 评论 -
OpenGL 着色器简介
着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。原创 2023-06-05 19:32:56 · 1089 阅读 · 1 评论 -
VAO、VBO、EBO简介
使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。GPU内的这块显存区域里是紧密连续的一个个数据,我们需要告诉OpenGL,从哪里到哪里是一个顶点的数据,从哪里到哪里是这个顶点的RGB值(如果有的话)等。同样,和VBO类似,我们会把这些函数调用放在绑定和解绑函数调用之间,只不过这次我们把缓冲的类型定义为GL_ELEMENT_ARRAY_BUFFER。我们使用的任何(在GL_ARRAY_BUFFER目标上的)缓冲调用都会用来配置当前绑定的缓冲(VBO)。原创 2023-06-04 13:55:09 · 1223 阅读 · 0 评论 -
OpenGL实现第一个窗口-三角形
此代码是基于Qt+OpenGL实现的,但是大部分的代码是OpenGL,Qt封装了一些类,方便使用。原创 2023-06-04 13:06:36 · 805 阅读 · 0 评论 -
OpenGL简介
一般它被认为是一个API,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由OpenGL库的开发者自行决定(这里开发者是指编写OpenGL库的人)。OpenGL核心是一个C库,同时也支持多种语言的派生。GLFW解决操作系统层面的不同创建窗口定义上下文处理用户输入。原创 2023-06-04 11:14:48 · 1761 阅读 · 0 评论