自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(183)
  • 收藏
  • 关注

原创 (十七)深度检测

在opengl中,绘制两个三角形,一般都是后画遮盖住先画的,那么如何达到近处的遮挡远处的效果呢?

2024-07-11 20:53:22 158

原创 (十六)视图变换 正交投影 透视投影

include <glad/glad.h>//glad必须在glfw头文件之前包含//GLM//4×4单位矩阵//lookat:生成一个viewMatrix//eye:当前摄像机所在的位置//center:当前摄像机看向的那个点//up:穹顶向量//参数为盒体上下左右远近//颜色//索引0, 1, 2,//uv坐标//2 VBO创建//3 EBO创建//4 VAO创建vao = 0;

2024-07-09 21:02:55 373

原创 (十五)GLM库对矩阵操作

在VS中定义transform四维矩阵变量,将这个变量与位置向量进行相乘即可进行旋转平移缩放。上述代码分别实现了对图像进行旋转平移缩放的操作。

2024-07-08 19:28:49 221

原创 (十四)向量和矩阵

标量:比如质量/温度/颜色等,没有方向,只有大小的量,称为标量向量:拥有方向跟大小的物理量/数学量为向量,比如力/速度向量特性:1.向量有方向,没有位置2.向量有大小,比如力的大小/速度的快慢。

2024-07-08 09:22:58 279

原创 (十三)MipMap

问题:opengl如何判定应该使用下一级的mipmap呢?通过glsl中的求偏导函数计算变化量决定。

2024-07-04 22:31:04 366

原创 (十二)纹理和采样

在绘制三角形的过程中,将图片贴到三角形上进行显示的过程,就是纹理贴图的过程。

2024-07-03 20:35:24 369

原创 (十一)Uniform

上面的例子中在vs和fs中定义了一个名为time的uniform变量,在render中获取到uniform变量的位置,给其赋值为当前系统时间,最终结果是输出一个随时间变换的彩色三角形。

2024-07-03 14:50:28 162

原创 (十)GLSL数据类型和Shader属性动态获取

和之前不同的是删除了layout (location = 0),不再从vao索引位置获取,而改为动态获取。

2024-07-02 20:33:14 185

原创 (九)绘制彩色三角形

前面的学习中并未涉及到颜色,现在打算写一个例子,在顶点着色器和片元着色器中加入颜色,绘制有颜色的三角形。在程序中,我们只给了顶点颜色分别为红绿蓝,三角形中其他部分像素颜色是通过插值得来的。

2024-07-02 16:01:11 395

原创 (八)EBO和glDrawElements

EBO(Element Buffer Object):元素缓冲对象,用于存储顶点绘制顺序索引号的GPU显存区域绑定vao之后,GL状态机就认为后续操作针对的是当前这个vao,在当前vao状态下绑定任何vbo或者ebo,都会被记录到当前vao当中。

2024-07-02 11:34:59 287

原创 (七)glDrawArry绘制

glBindVertexArray:绑定使用的VAO几何信息。接下来只需要告诉GPU,使用几何数据和材质程序来进行绘制。glUseProgram:设置使用的shader程序。材质程序:vs和fs(顶点着色器和片元着色器)first:从第几个顶点数据开始绘制。count:绘制到第几个顶点数据。几何数据:vao和vbo。

2024-07-01 21:29:59 277

原创 (六)Shader

Shader(着色器):一种运行在GPU端的类C语言GLSL,用于处理顶点数据以及决定像素片元最终着色。Shader对三角形数据的处理,分为顶点处理和片元处理,分别称为顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)

2024-07-01 18:02:17 455

原创 (五)Mesh NDC VBO VAO

NDC(Normalized Device Coordinate)表示标准化设备坐标,使用-1到1之间的数字表示坐标,本质上就是比例。使用NDC可以在不同尺寸的屏幕上显示相同的图形进行缩放处理。

2024-07-01 15:22:22 338

原创 (四)opengl函数加载和错误处理

使用gladLoadGLLoader函数可以加载opengl中所有的函数。

2024-06-28 18:57:09 400

原创 (三)glfw窗体创建和事件响应

【代码】glfw窗体创建和事件响应。

2024-06-28 16:58:26 103

