![](https://img-blog.csdnimg.cn/16b496f9fed94214b8be755855589914.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OpenGL
文章平均质量分 78
函数介绍
Elsa的迷弟
在珠海西山居、北京点点互动实习过。
目前在北京点点互动实习。
展开
-
骨骼蒙皮动画的一个简单版本实现(转载)
转载:https://www.cnblogs.com/tupx/articles/3006051.html。转载 2024-07-23 15:23:04 · 16 阅读 · 0 评论 -
Assimp库模型导入结构
此外,还可能有一系列的骨骼,每个骨骼都有一定权重的多个顶点。顶点数据在通道中呈现,每个通道包含单个顶点信息,例如一组纹理坐标或一个法向量。如果数据指针不为空,则存在相应的数据流。:来自加载器的提示,使应用程序更容易确定嵌入的压缩纹理的类型。(包含完美的镜子反射的颜色。标志,可以将具有多个基本类型的网格划分为同质子网格。,没有纹理,但是值被用作’纹理语义’),此处不讨论设置纹理信息的细节。(灯光贴图纹理,又名环境遮挡),用于导入模型,导入的模型存储在。:纹理的高度,以像素为单位。,以及各类型数据结构的。原创 2023-06-10 16:09:43 · 1166 阅读 · 0 评论 -
QT With OpenGL(SSAO)(Screen-Space Ambient Occlusion)
当采样点像素深度(物体边缘)大于等于检测点深度(空心圈),说明该点未遮蔽了渲染点的环境光照,Occlusion遮蔽值增加。,需要将G_Buffer提供的位置深度信息统一为视口坐标下的位置深度信息。注:深度的范围不能局限在【0,1】,所以需要设置纹理数据类型为。不同,延迟渲染需要的信息为视口角度下物体的世界坐标信息。若渲染(0,0)像素点,随机转动核心纹理为(0,0)点。角度下看到的物体的视口坐标信息和深度,这与之前做。得到未遮蔽系数,再用1减去,得到遮蔽系数。)像素点,随机转动核心纹理为(原创 2023-05-09 22:25:03 · 911 阅读 · 3 评论 -
QT with OpenGL(IBL-镜面反射)
注意:开启该选项后,并不是对纹理做模糊,而是当指向像素边界时,会根据边界临近的纹理像素做插值。如果一个采样点覆盖率为16个像素,则应该在第2层mipmap上采样;mipmap每加1层,纹理大小就缩小一半,每四个像素合成一个像素。如果一个采样点覆盖率为4个像素,则应该在第1层mipmap上采样;指向立方体贴图,每个单位立体角向量指向的贴图像素数也是不同的。可以很大程度上改变效果,将更多的采样权值放在中心采样区。向量指向立方体贴图边角位置,该方向的像素数会偏多。,我们看到的边界结果才是纹理中真正存储的像素值。原创 2023-04-25 20:41:37 · 585 阅读 · 0 评论 -
IBL-镜面反射(LUT篇)
首先我们将镜面反射部分的积分分割为两个部分。Lopωo∫ΩLipωidωi∗∫Ωfrpωiωon⋅ωidωi的积分即为预滤波,将所有照到该像素点的光照求积分。∫ΩLipωidωi需要我们知道,这个半球的光线照过来之后,有多少反射到了ωi所在的方向。LUT求解的便是,在夹角cosθN⋅ωi,粗糙度为roughness下,BRD。原创 2023-04-25 13:43:10 · 311 阅读 · 0 评论 -
IBL-镜面反射(预滤波篇)
由于我们在卷积环境贴图时事先不知道视角方向,因此 Epic Games 假设视角方向——也就是镜面反射方向——总是等于输出采样方向ωo,以作进一步近似。OpenGL 可以启用 GL_TEXTURE_CUBE_MAP_SEAMLESS,以为我们提供在立方体贴图的面之间进行正确过滤的选项。我们已经进行了大量的采样,但是在某些环境下,在某些较粗糙的 mip 级别上可能仍然不够,导致明亮区域周围出现点状图案。这样确实得到了一定程度的近似,尤其在正对物体法线时的高光效果会接近真实。观察1-7的分布,可以看到为。原创 2023-04-12 17:26:50 · 675 阅读 · 0 评论 -
QT with OpenGL(IBL-漫反射辐照)
因为只引入了漫反射辐照,没有引入镜面反射,故只有Kd量有效。当物体金属度越高时,或越接近90度视角时,kd量越小。因此金属度越高,漫反射量越少,在图像中表现的越暗。横坐标粗糙度只对镜面反射的反射范围有关,与漫反射无关,故横坐标方向的7个圆形并无变化。原创 2023-03-29 17:31:27 · 405 阅读 · 0 评论 -
天空图立方体贴图转化为辐照度立方体贴图
可以看出,对于辐照度贴图的每一个纹理点,都需要大量的采样点计算。如果采样点过大,或渲染纹理点较多,则会导致程序运行结果变慢的结果。一般情况下,为了程序运行速度提高,采用直接载入辐照度贴图的方法来加快程序运行。原创 2023-03-29 14:36:06 · 208 阅读 · 0 评论 -
等距柱状投影图到立方体贴图的转化
在QT中使用QImage载入的图片只能载入.jpg.png等常用图片格式,无法载入辐射度HDR图片。因此使用std_image文件载入图片。原创 2023-03-28 20:30:37 · 652 阅读 · 3 评论 -
《OpenGL宝典》--纹理
正常情况,我们只会在0.0~1.0之间指定纹理坐标,如果纹理坐标在此范围外,OpenGL会根据采样器对象中指定的当前纹理环绕模式方式进行设置。使用的是未归一化的坐标直接访问纹理中的纹素,不执行任何形式的过滤和插值操作,坐标范围为实际载入纹理图像的宽和高。使用如下函数开辟纹理空间时,设置levels的值将确定该纹理有多少层。每个纹理都有一个默认采样参数,当没有采样器对象绑定到相应纹理时,则将使用默认采样参数。2D数组纹理的层之间不能进行过滤操作(线性过滤等),但2D数组纹理拥有比3D纹理更大的空间。原创 2023-03-07 16:59:57 · 1407 阅读 · 2 评论 -
《OpenGL宝典》--统一变量
若设置layout,则不需要使用来获取统一变量的位置使用glUniform*传递值,设置矩阵统一变量。原创 2023-03-01 13:33:46 · 311 阅读 · 0 评论 -
QT With OpenGL(延时着色法)(Deferred Shading)
延迟渲染一直被称赞的原因就是它能够渲染大量的光源而不消耗大量的性能。然而,延迟渲染它本身并不能支持非常大量的光源,因为我们仍然必须要对场景中每一个光源计算每一个片段的光照分量。frag去除光照部分。...原创 2022-08-13 21:23:41 · 571 阅读 · 0 评论 -
QT With OpenGL(泛光)(Bloom)
使用调用显式告知OpenGL渲染到多个颜色缓冲。3. 将HDR帧缓存渲染到屏幕,并可切换查看颜色缓冲1、2提取高光效果并没有想象中的好,按照直觉,应该只提取发光物的高光效果,但是环境中也出现了大量提取点。且,若背对光源(发光面不可见,但发光物体可见),则不会出现泛光现象,与想象中不同。高斯函数的这两个性质都给我们提供了优化的空间。引用GPU硬件加速,使用GPU双线性滤波器优化图解垂直过滤一次:红色色块的颜色为上下5个色块颜色的加权和使用代码(2)使用两个FBO注意再resizeGL原创 2022-08-06 22:45:31 · 531 阅读 · 0 评论 -
QT with OpenGL(HDR)
借鉴自 https://www.bilibili.com/read/cv11765941/一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的。显示器被限制为只能显示值为0.0到1.0间的颜色,但是在光照方程中却没有这个限制。通过使片段的颜色超过1.0,我们有了一个更大的颜色范围,这也被称作HDR(High Dynamic Range, 高动态范围)。有了HDR,亮的东西可以变得非常亮,暗的东西可以变得非常暗,而且充满细节。HDR渲染允许用更大范围的颜色值转载 2022-08-02 12:11:37 · 703 阅读 · 0 评论 -
第二十四课、二十五课,高级光照(blinn),Gamma矫正
未使用gamma使用gamma看出使用gamma后效果不如未使用,原因应该是,模型本身的颜色属性是已经经过了gamma矫正,所以如果经过了两次gamma矫正画面偏白。解决方法在进行物理颜色值计算之前,先进行gamma反矫正,再在渲染是执行gamma矫正。//反gammavec3diffusecolor=vec3(texture2D(material.texture_diffuse1,TexCoords));使用纹理gamma反矫正后使用gammahttps。......原创 2022-07-30 17:11:57 · 229 阅读 · 0 评论 -
第二十三课,抗锯齿(Anti Aliasing)
使用Uniform将多重采样纹理导入着色器使用texelFetch获取每个子样本的颜色值//第4个子样本。原创 2022-07-30 11:19:38 · 2322 阅读 · 0 评论 -
第二十二课,实例化(instancing)
对于拥有同一模型数据的物体(例如草),每一帧需要渲染成百上千的实例,这些渲染几乎可以瞬间完成,但是上千个渲染函数的调用却会造成极大的性能影响。或函数告诉GPU去绘制你的顶点数据会消耗更多的性能,因为()。所以,即便渲染顶点非常快,命令GPU去渲染却未必。如果我们能够,然后使用一个绘制函数让OpenGL利用这些数据绘制多个物体,就会更方便了。这就是。...原创 2022-07-29 19:21:30 · 339 阅读 · 0 评论 -
QT with OpenGL(Shadow Mapping)(平行光篇)
glwidget.h在中,使用了,。但由于QT封装的类不支持深度贴图的导出(好像无法提取出深度贴图),因此需要使用纹理颜色来代表深度值。故不能使用,。若要使用,原创 2022-07-24 23:55:14 · 698 阅读 · 4 评论 -
第二十一课,几何着色器(使用篇-法向量可视化)
法向量可视化绘制物体绘制物体法向量VS#version 450 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;out VS_OUT { vec3 normal;} vs_out;uniform mat4 projection;uniform mat4 view;uniform mat4 model;void main(){ gl_Position =原创 2021-11-12 22:33:35 · 1480 阅读 · 0 评论 -
第二十一课,几何着色器(使用篇-爆破效果)
爆破效果原理:将每一个片元沿三角形法向量方向移动一段距离核心代码 + 避坑点:.vert#version 450 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;layout (location = 2) in vec2 aTexCoords;uniform mat4 model;uniform mat4 view;uniform mat4 projection;//out原创 2021-11-12 21:45:16 · 702 阅读 · 0 评论 -
第二十一课,几何着色器(基础篇)
几何着色器的作用输入输入类型从顶点着色器接收下列任何一个图元值:类型数组大小points:绘制GL_POINTS图元时。1lines:绘制GL_LINES或GL_LINE_STRIP时2lines_adjacency:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY4triangles:GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN3triangles_adjacen原创 2021-11-06 01:08:34 · 1946 阅读 · 0 评论 -
第二十课,高级GLSL
内建变量已知gl_Position 顶点着色器的裁剪空间输出位置向量FragColor 片元着色器的片元输出颜色值未知顶点着色器变量gl_PointSizeGLSL定义了一个叫做gl_PointSize输出变量,它是一个float变量,你可以使用它来设置点的宽高(像素)。在顶点着色器中修改点大小的功能默认是禁用的,启用它需要:glEnable(GL_PROGRAM_POINT_SIZE);我们可以通过OpenGL的glPointSize函数来设置渲染出来的点的大小void g原创 2021-11-03 21:57:06 · 561 阅读 · 0 评论 -
第十九课,高级数据(数据存储)
以下为一些对数据存储原理的自我推断,如有错误,还请指正。数据原理数据定义命名一个unsigned int类型变量GLuint VBO,EBO,VAO;将EBO定义为gpu内存中的数据区块地址。glGenBuffers(1, &EBO);将VAO定义为GPU中的属性块地址glGenVertexArrays(1, &VAO);以上这些都将存储在GPU内存块,而运行时需要将缓冲绑定为当前运行缓冲。缓冲绑定为当前运行缓冲glBindVertexArray(VAO);g原创 2021-10-24 11:28:36 · 127 阅读 · 0 评论 -
第十八课,立方体贴图(环境映射)
使用立方体贴图,还可以给物体反射和折射的属性。反射片元着色器#version 450 coreout vec4 FragColor;in vec3 Normal;in vec3 Position;uniform vec3 cameraPos;uniform samplerCube skybox;void main(){ vec3 I = normalize(Position - cameraPos);//计算入射光线方向 vec3 R =原创 2021-10-23 02:04:04 · 421 阅读 · 0 评论 -
第十八课,立方体贴图(加载天空盒)
原理我在这里不再过多叙述,主要从代码的运行方向来解读立方体贴图添加天空盒顶点float skyboxVertices[] = { // positions -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,原创 2021-10-20 01:04:37 · 395 阅读 · 0 评论 -
第十七课,帧缓存(后期处理)
反向void main(){ FragColor = vec4(vec3(1.0 - texture(screenTexture, TexCoords)), 1.0);}灰度均分灰度void main(){ FragColor = texture(screenTexture, TexCoords); float average = (FragColor.r + FragColor.g + FragColor.b) / 3.0;//取所有的颜色分量,将它们平均化原创 2021-10-17 20:42:17 · 1351 阅读 · 0 评论 -
第十七课,帧缓存(创建和使用方法)
OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。创建一个帧缓冲1.创建一个帧缓冲对象(Framebuffer Object, FBO)创建语法同VAO,VBO。unsigned int fbo;glGenFramebuffers(1, &fbo);glBindFramebuffer(GL_FRAMEBUFFER, fbo);//绑定GL_FRAMEBUFFER绑定后所有的读取和写入帧缓冲的操作将会影响当前绑定的帧缓冲glB原创 2021-10-17 17:46:54 · 850 阅读 · 0 评论 -
第十六课,面剔除
使用OpenGL的面剔除选项,它默认是禁用状态glEnable(GL_CULL_FACE);直接运行后,我们发现正方体的部分面确实被剔除了,但是却不是背向面,这是因为我们定义的正方体并不是严格遵循逆时针顺序定义的。原理详见教程,这里就不过多叙述。将正方体各面都改为逆时针顺序后float vertices[] = { // Back face -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // Bott原创 2021-10-16 11:22:34 · 172 阅读 · 0 评论 -
第十五课,混合
丢弃片段将透明度小于一定阈值的片段完全丢弃。vec4 texColor = texture(texture1, TexCoords);if(texColor.a < 0.1) discard;FragColor = texColor;discard将该点颜色完全丢弃。注意,当采样纹理的边缘的时候,OpenGL会对边缘的值和纹理下一个重复的值进行插值(因为我们将它的环绕方式设置为了GL_REPEAT。这通常是没问题的,但是由于我们使用了透明值,纹理图像的顶部将会与底部边缘的纯色值进原创 2021-10-15 01:57:04 · 132 阅读 · 0 评论 -
第十四课,模板测试
当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,会丢弃片段,被保留的片段会进入深度测试。即,模板测试是在深度测试之前对片段(三角形各个点)的丢弃操作。模板缓冲(Stencil Buffer)模板测试是根据模板缓冲来进行的,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。模板缓冲首先会被清除为0,之后在模板缓冲中使用1填充了一个空心矩形。场景中的片段将会只在片段的模板值为1的时候会被渲染(其它的都被丢弃了)。原创 2021-10-10 23:55:04 · 226 阅读 · 0 评论 -
第十三课,深度测试
开启深度测试glEnable(GL_DEPTH_TEST);清除深度缓存glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);深度测试函数OpenGL允许我们禁用深度缓冲的写入,只需要设置它的深度掩码(Depth Mask)设置为GL_FALSE就可以了:glDepthMask(GL_FALSE);注意这只在深度测试被启用的时候才有效果。注:这通常在深度缓存中已经存储了部分的数据时开启,且存储的数据不想被正在后来的数据替代。OpenGL原创 2021-10-10 22:38:13 · 303 阅读 · 0 评论 -
第十二课,assimp模型加载(绘制篇)
首先创建模型渲染管线Shader ourShader("1.model_loading.vs", "1.model_loading.fs");vertexShader#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;layout (location = 2) in vec2 aTexCoords;out vec2 TexCoords;uniform mat4原创 2021-10-05 15:29:06 · 403 阅读 · 0 评论 -
第十二课,assimp模型加载(数据加载篇)
大佬讲解入口OpenGL学习脚印:模型加载初步-加载obj模型(load obj model) ,作者:The foolOpenGL学习脚印-AssImp模型加载 ,作者:The fool原创 2021-10-03 19:49:52 · 3979 阅读 · 1 评论 -
第十二课,assimp模型加载(配置篇)
首先复制粘贴Model.h及Mesh.h两个类https://learnopengl.com/code_viewer_gh.php?code=includes/learnopengl/mesh.hhttps://learnopengl.com/code_viewer_gh.php?code=includes/learnopengl/model.h在主函数中引入模型类#include "Model.h"//模型载入类报错解决:问题:****已有主题****未声明标识符重定义无法解析函数重原创 2021-10-01 00:02:29 · 904 阅读 · 1 评论 -
第十一课,OpenGL光照之投光物
1.平行光平行光,即光线方向为定值。在点光源中,我们通过 lightDir = normalize(light.position.xyz - FragPos);来确定光线照射角度,而在平行光中lightDir(光照角度)是给定的,故我们只需要用给定的光照角度即可。但是我们如何判定一个光源是平行光还是点光源呢?我们已知:平行光是一个方向向量,点光源是一个位置向量。平行光可以改变方向,而不可以移动。点光源可移动。故如果我们对世界坐标所有对象做一次旋转,则用一个旋转矩阵 乘 平行光可改变平行光照射方向原创 2021-09-21 19:46:35 · 429 阅读 · 0 评论 -
第十课,OpenGL光照之贴图
光照贴图光照贴图,及使用纹理代替物体颜色,物体的实际颜色由物体材质和光照决定。漫反射贴图使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。方式1 将纹理传入GLuint texture1 = loadTexture("./container2.png");//加载纹理lightShader.setInt("material.sampler", 0);//将着色器中采样器分配到GL_TEXTURE0纹理单元glActiveTexture(GL_TEXTURE0);glBindTex原创 2021-08-30 11:43:13 · 454 阅读 · 0 评论 -
第九课,OpenGL光照之材质
物体材质在冯氏模型中,一个物体的材质由:全局光照系数,漫反射光照系数,反射光照系数,反射高光半径系数决定。分别由:ambient,diffuse,specular,shininess表示。材质系数The numbersNameAmbientDiffuseSpecularShininessemerald0.0215 0.1745 0.02150.07568 0.61424 0.075680.633 0.727811 0.6330.6jade0.135 0.原创 2021-08-29 11:36:45 · 288 阅读 · 0 评论 -
第八课,OpenGL光照之基本光照
冯氏光照模型(Phong Lighting Model)环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。镜面光照(Specular Lightin原创 2021-08-28 18:29:27 · 659 阅读 · 0 评论 -
第七课,OpenGL之glfw回调函数
常用回调函数GLFWkeyfun glfwSetKeyCallback (GLFWwindow *window, GLFWkeyfun callback)callback:: GLFWcharfun glfwSetCharCallback (GLFWwindow *window, GLFWcharfun callback)GLFWcharmodsfun glfwSetCharModsCallback (GLFWwindow *window, GLFWcharmodsfun callback原创 2021-08-21 05:03:27 · 2400 阅读 · 0 评论 -
第七课,OpenGL之摄像机类
类参数private: glm::vec3 cameraPosi; glm::vec3 cameraFocus; glm::vec3 cameraUp; glm::vec3 dirZ;//正向 glm::vec3 dirX;//右向 glm::vec3 dirY;//上方定义cameraPosi,cameraFocus,及cameraUp可以确定摄像机的初始位置。dirX,Y,Z分别表示摄像机的三个坐标方向。类函数声明基本函数 //构造函数 camera(); //向视角前后移原创 2021-08-21 04:22:09 · 654 阅读 · 2 评论