- 博客(77)
- 收藏
- 关注
原创 boost.asio网络学习:Http Server
摘要:本项目实现了一个基于Boost.Asio和Boost.Beast的最小HTTP服务器,核心功能包括监听端口、解析HTTP请求、路由处理和异步响应。服务器采用分层架构:main函数初始化事件循环和监听器;Listener负责接受新连接并为每个连接创建HttpSession;HttpSession处理请求的读取和响应写入;Router根据请求方法和路径生成相应响应。项目演示了HTTP协议的基本处理流程,包括请求解析、路由分发和响应构建,为理解异步HTTP服务器实现提供了简洁范例。
2026-03-18 23:16:59
375
原创 asio::ip::tcp学习
摘要 Boost.Asio的TCP网络编程核心组件包括: tcp::socket:表示已建立的TCP连接端点,管理连接生命周期和I/O操作。需注意异步操作的生命周期管理,推荐使用shared_ptr保活会话对象。 tcp::acceptor:监听器组件,负责绑定端口、监听和接受新连接。必须实现accept循环才能持续接收多个连接。 连接管理:提供同步/异步读写接口,支持半关闭(shutdown)操作。客户端使用resolver进行DNS解析获取endpoint。 常见问题:包括忘记accept循环、并发写冲
2026-03-15 11:28:34
545
原创 Asio基础
摘要:本文介绍了Boost.Asio库的核心组件及其使用要点。主要内容包括:1) io_context作为事件循环和调度器的核心功能;2) steady_timer定时器的使用场景和注意事项;3) strand串行执行器解决多线程并发问题;4) enable_shared_from_this管理异步对象生命周期;5) async_read_some与async_read的区别;6) 错误码处理模型;7) TCP写队列的最佳实践。文章重点阐述了这些组件在多线程环境下的正确使用方式,以及常见的错误处理模式。
2026-03-15 11:05:22
353
原创 Asio学习:定时器
摘要 本文介绍了基于asio库的异步定时器实现方案。通过封装Ticker类,利用strand保证回调串行化,避免多线程环境下的数据竞争。关键点包括:使用shared_from_this管理对象生命周期;通过work_guard保持事件循环运行;采用"expires_after+async_wait"的异步调度模式。线程池模型支持并发执行,而strand确保同一对象的回调有序执行。文章提供了完整的代码框架和并发控制方案,适用于需要精确时间控制的异步应用场景。
2026-03-14 21:54:53
360
原创 光照学习:法线矩阵
,缩放会把法线方向“拉歪”,导致缩放后的法线不再与缩放后的切线(Tangent)保持垂直,从而光照计算出现明显错误(明暗边界不对、高光跑偏)。在进行非等比缩放的时候,会出现图中的问题:如果仍然用和位置一样的矩阵去变换法线(比如直接用。
2026-02-11 18:19:00
384
原创 光照模型:Gouraud模型
Gouraud Shading(高洛德着色)= “逐顶点算光照,逐像素做插值上色”。它不是一个新的光照模型(不改变 Phong/Blinn-Phong 的公式),这两种光照模型的不同就是在不同的阶段计算光照。Gouraud 的“贵”变“便宜”——把很多次的片元光照计算,变成少量的顶点光照计算。: 以一个三角形为例,顶点为。
2026-02-10 22:20:40
337
原创 光照模型:Phong模型
PNPLightPosPViewPosI-LPhong 模型把最终颜色/亮度写成:(1) 环境光 Ambient(不考虑方向,给整体一个底色)vec3Ia(2) 漫反射 Diffuse(Lambert),取决于入射角(图中箭头与法线夹角)Il(3) 镜面反射 Specular(Phong 高光),取决于观察方向与反射方向的接近程度shininess常见细节:当I_diffuseI_specularatten330。
2026-02-10 21:57:28
390
原创 学习四元数
四元数的核心价值:把旋转当成一个整体来累计,不会出现万向节死锁,并且叠加旋转非常自然。欧拉角是三个旋转轴,四元数可以当作是一个旋转轴,这个旋转轴每次都是在变化的。
2026-02-09 20:36:14
418
原创 Qt:容器类的迭代
QList<T>QMap和QHash等关联容器的迭代器用法相同,QList和QLinkedList、QSet等容器类的用法相同。
2025-12-26 22:26:45
465
原创 Qt:容器类
容器类是基于模板的类,可以是简单类型,也可以是QStirng、QDate等类,但不能是QObject或任何其子类。T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可赋值构造函数和一个赋值运算符。Qt的容器分类:顺序容器(sequential containers)和关联容器(associative containers)
2025-12-25 22:16:28
404
原创 OpenGL:PCF柔和阴影
本文探讨了阴影渲染中出现的锯齿问题及其解决方法。阴影锯齿主要源于深度贴图分辨率限制,导致多个片段采样相同深度值。解决方案包括:1)提高深度贴图分辨率;2)优化光源视锥;3)使用PCF(百分比渐进滤波)技术。PCF通过多次采样深度贴图并混合结果来生成柔和阴影。文章展示了不同采样密度的PCF效果对比,从3×3采样(9次)到8×8采样(64次),采样次数越多阴影越柔和。文末提供了GLSL代码实现,演示了如何通过纹理采样和混合计算来改善阴影质量。
2025-11-23 21:44:05
359
转载 OpenGL:阴影过采样
现在如果我们采样深度贴图[0,1]范围以外的区域,纹理函数总会返回一个1.0的深度值,由此得到的阴影值始终为0.0。但是图中还是有一部分是阴影区域,这是因为那部分区域的坐标超出的光的视锥的远平面。这是因为当投影坐标超出光的视锥范围时,其值会比1.0大,此时采样的深度纹理就会超出他默认的范围[0,1]。根据纹理环绕方式,我们将会得到不正确的深度结果,它不是基于真实的来自光源的深度值。我们希望超出深度范围的坐标,深度值为1.0,这样超出的坐标将永远不在阴影之中(深度值最大为1.0)。
2025-11-23 21:39:03
40
原创 OpenGL:阴影失真与阴影悬浮
本文分析了阴影渲染中的失真问题(Shadow Acne)及其解决方案。阴影失真主要由深度纹理精度不足导致,表现为摩尔纹和闪烁现象。解决方法包括引入阴影偏移(shadow bias)技术,通过添加深度偏差值来减少误判。进一步优化提出了根据光线与表面角度动态调整偏移量的方法。然而过大的偏移会导致阴影悬浮问题,表现为阴影偏离实际物体。最终解决方案是在生成深度贴图时启用正面剔除,增大记录的深度值,从而避免误判。文章通过图示和代码示例详细说明了问题成因及解决步骤。
2025-11-23 21:01:57
1314
原创 OpenGL:几何着色器
几何着色器是一种可编程着色器,用于处理输入的图元(点、线或三角形),可以修改、转换或生成新的图元。它通过声明输入/输出图元类型和最大顶点数来控制处理流程,支持输出不同类型或数量的图元。文中以可视化法线为例,展示了从顶点着色器传递法线数据,在几何着色器中生成法线向量线,最后通过片段着色器着色的完整流程。这种技术可以用于调试或增强渲染效果,通过两次绘制(主场景和法线)实现可视化。几何着色器提供了灵活的图元处理能力,扩展了图形渲染的可能性。
2025-11-20 22:05:52
468
原创 OpenGL:Normal Mapping
法线贴图是一种 “存储表面法线信息” 的纹理贴图,用 RGB 颜色值编码法线方向,让低多边形(低模)模型呈现高多边形(高模)的凹凸细节。原理贴图的 RGB 通道对应法线的 X、Y、Z 轴方向(默认蓝色通道 Z 值占比高,所以法线贴图多呈蓝紫色)。不需要增加模型面数,仅通过修改法线方向,就能模拟出划痕、褶皱、纹路等细节,大幅提升渲染效率。法线贴图通常会呈现蓝紫色,因为法线贴图中的法线通常是从XY平面出发,指向+Z方向的。在贴图中的RGB分量分别对应法线的XYZ分量。
2025-11-20 20:15:23
1237
原创 OpenGL:Cube Map
摘要: Cube Map是包含6个2D纹理的立方体贴图,使用3D坐标(s,t,r)索引,其纹理坐标等于方向坐标。它不仅用于天空盒,还可实现环境反射/折射效果。创建时需为立方体6个面分别绑定纹理数据,并设置纹理参数。
2025-11-16 20:55:03
316
原创 OpenGL:Uniform Block
摘要:OpenGL中的Uniform Block Object(UBO)通过共享uniform数据提升渲染性能。
2025-11-15 19:35:21
477
原创 OpenGL:Framebuffer实现Shadow mapping
本文介绍了使用OpenGL Framebuffer实现阴影渲染的技术。首先创建Framebuffer并绑定深度纹理附件,从光源视角进行离屏渲染获取场景深度信息。然后正常渲染场景时,通过比较当前片段深度与深度贴图数据来计算阴影因子。关键技术包括:1) 创建只存储深度信息的Framebuffer;2) 从光源视角渲染场景获取深度贴图;3) 在正常渲染时进行深度比较判断阴影区域。该方法利用深度测试实现阴影效果,是实时渲染中常用的阴影生成技术。
2025-11-15 11:51:32
600
原创 OpenGL:FrameBuffer
帧缓冲对象(FBO)是OpenGL中的自定义缓冲,可附加纹理或渲染缓冲对象存储颜色、深度和模板信息。纹理附件支持读写和着色器采样,适合后处理;渲染缓冲主要用于深度/模板测试,具有硬件优化优势。使用FBO需要创建对象、附加存储、检查完整性,通过绑定FBO渲染场景后再使用存储数据。关键函数包括glBindFramebuffer、glRenderbufferStorage等,广泛应用于离屏渲染、屏幕特效等场景。
2025-11-15 11:40:31
1179
原创 C++自定义迭代器
对于官方定义的迭代器结构,有5个参数,在后续实现自己的迭代器使需要设置。public:// 标准写法// 迭代器的类型// 数据类型// 迭代器之间的逻辑距离// 指针// 引用// 构造函数// 实现运算符重载// 解引用// 成员访问// 前++运算符// 后++运算符return tmp;// 前--运算符// 后--运算符return tmp;// 比较运算符return!
2025-03-31 20:11:59
484
原创 OpenGL:中点直线算法
中点直线算法是通过在像素中确定与理想直线最靠近的像素来进行扫描转换的。在上图中,假设直线的斜率0≤m≤1。假设当前最近的像素已经确认为Pxkyk,由于x位最大的位移方向,因此直线在x方向上每次增加一个像素单位,而在y方向上是否增加一个像素单位,即P点的下一个点是选P1xk1yk还是P2xk1yk1,取决于两个备选像素哪一个离理想像素最近设Mxk1yk0.5位P1P2的中点,
2024-06-23 09:13:51
1142
原创 DDA直线算法
假设给定直线段的起点坐标x0y0和终点坐标x1y1ykxb其中kx2−x1y1−y2by0−kx0DDA直线算法就是在上一个点的基础上x和y加上一个增量,求下一个点的坐标:::info由xiyi求xi1yy1的过程:当∣k∣≤1xi1xi1yi1kxi1bkxi1byib当∣。
2024-06-22 08:38:06
967
原创 OpenGL绘制Bezier曲面
贝塞尔曲面是贝塞尔曲线在二维上的扩展。它由一组控制点定义,通过这些控制点生成光滑的曲面。贝塞尔曲面通常用两个参数u和v来表示,这两个参数的取值范围都在 [0, 1] 之间。
2024-06-20 10:29:20
1601
原创 OpenGL绘制B样条曲线
B样条曲线(B-spline curves)是一种基于样条函数(spline function)的分段多项式函数,广泛用于计算机图形学、数据拟合和数值分析中。B样条曲线有许多优点,如局部控制、平滑性和灵活性。
2024-06-19 11:28:53
1956
原创 OpenGL绘制Bezier曲线
贝塞尔曲线还可以用德卡斯特里奥算法(De Casteljau’s algorithm)递归地计算。对于给定的控制点集P0P1PnP0P1...Pn和参数tttPi0P_i^{(0)}Pi0PiP_iPiPir1−tPir−1tPi1r−1,其中r12nP_i^{(r)}=(1-t)P_i^{(r-1)} +tP_{i+1}^{(r-1)},其中r=1,2,...,nPir1−tP。
2024-06-18 15:59:54
1763
原创 OpenGL超级宝典 纹理(一)
1. 创建纹理对象2. 分配纹理缓存空间3. 绑定纹理对象到OpenGL上下文,告诉OpenGL纹理的类型4. 更新纹理数据5. 控制纹理数据的读取方式 5.1 创建采样器对象 5.2 设置纹理过滤方式
2022-03-24 00:10:15
1836
原创 OpenGL超级宝典 完整渲染管线画圆
圆的画法直接上代码吧。Shader类是上一篇文章的shadervertex shader#version 450 corelayout(location = 0) in vec3 aPos;void main(){ gl_Position = vec4(aPos, 1.0);}tec shader#version 450 corelayout(vertices = 3) out;void main(){ if(gl_InvocationID == 0) { /
2022-03-05 11:54:56
786
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1