OpenGL
文章平均质量分 89
浅慕Antonio
分享编程知识
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【OpenGL】openGL 法线贴图
本文介绍了法线贴图的核心原理与实现方法。法线贴图通过RGB值存储表面法线信息(0-1映射到-1-1),其蓝色调源于法线通常指向曲面外侧。关键难点在于将切线空间法线转换到模型空间,这需要构建由切线(T)、副切线(B)和法线(N)组成的TBN矩阵。文章详细推导了通过三角形边和UV差值计算切线与副切线的数学过程,并提供了C++实现代码。在着色器实现部分,需新增切线和副切线缓冲区,通过TBN矩阵的转置完成空间转换。文末给出了完整的绘制代码框架,包括缓冲区创建、纹理加载和矩阵计算等关键步骤。原创 2025-09-21 22:47:17 · 811 阅读 · 0 评论 -
【OpenGL】openGL 透明
本文介绍了OpenGL中透明效果的实现方法。首先讲解了alpha通道的概念,指出alpha值代表不透明度(1为不透明,0为透明),并演示了如何通过修改着色器输出实现透明效果。接着重点讨论了透明渲染的顺序问题,指出当多个半透明物体重叠时,渲染顺序会影响最终颜色表现。常见解决方案包括对透明物体按深度排序后渲染,但这种方法存在性能问题。文章还介绍了更高级的顺序无关透明技术,如深度剥离等。最后给出了混合函数的设置方法和完整实现代码,包括顶点着色器、片段着色器和Qt框架下的OpenGL组件代码。原创 2025-09-21 19:26:22 · 1081 阅读 · 0 评论 -
【OpenGL】openGL VBO 索引
本文介绍了OpenGL中使用索引缓冲(VBO Indexing)的原理和实现方法。主要内容包括: 索引原理:通过索引缓冲实现顶点复用,避免重复存储公共顶点,每个三角形通过3个整数索引指向属性缓冲中的顶点数据。 公共顶点处理:当顶点所有属性在两个三角形中都相同时才视为公共顶点,否则需要复制顶点属性。特别以法线为例说明了平滑曲面和硬边处理的不同方式。 实现方法: 创建ELEMENT_ARRAY_BUFFER存储索引 使用glDrawElements代替glDrawArrays 提供索引缓冲填充算法,将多个属性索原创 2025-09-21 19:24:00 · 856 阅读 · 0 评论 -
【OpenGL】openGL 基本着色
本文介绍了OpenGL中基础光照模型的实现。首先讲解了法线向量的概念,包括三角形法线和顶点法线的计算方法,以及在OpenGL中的使用方式。接着重点阐述了漫反射光照分量的原理,通过计算光线与表面法线的夹角来模拟光强变化,并加入了材质颜色和光源强度的影响。随后引入环境光分量来模拟间接光照效果。最后简要提及镜面反射分量,为后续高级着色技术做铺垫。教程通过伪代码和渲染效果图展示了不同光照分量的实现方法和视觉效果,为初学者构建了基本的光照模型框架。原创 2025-09-21 19:21:00 · 1261 阅读 · 0 评论 -
【OpenGL】texture 纹理
本文介绍了在OpenGL中使用纹理贴图的方法。首先讲解了UV坐标的概念,它是连接模型顶点与纹理图像的桥梁,每个顶点需要包含U、V两个纹理坐标。接着介绍了如何通过QT库加载BMP格式的纹理图片,并处理OpenGL与QT坐标系差异的问题。在OpenGL实现部分,详细说明了片段着色器和顶点着色器中处理纹理的代码逻辑,包括纹理采样器的使用和UV坐标的传递。最后展示了如何为立方体模型添加纹理坐标数据,并完成纹理缓冲对象的创建与绑定。文章还提及了纹理加载和过滤的相关技术细节,为OpenGL初学者提供了完整的纹理贴图实现原创 2025-09-20 23:29:16 · 1000 阅读 · 0 评论 -
【OpenGL】绘制彩色立方体
本教程介绍了使用OpenGL绘制彩色立方体的方法。首先将一个立方体分解为12个三角形(36个顶点),通过顶点缓冲区定义这些顶点数据。接着为每个顶点随机生成RGB颜色值,创建颜色缓冲区并绑定到着色器。在顶点着色器中接收颜色属性并传递给片段着色器,最终实现立方体的彩色渲染效果。教程还指出了当前方法的不足:顶点数据重复占用内存,并预告后续课程将介绍动态加载模型和顶点索引优化技术。通过修改顶点和颜色数据,可以灵活控制立方体的外观。原创 2025-09-20 23:26:41 · 886 阅读 · 0 评论 -
【OpenGL】openGL常见矩阵
本文介绍了3D图形学中的齐次坐标和变换矩阵。齐次坐标通过引入w分量区分点(w=1)和方向(w=0),使平移变换对方向无效。变换矩阵采用4x4矩阵左乘顶点实现,包括平移矩阵、单位矩阵和缩放矩阵。平移矩阵通过在第四列设置位移量实现位移;单位矩阵保持向量不变;缩放矩阵通过对角线元素控制各轴缩放比例。文章提供了C++(GLM)、QT和GLSL中的矩阵运算代码示例,强调矩阵运算顺序的重要性。原创 2025-09-20 23:12:47 · 1171 阅读 · 0 评论 -
【OpenGL】shader 着色器
OpenGL着色器编程入门摘要:本文介绍了OpenGL可编程管线中的着色器基础。现代OpenGL需要两个基本着色器:顶点着色器(处理每个顶点)和片段着色器(处理每个采样点)。着色器使用GLSL语言编写,运行时动态编译。文章详细展示了如何从文件加载着色器代码(.vert和.frag文件)、编译着色器、创建着色器程序并链接的过程。顶点着色器示例演示了GLSL 3.3核心语法,通过layout声明输入顶点位置属性。编译完成后可删除中间着色器对象以释放资源。这些操作为后续图形渲染管线奠定了基础。原创 2025-09-20 22:56:02 · 1327 阅读 · 0 评论 -
【OpenGL】绘制第一个三角形
本文介绍了在QT5环境下使用OpenGL绘制第一个三角形的步骤。主要内容包括: 环境配置:通过CMake配置QT5和OpenGL库,链接必要的库文件。 窗口创建:继承QOpenGLWidget实现自定义OpenGL窗口,重写initializeGL、paintGL和resizeGL三个关键函数,完成OpenGL初始化、绘制和窗口尺寸调整。 绘制三角形: 使用顶点数组对象(VAO)和顶点缓冲对象(VBO)存储三角形顶点数据 讲解OpenGL的屏幕坐标系和顶点定义 通过glDrawArrays绘制三角形 完整代原创 2025-09-20 22:55:06 · 702 阅读 · 0 评论 -
【QOpenGL】摄像机
OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。要定义一个摄像机,我们需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。上面第二张图,可以看出正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。方法中,无需手动计算,只需要指定摄像机的位置、摄像机朝向的位置以及摄像机的上轴即可,会自动算出右轴和。矩阵,摄像机的位置随着时间绕着。原创 2025-05-18 23:40:45 · 732 阅读 · 0 评论 -
【QOpenGL】3D练习
本文介绍了三个关于3D渲染的练习题的实现过程。首先,通过调整透视投影中的Fov和ratio参数,探讨了它们如何影响平截头体的形状和渲染范围。其次,通过移动观察矩阵,观察了场景在不同方向上的变化,进一步理解了观察矩阵作为摄像机对象的作用。最后,通过模型矩阵实现了仅让特定箱子旋转的效果,展示了如何通过条件判断控制不同物体的行为。这些练习帮助加深了对3D渲染中关键概念的理解,如平截头体、观察矩阵和模型矩阵的应用。更多相关资料可参考提供的GitHub链接。原创 2025-05-18 23:38:48 · 426 阅读 · 0 评论 -
【QOpenGL】开始3D
本文介绍了如何使用OpenGL和GLSL实现多个3D正方体的绘制、旋转、位移以及正交投影和透视投影操作。通过定义模型矩阵、视图矩阵和投影矩阵,实现了三维顶点变换。正交投影保持物体大小不变,而透视投影则模拟人眼视角,产生近大远小的效果。文章详细讲解了投影矩阵的设置方法,并提供了顶点数据的准备和GLSL代码实现。最终展示了不同投影方式下的渲染效果,透视投影能够更好地体现场景的深度层次感。原创 2025-05-18 23:36:01 · 1079 阅读 · 0 评论 -
【QOpenGL】缩放、位移与旋转
本文介绍了如何通过OpenGL实现图形的缩放、位移和旋转操作。首先,在顶点着色器中引入uniform类型的矩阵变量mat4,通过矩阵乘法实现顶点坐标的变换。接着,在CPU端使用QMatrix4x4创建矩阵,并通过QElapsedTimer和sin函数实现周期性的缩放和旋转效果。缩放通过scale函数实现,旋转通过rotate函数实现,并结合位移函数translate调整图形位置。最后,文章提供了完整的代码实现,包括顶点着色器、矩阵创建、定时器设置以及周期变化的实现细节。通过这些步骤,成功实现了图形的动态变换原创 2025-05-18 23:31:15 · 1047 阅读 · 0 评论 -
【QOpenGL】纹理练习
本文介绍了四个与纹理相关的OpenGL练习。首先,通过反转顶点着色器中的s坐标,使雪狸图案朝向相反方向。接着,通过修改纹理坐标和设置GL_REPEAT或GL_MIRRORED_REPEAT环绕方式,实现了纹理的重复和镜像效果。然后,通过缩小纹理坐标范围并使用GL_NEAREST过滤方式,展示了单个像素的清晰效果。最后,通过动态调整mix函数的alpha值,实现了两个纹理可见度的动态变化,并通过键盘事件控制其变化。这些练习展示了OpenGL中纹理处理的基本操作和灵活应用。原创 2025-05-18 23:28:25 · 459 阅读 · 0 评论 -
【QOpenGL】纹理缩放
本文介绍了两种纹理缩放策略的实现:GL_NEAREST(最近邻插值)和GL_LINEAR(双线性插值)。GL_NEAREST通过选择离采样点最近的纹理像素来快速处理纹理,但放大时会产生锯齿状边缘,适合像素艺术风格。GL_LINEAR则通过加权平均周围四个像素的颜色,生成平滑的纹理效果,但可能引入轻微模糊,适合需要高质量视觉效果的场景。文章详细说明了两种策略的原理、特点及实现步骤,并通过代码展示了如何在OpenGL中设置纹理过滤方式,最终对比了两种策略的视觉效果。原创 2025-05-18 23:26:14 · 524 阅读 · 0 评论 -
【QOpenGL】纹理包裹
文章摘要:本文介绍了如何在OpenGL中设置纹理模式,并在图像边缘添加边框。首先,通过GLSL编写顶点着色器和片段着色器,片段着色器中新增了texture2变量用于接收纹理单元。接着,准备顶点数据,确保纹理坐标稍大于顶点坐标以实现填充效果。在CPU端,通过绑定纹理对象并设置边框颜色,使用原生OpenGL方法或QT封装的方法实现边框效果。最后,提供了整体代码结构,包括头文件和实现文件,展示了如何初始化OpenGL环境、处理顶点数据以及管理纹理对象。原创 2025-05-18 23:24:51 · 773 阅读 · 0 评论 -
【QOpenGL】纹理texture
本文介绍了如何在OpenGL中实现纹理贴图效果。首先,纹理是贴在3D物体表面的图片,用于增强物体表面的真实感。由于QT坐标系与OpenGL坐标系相反,读取图片后需进行镜像翻转。实现流程包括编写GLSL代码,顶点着色器接收纹理坐标并传递给片段着色器,片段着色器通过texture函数生成片段颜色。纹理计算支持乘法与融合操作。在CPU端,通过QOpenGLTexture管理纹理对象,并在paintGL函数中启用纹理对象。整体代码展示了如何通过顶点数据、着色器程序和纹理对象实现贴图效果。原创 2025-05-18 23:23:10 · 1313 阅读 · 0 评论 -
【QOpenGL】更多属性
本文介绍了如何在OpenGL中使用顶点着色器和片段着色器生成一个彩色矩形。首先,顶点着色器接收顶点的位置和颜色数据,并将颜色数据传递给片段着色器。在光栅化阶段,OpenGL对顶点颜色进行插值,使得图元内部的颜色平滑过渡。片段着色器接收插值后的颜色并输出最终颜色。实现过程中,顶点着色器和片段着色器的GLSL代码分别处理位置和颜色数据,顶点数据包括坐标和颜色信息。通过绑定和启用顶点属性,将数据传入着色器,最终渲染出彩色矩形。原创 2025-05-18 23:20:07 · 749 阅读 · 0 评论 -
【QOpenGL】uniform介绍
本文介绍了如何使用uniform变量在OpenGL中实现一个随时间变化颜色的矩形。首先,uniform变量是GLSL中的一种全局只读变量,用于在CPU和GPU之间传递数据,并在整个图元处理过程中保持不变。通过顶点着色器和片段着色器,可以分别对顶点位置和颜色进行控制。在实现过程中,使用QTimer和QElapsedTimer设置定时器,并通过sin函数生成连续变化的颜色值,最终通过setUniformValue函数将颜色值传递给片段着色器。整体代码展示了如何在Qt框架下实现这一功能,包括初始化、着色器编译、顶原创 2025-05-18 23:17:29 · 641 阅读 · 0 评论 -
【QOpenGL】layout介绍
本文介绍了在OpenGL中如何指定顶点着色器的layout,并探讨了代码中的layout与着色器中的关系。首先,layout通常直接在GLSL中指定,然后在代码中通过glEnableVertexAttribArray等函数使用。其次,可以通过attributeLocation动态获取着色器中输入变量的layout位置。此外,如果GLSL中没有指定layout,可以在代码中通过bindAttributeLocation延迟指定,但必须在链接程序之前完成。最后,文章提供了一个完整的代码示例,展示了如何在Qt中使原创 2025-05-18 23:16:01 · 970 阅读 · 0 评论 -
【QOpenGL】GLSL in、out
在OpenGL中,通过修改顶点着色器和片段着色器的in、out变量,可以实现颜色的调整。顶点着色器接收顶点数据并输出颜色信息,而片段着色器则接收这些颜色信息并输出最终的渲染结果。具体流程包括:顶点着色器通过gl_Position输出顶点位置,并通过out变量传递颜色信息;片段着色器通过in变量接收颜色信息,并输出最终颜色。通过这种方式,可以轻松实现颜色的修改,例如将颜色设置为红色或通过乘法操作调整颜色亮度。这一过程展示了OpenGL渲染管线中顶点着色器与片段着色器之间的数据传递与处理机制。原创 2025-05-14 01:24:06 · 978 阅读 · 0 评论 -
【QOPenGL】Shader代码封装
本文介绍了如何通过资源文件引入shader源码,以减少代码量并简化着色器配置流程。首先,将顶点着色器和片段着色器的源码分别存储在source.vert和source.frag文件中,并通过qrc资源文件系统进行管理。接着,使用QOpenGLShaderProgram类提供的addShaderFromSourceFile方法加载着色器源码,并自动完成编译和链接过程。相较于手动编写着色器配置代码,该方法简化了流程,减少了代码量,且由Qt框架自动管理编译结果的生命周期。最后,通过bind方法绑定着色器程序,并在p原创 2025-05-14 01:21:22 · 1121 阅读 · 0 评论 -
【QOpenGL】UI 封装
本文介绍了在Qt中使用OpenGL进行图形绘制的实现过程,重点围绕OpenGL上下文的管理和UI功能的封装展开。首先,文章概述了在EBO绘制矩形的基础上,封装了UI界面和窗口对象,新增了绘制矩形、线框渲染和清空图形等功能。接着,详细解释了OpenGL上下文的概念及其在跨平台兼容、资源管理和硬件抽象中的重要性,并介绍了上下文的关键组成部分,如状态机、资源池和渲染管线。随后,文章深入探讨了Qt中makeCurrent()和makeDone()方法的作用,分别用于绑定和解绑OpenGL上下文,并提供了多线程和单窗原创 2025-05-13 01:08:28 · 944 阅读 · 0 评论 -
【QOPenGL】VAO绘制两个三角形
本文介绍了如何使用OpenGL绘制两个不同颜色的三角形。首先,通过VAO和VBO的绑定规则,分别配置了两个三角形的顶点数据。接着,编写了顶点着色器和两个不同的片段着色器,分别用于控制两个三角形的颜色。然后,创建并链接了着色器程序,确保每个三角形使用不同的着色器。最后,在绘制函数中依次绑定VAO并使用相应的着色器程序,完成两个三角形的绘制。整个过程展示了如何通过VAO、VBO和着色器实现多个图形的独立绘制与着色。原创 2025-05-13 01:05:08 · 591 阅读 · 0 评论 -
【QOpenGL】EBO实现绘制矩形
本文介绍了如何在OpenGL中通过EBO(Element Buffer Object,索引缓冲对象)绘制矩形。EBO通过复用顶点索引减少重复数据的存储和传输,提升渲染效率并节省内存。在不使用EBO的情况下,绘制矩形需要6个顶点,而使用EBO后只需4个顶点即可完成绘制。文章详细说明了EBO的使用流程,包括EBO的申请、绑定、解绑及绘制步骤,并提供了完整的代码示例。通过EBO,开发者可以更高效地处理复杂图形的绘制任务。原创 2025-05-11 18:05:06 · 751 阅读 · 0 评论 -
【QOpenGL】VAO、VBO以及顶点着色器和片段着色器的实现
本文介绍了在QOpenGL窗口中绘制三角形的实现过程,重点讲解了VBO(顶点缓冲对象)和VAO(顶点数组对象)的作用及其协作流程。VBO用于存储顶点数据,提升渲染性能,而VAO则管理顶点数据的解析规则,简化配置流程。此外,文章还详细介绍了GLSL(OpenGL着色语言)的基础语法,包括数据类型、变量限定符和运算符等,并分别阐述了顶点着色器和片段着色器的功能与实现。顶点着色器负责处理顶点坐标变换和属性传递,片段着色器则计算像素的最终颜色。最后,文章简要提及了NDC(归一化设备坐标)的概念,作为图形渲染管线中的原创 2025-05-11 18:02:06 · 1495 阅读 · 0 评论 -
【QOpenGL】QOpenGL窗口显示
本文介绍了如何使用Qt框架实现一个简单的QOpenGL窗口。首先,通过引入QOpenGLWidget和QOpenGLFunctions_4_5_Core头文件,创建了一个自定义的OpenGL窗口类AXBOpenGLWidget,该类继承自QOpenGLWidget和QOpenGLFunctions_4_5_Core。接着,重写了三个核心函数:initializeGL用于初始化OpenGL函数指针,paintGL用于绘制图像并设置清屏颜色,resizeGL用于响应窗口大小变化(本文中未做处理)。最后,展示了完原创 2025-05-11 17:51:37 · 893 阅读 · 0 评论 -
【OpenGL】GLSL基础语法
用户可以自定义函数,函数定义包括返回类型、函数名、参数列表和函数体。// 自定义函数:计算两个向量的和。原创 2025-03-24 19:33:40 · 1039 阅读 · 0 评论
分享