- 博客(41)
- 收藏
- 关注
原创 【设计模式】单例模式(Singleton)
介绍单例模式(Singleton),主要是课上内容的笔记(应试与科普性质),部分细节还需自行了解,但是可以提供一个整体的理解
2025-10-20 19:25:32
1044
4
原创 【OpenGL】高级深度检测
简单介绍深度检测,DepthMask、线性深度值(LinearDepth),Z-Fighting(Z冲突),深度偏移(DepthOffset)
2025-10-16 16:17:40
1050
原创 【OpenGL】简单的渲染架构设计与封装
这篇文章介绍了一个基于OpenGL的3D渲染系统mini架构设计。作者从Object类出发,逐步构建了Material、Mesh、Light和Renderer等核心组件,实现了物体的变换控制、材质光照处理和渲染流程管理。该设计遵循Unity标准进行模型变换,采用冯氏光照模型处理材质效果,并封装了渲染器来简化绘制流程。最后通过创建两个具有不同材质的旋转球体,展示了该架构的具体使用方法。文章强调这是一个简化版本的学习框架,便于理解OpenGL渲染机制,代码结构清晰但功能有限,可作为进一步扩展的基础。
2025-09-27 16:37:35
1073
原创 【OpenGL】基础光照
OpenGL基础光照学习笔记摘要 本文是OpenGL光照学习的入门笔记,主要记录了基础光照模型的核心概念和实现方法。文章从三种基本光照类型展开:漫反射(Diffuse)、高光反射(Specular)和环境光(Ambient)。 法线处理 详细说明了平面、盒体和球体的法线计算方法 强调法线数据对光照计算的重要性 光照模型实现 漫反射:基于光线方向与法线夹角的cos值计算 高光反射:使用reflect函数和视线方向计算 环境光:简单权值处理"死黑"问题 关键技术点 引入step函数处理背面光
2025-09-25 14:54:19
985
原创 [OpenGL]简单几何类设计
本文介绍了使用OpenGL创建几何图形(正方体和球体)的封装实现。通过设计Geometry类,将顶点数据、UV坐标和索引数据的创建过程封装起来,提高代码复用性。对于正方体,直接定义顶点坐标;对于球体,采用经纬线分割法计算顶点位置,并通过两层循环生成顶点索引。文章详细阐述了两种几何图形的数学建模过程、数据存储方式以及OpenGL缓冲区对象的创建和绑定流程,最后提供了完整的类实现代码,包括顶点缓冲对象(VBO)、顶点数组对象(VAO)和元素缓冲对象(EBO)的创建与管理。
2025-09-22 23:19:30
1101
原创 [OpenGL]相机系统
本文介绍了OpenGL中相机与相机控制的设计实现。主要内容包括:1. 相机分为正交投影相机和透视投影相机,通过继承Camera基类实现差异化的投影矩阵计算和缩放功能;2. 相机控制器分为轨迹球控制和游戏控制两种模式,分别实现不同的交互逻辑;3. 轨迹球控制支持物体旋转、平移和缩放操作;4. 游戏控制实现第一人称视角的移动和视角转换。文中详细阐述了各模块的类设计、接口定义和关键算法实现,展示了如何利用C++多态特性构建灵活可扩展的相机系统。
2025-09-21 21:37:28
784
原创 [OpenGL]摄像机&&投影
本文为 OpenGL 初学者笔记,梳理摄像机与投影核心知识,明确 3D 到 2D 渲染的坐标变换逻辑,摄像机是模拟观察者视角的数学工具,需定义位置、看向、穹顶方向,通过 “反向操作世界” 将物体从世界坐标系转至摄像机坐标系,依赖视图变换矩阵(摄像机变换矩阵的逆)。投影分正交(立方体可视范围,无近大远小,需统一盒体至 [-1,1])与透视(锥体可视范围,近大远小,引入剪裁空间解决计算问题,优化参数简化矩阵),均需转 NDC 坐标
2025-09-20 12:46:50
1014
原创 [OpenGL]GLM数学库的使用
本文介绍了OpenGL中使用GLM数学库进行图形变换的基础知识和实现方法。主要内容包括:1. GLM基础使用:向量和矩阵的创建、运算(点乘、叉乘、矩阵运算);2. 图形变换实现:通过顶点着色器实现旋转、平移、缩放等基础变换;3. 复合变换问题:分析本地坐标系和世界坐标系的区别,探讨变换顺序对结果的影响;4. GLM变换规则:平移以本地坐标系为基准,旋转以本地坐标系中心为基准,平移受缩放影响。文章通过代码示例展示了各种变换效果,并总结了变换操作的底层原理和应用注意事项。
2025-09-17 22:10:53
1165
原创 [OpenGL]简单2D游戏的实现
本文介绍了基于OpenGL实现简单2D游戏的关键技术要点。主要内容包括:1) 游戏框架设计,采用单例模式管理窗体和应用状态;2) Shader和Texture类的实现,封装了OpenGL着色器和纹理的创建、绑定等操作;3) 游戏角色系统的实现,包括玩家控制、子弹碰撞和敌人受击效果;4) 动画系统采用定时器控制帧序列切换;5) 碰撞检测和特殊效果处理,如敌人受击时的红屏闪烁效果。文章还强调了内存管理的重要性,如每帧创建和销毁VBO以避免内存泄漏。该实现可作为OpenGL学习实践或C++课程设计的参考案例。
2025-09-15 19:00:53
1283
2
原创 [OpenGL]Mipmap
本文介绍了Mipmap技术原理及其在OpenGL中的实现。Mipmap通过生成多级渐远纹理(每级为前一级尺寸的1/2)来解决物体远离时纹理采样失真的问题。文章详细阐述了Mipmap的生成过程(包括均值/高斯滤波和下采样算法)、使用GLSL偏导函数自动判定Mipmap级别的方法,以及手动生成Mipmap的实现代码。重点分析了如何通过像素与纹素的映射关系计算最佳Mipmap级别,并使用textureLod函数进行采样。最后对比了手动生成与glGenerateMipmap函数的实际效果差异。
2025-09-13 19:02:05
1082
原创 OpenGL的图片渲染
本文介绍了OpenGL纹理处理的关键概念和技术流程。主要内容包括:1. UV坐标原理及两种纹理过滤方式(临近过滤和双线性插值)的对比选择;2. 纹理对象、采样器和纹理单元的关系;3. 四种纹理包裹属性(Repeat、Mirrored、ClampToEdge、ClampToBoarder)的特点;4. 纹理处理的完整流程:数据加载传输阶段(CPU到GPU)和纹理采样渲染阶段(GPU处理)。文章结合代码示例详细说明了如何实现纹理加载、坐标转换、参数设置以及着色器中的纹理采样过程,并提供了不同过滤方式和包裹属性的
2025-09-10 23:21:47
799
原创 OpenGL绘制三角形
前言:刚学OpenGL,主要想要记录下学到的东西,也当作一个笔记,部分理解可能有偏差,也是不全面的,如果有发现问题的话也很高兴大家可以指正,我会尽快修改的,在后续学习过程中,也会根据进行相应的补充与修改。(课件截图来源于bilibili赵新政老师的OpenGL初级课程,流程图是使用脑图进行绘制的)(比起直接调用EasyX或者SDL中的函数,相对来说因为要去实现Shader,OpenGL 呈现出一个三角形真的要麻烦许多,也更难理解,因此本文章最主要的目的是为了记录下流程,并没有太深刻的讲解)
2025-09-05 22:02:10
1072
原创 [OpenGL]NDC,VBO,VAO,EBO
刚学OpenGL,主要想要记录下学到的东西,也当作一个笔记,部分理解可能有偏差,也是不全面的,如果有发现问题的话也很高兴大家可以指正,我会尽快修改的,在后续学习过程中,也会根据进行相应的补充与修改。(课件截图来源于bilibili赵新政老师的OpenGL初级课程)
2025-09-04 11:29:07
1167
原创 LevOJ P2076 炼金铺 I
这题实际上非常简单,但是这简单的操作往往可以给我们启发。对于这题而言,我们可以通过累加操作次数来代替原本的数值更新,也就是将O(n)的操作降到了O(1),而这种思想对于我们去进行其他的区间的(或者是整体的)数值更新也是有很大启发的。
2024-10-29 18:27:41
997
原创 LevOJ P2081 矮人都城
在这种情况下,假如腰的长度是x,由于需要的底边是(0,2x),长度小于等于x的边必然可以与之构成等腰三角形,那么,我们就只需要贪心地从最长骨头开始找底边,不断将比他长度比他小的骨头拆出来,就一定可以构成等腰三角形,实现构造数量的最大化。我们发现,x越小,越不容易找到符合条件的底边,而相对的,对于底边来说,骨头越长就越难与其他的腰构成三角形。因此,我们就要从小到大枚举成对的腰,然后每次贪心地去找到可以组成三角形的无法配对的骨头中长度最长的那一根,这样就可以把条件苛刻的先用掉,最大地可能将所有孤立的骨头用到。
2024-10-26 21:55:51
406
原创 LevOJ P2082 恶魔巢穴
(3)如果这个位上1的个数大于1,那么就可以只保留下来一个,将多出来的1挪到低位,由进制的特性可以知道,多出来的那个1肯定可以将低位上的所有1补全。对于或运算,只要当前二进制位上存在一个一,那么就可以让这个位有数值的贡献了,如果有两个数在该二进制位上存在一个1,那么只要保留一个即可。(2)如果这个位上1的个数为1,那么就不进行改变,答案可以加上该位的贡献值。(1)如果这个位上1的个数为0,那么没有数可以在该位上进行贡献。(或运算 : 1|0=1 , 1|1=1 , 0|0=0)
2024-10-24 21:50:24
612
1
原创 LevOJ P2080 炼金铺 II
我们可以找到每次更新的共通性,假如我们对a[i]执行x次炼金操作,那a[i]的结果是不是会变成a[i]+x*b[i]呢。如果我们去不断记录这个操作的次数,只要最后输出a[i]+x*b[i]+add(还有操作4)就可以了。接下来,我们的任务便是不断地更新mul1,mul2,mul3,mul4,add1,add2。当然,我们很容易便可以知道他的时间复杂度为O(qn),gg了~((๑¯ω¯๑)舒适的似了)其实,假设当前操作数为a[i]本身,对于a[i]+b[i],实际上就是。是不是很像懒标记呢?
2024-10-24 11:42:41
580
原创 LevOJ P2083神圣炸弹
实际上,我们随便找一个点u[x],如果这个点连接到右侧,那么必然会关联一条线,并且连接一个点v[y]。与此同时,在v这一侧,必然会存在一个点v[z](zx)与之相连,那么必然会存在交叉。只有当当前区域 向外扩展的最远u = 向外扩展的最远v 的时候,才结束了一块关联区域。读懂题目了的话,想必大家就会得到结果了,每一片关联区域都有两种选择,假如有x个关联区域,那么总共就有pow(2,x)种搭配,除去所有都不被驱邪的情况,答案肯定是pow(2,x)-1.
2024-10-23 23:11:19
476
1
操作系统功能模拟实现源代码-可以当作课设参考
2026-01-08
OpenGL简单游戏的实现
2025-09-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