原创 (二)图形渲染管线

1.把3D坐标转换为2D坐标(在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素)着色器(shader):图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入,在gpu上每个阶段运行各自的小程序,这些小程序叫做着色器。上图是一个图形渲染管线的每个阶段的抽象展示,蓝色部分代表的是我们可以注入自定义的着色器的部分。2.把2D坐标转变为实际的有颜色的像素。

2024-06-28 14:42:15 196

原创 (一)opengl环境配置

推荐一个比较好的中文学习网站:https://learnopengl-cn.github.io/

2024-06-21 18:00:40 329

原创 单双链表反转

【代码】单双链表反转。

2024-05-27 09:13:16 251

原创 std::funture和std::promise

在线程池中获取线程执行函数的返回值时,通常使用 std::future 而不是 std::promise 来传递返回值。这是因为线程池内部已经管理了任务的执行和结果的传递,你只需要将任务提交给线程池,并使用 std::future 来获取结果。线程池内部一般会使用一个任务队列来存储待执行的任务,并使用一个线程池管理器来调度任务的执行。当你向线程池提交任务时,线程池会选择一个空闲的线程来执行任务,并将结果存储在与任务关联的 std::future 对象中。

2024-05-16 13:26:26 348

原创 排序算法总结

【代码】排序算法总结。

2024-05-14 16:36:03 111

原创 QT内存管理机制

当一个对象是另一个对象的子对象时,父对象负责管理子对象的生命周期。当父对象被销毁时,它所拥有的子对象也会被销毁,从而释放相关的内存。可以通过 setParent() 方法来设置父对象,或者在对象构造函数中传入父对象指针来建立父子关系。3.对象删除延迟:Qt 提供了 QObject::deleteLater() 方法,用于将对象的删除操作延迟到稍后的事件循环中执行。这样做可以确保在安全的上下文中删除对象,避免在对象的槽函数或信号处理函数中直接删除对象,从而引发潜在的问题。

2024-05-14 10:01:47 238

原创 定时器使用

1,2两种方式差不多,都是用于后台定时任务,不涉及UI更新,我就是用了第二种,然后一段时间后导致cpu占满了,后来发先如果要在定时器中更新UI必须使用第三种方式,该方式可以在UI线程上触发事件,可以直接更新UI。

2024-04-25 10:44:00 348

原创 转换器使用

Path控件为一个向上的箭头,通过给Path绑定转换器CompareConverter ,传递的参数为属性NowPrice和ClosingPrice,当NowPrice>ClosingPrice时,Path样式为一个向上的红色箭头,反之为一个向下的绿色箭头,相等则不显示。通过给Lable绑定转换器PriceColorConverter,传递的参数为属性NowPrice和ClosingPrice,当NowPrice>ClosingPrice时,Label显示红色,反之显示绿色,相等则为灰色。

2024-03-29 16:55:57 193

原创 svg代码应用于button

将svg代码的path属性应用于按钮内容,去掉按钮边框,并且自适应svg大小,以下实现的是一个旋转按钮。TextBlock是为了解决只有点击到路径才能触发点击事件问题。

2024-03-18 14:36:36 527

原创 zip解压缩

使用unzip库可以轻松解压zip文件,源码下载地址:http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win。SetCurrentDirectory:设置解压目录。

2024-02-19 15:09:33 419

原创 MVVM控件焦点问题

在wpf中,有时点击空白处控件失去焦点事件无法触发,要解决这个问题,可以在主窗体mainwindow中重写MouseDown事件。当点击空白处会触发MouseDown事件,调用Keyboard.ClearFocus();在控件中重写LostKeyboardFocus事件。

2023-12-19 10:01:46 667

原创 C# 异步

main方法中执行一个返回值为空的异步方法AsyncMethod,在AsyncMethod可以执行各种耗时操作而不影响main方法执行。在AsyncTaskCompletion方法中等待tcs.SetResult方法执行后才会返回,可用于在回调函数中设置结果。

2023-12-07 16:19:54 592

原创 C#动态调用C++DLL中的函数

其中函数指针由委托delegate替代,使用时可以传委托对象,也可以直接传函数名;指针由IntPtr替代。C#动态调用上述函数。

2023-12-07 14:11:37 668

原创 json字符串和对象之间的转换

将上面json串转换为c#中的对象,c#中有一个比较好用的json库Newtonsoft.Json,在vs2022中工具->NuGet包管理器中搜索安装该库即可。使用DeserializeObject可以将json字符串反序列化为对象,DeserializeObject可以将对象序列化为json字符串。

2023-11-21 09:02:33 236

原创 C++动态调用dll中的函数

1.dll中的函数声明必须写上extern “C” __declspec(dllexport),不然找不到该函数。2.dll文件和exe放在同一文件夹下。

2023-11-17 10:29:34 278

原创 gtk和webkitgtk源码编译

gtk3依赖glib,gdkpixbuf,pango,atk和Gobject Introspection;webkitgtk依赖gtk,下面为我编译gtk和webkitgtk源码并安装在自定义目录的过程。所有编译的包和源代码可以私信获取。

2023-11-02 16:09:18 576

原创 谷歌浏览器修改背景色

改为Enabled即可把背景色改为黑色,亲测edge浏览器也生效。地址栏输入:chrome://flags/

2023-10-19 09:41:08 868 1

原创 Linux下换行符问题

【代码】Linux下换行符问题。

2023-08-08 09:56:38 364

原创 vector源码剖析

在push_back函数中,data[size++] = value调用的是=赋值函数,std调用的是拷贝构造,可以替换为以下代码既可以实现。上面是vector的简单实现,reserve函数中,operator new和new operator可以查看。输出:构造函数 拷贝构造。

2023-07-28 14:32:28 217

原创 GTK Label响应点击事件

借助event box实现label点击事件,将label放在envent box中,将event box放在水平布局中并居中显示。

2023-07-25 15:41:28 133

原创 GTK窗口位置问题

注意:gtk_widget_get_allocation获取控件的位置不正确;通过以下代码获取控件相对于顶级窗口的位置。

2023-07-14 15:38:04 357

原创 GTK_ENTRY控件changed响应函数修改值,然后gtk_editable_set_position设置光标无效

如果在 GTK 的 GtkEntry 的 changed 信号响应函数中设置文本值后,再调用 gtk_editable_set_position() 设置光标位置无效,可能是因为在 changed 信号触发时,控件的内容已经被重新渲染,导致内部光标位置被重置。为了解决这个问题,可以将 gtk_editable_set_position() 函数的调用延迟一点,让它在下一个事件循环周期中执行。g_idle_add() 是 GLib 库提供的一个函数,用于在主事件循环中添加一个低优先级的任务。

2023-07-14 13:56:17 270

原创 std::thread和std::mutex

创建了一个名为t1的线程,调用join方法阻塞等待线程退出,也可以调用detach使线程处于游离态,参考,可以观察到,必须调用这两个方法中的一个,不然会报错:当thread对象被创建时,会给线程分配一个线程id(不为0),join和detach函数每次执行时会将_Thr对象置空,也就是将线程id置为0,当thread对象析构时,调用joinable函数发现线程id不为0就会terminate终止程序。

2023-07-12 17:21:16 197

原创 C++虚函数表

因为类中所有的虚函数地址都是在编译时期存放在虚函数表中,虚函数的调用必须通过虚函数表,而要想找到虚函数表必须通过虚指针vptr,而虚指针vptr只有在对象创建后才存在。可以看到pa和a都有一个名为_vfptr的成员并且他们的值相等,其类型为void**,这个就是我们常说的虚指针vptr,它指向虚函数表,虚函数表存放的即是类中的每个虚函数的地址,即_vptr下的[0][1][2],分别为类A三个虚函数的指针。2.虚函数表不属于类,在编译时期创建,为每个含有虚函数的类分配一个虚函数表。

2023-07-12 10:35:59 106

原创 创建对象加不加括号区别

i ++;} };A fun();//这种情况只是声明了一个函数,并没有创建对象 A a;return 0;以上结果均输出输出-842150451,没有对m_a进行初始化。i ++;} };A fun();A a;return 0;以上结果均输出100。

2023-07-10 15:23:07 226

MFC集成duilib库

在MFC中使用duilib

2023-04-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除