博文

FXAA GLSL

 #version 300 es precision mediump float; out vec4 FragColor;    in vec2 TexCoords; uniform sampler2D screenTexture; uniform vec2 screenSize; float FXAA_SPAN_MAX = 8.0f; float FXAA_REDUCE_MUL = 1.0f/8.0f; float FXAA_REDUCE_MIN = 1.0f/128.0f; vec3 computeToneMapping(vec2 texCoords); vec3 computeFxaa(); void main() {     const float gamma = 2.2; vec3 hdrColor = computeFxaa(); // gamma correction hdrColor = pow(hdrColor, vec3(1.0/gamma));          float contrast = 1.5; // 增加对比度     float brightness = 0.0; // 亮度偏移量     hdrColor = (hdrColor - vec3(0.2)) * vec3(contrast) + vec3(brightness);      FragColor = vec4(hdrColor, 1.0); } vec3 computeToneMapping(vec2 texCoords) { const float exposure = 1.0; vec3 hdrColor = texture(screenTexture, texCoords).xyz; return vec3(1.0) - exp(-hdrColor * exposure); } vec3 computeFxaa() {     vec2 screenTextureOffset = 1.0 / screenSize;     vec...

Debian打包

图片
目录制作 DEBIAN 文件夹介绍 control 文件说明 ``` Package: debtest Version: 1.0 Section: utils Priority: optional Architecture: all Depends: qt5-default Maintainer: Starry Don <starrydon1024@gmail.com> Description: debian package test  More detailed description ``` 其他文件 preinst 一个脚本文件,用于备份(以便安装失败时回滚) prerm 处理删除前操作的脚本文件,按需添加 postinst 处理安装后的事件的脚本文件,比如创建快捷方式,删除备份文件等操作,按需添加 postrm 处理删除后操作的脚本文件,按需添加 Usr 文件夹介绍 bin 目录存放可执行文件 local目录存放程序相关配置依赖库等 share目录存放 快捷方式和桌面icon debtest.desktop 内容如下 [Desktop Entry] Type=Application Name=debtest Exec=/usr/bin/debtest Icon=/usr/share/icons/debtest/debtest80 Terminal=false Categories=Utility; 打包 安装fakeroot可以用如下命令 sudo fakeroot dpkg-deb --build debpackage 未安装fakeroot可以用如下命令 sudo dpkg -b debpackage debpackage.deb 安装 sudo dpkg -i debpackage.deb 卸载 sudo dpkg -r debtest dpkg 常用用法 dpkg -c xxx.deb // 安装前根据deb文件查看 dpkg -L debname // 安装后根据包名查看 dpkg -i xxx.deb //安装deb包,如果提示错误,可以加参数—force-all强制安装,但不推荐这样做 dpkg -r debname //移除deb包 dpkg -S filepath //查看某个文件属于哪个deb包 dpkg -X xx...

Qt实现串口控制门禁系统

  在Qt中实现串口控制门禁系统的基本思路是通过串口与门禁硬件进行通信,发送特定的指令来控制门禁的打开和关闭。以下是实现这一功能的基本步骤和代码示例: 发现并打开串口 :首先,需要发现可用的串口并打开它。可以使用 QSerialPortInfo 类来枚举系统上的可用串口,并使用 QSerialPort 类来打开串口。 设置串口参数 :在打开串口之后,需要根据门禁系统的要求设置串口的参数,如波特率、数据位、校验位和停止位。 发送控制指令 :一旦串口被成功打开并配置,就可以发送特定的控制指令到门禁系统。这些指令通常是二进制数据或者ASCII码格式的字符串,具体取决于门禁系统的协议。 接收响应 :发送指令后,门禁系统可能会返回一个响应信号,以确认门禁已经打开或关闭。可以使用 QSerialPort 的 readAll() 方法来读取串口的响应数据。 关闭串口 :在完成通信后,应当关闭串口以释放系统资源。使用 QSerialPort 的 close() 方法可以关闭串口。 以下是一个简单的代码示例,展示了如何在Qt中打开串口、发送数据和关闭串口: ``` #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> // 假设"COM1"是门禁系统连接的串口号 QSerialPort serialPort; QString portName = "COM1"; // 配置串口参数 void setupSerialPort() { serialPort.setPortName(portName); serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率 serialPort.setDataBits(QSerialPort::Data8); // 设置数据位 serialPort.setParity(QSerialPort::NoParity); // 设置无校验位 serialPort.setStopBits(QSerialPort::OneStop); // 设置停止位 serialPort.setF...

make install 内置变量

  在执行 make install 时,Makefile 可以使用一些内置变量来控制安装过程。以下是一些常用的内置变量: prefix :安装目录的前缀,默认为 /usr/local 。可以通过设置 prefix 变量来指定安装目录的前缀,例如 make install prefix=/usr 将安装到 /usr 目录下。 exec_prefix :可执行文件安装目录的前缀,默认为 ${prefix} 。通常情况下, exec_prefix 的值与 prefix 相同,但在某些情况下可以进行区分。 bindir :安装可执行文件的目录,默认为 ${exec_prefix}/bin 。可以通过设置 bindir 变量来指定安装可执行文件的目录。 libdir :安装库文件的目录,默认为 ${exec_prefix}/lib 。可以通过设置 libdir 变量来指定安装库文件的目录。 includedir :安装头文件的目录,默认为 ${prefix}/include 。可以通过设置 includedir 变量来指定安装头文件的目录。 mandir :安装 man 页面的目录,默认为 ${prefix}/share/man 。可以通过设置 mandir 变量来指定安装 man 页面的目录。 infodir :安装 info 文件的目录,默认为 ${prefix}/share/info 。可以通过设置 infodir 变量来指定安装 info 文件的目录。 docdir :安装文档文件的目录,默认为 ${datarootdir}/doc/${PACKAGE} ,其中 ${datarootdir} 通常为 ${prefix}/share , ${PACKAGE} 为软件包名。可以通过设置 docdir 变量来指定安装文档文件的目录。 DESTDIR :安装到临时目录的路径。 make install 命令实际上会将文件安装到 ${DESTDIR}${prefix} 目录下。通常情况下, DESTDIR 是为了在软件打包时指定安装到临时目录以便后续打包。 这些变量可以在 Makefile 中使用,以便在安装过程中指定安装路径。例如,你可以在 Makefile 中使用 ${prefix} 、 ${bindir} 、 ${libdir}...

堆和栈区别

  在计算机科学中,堆和栈都是用于存储数据的内存区域,但它们在分配方式、存储结构、生命周期和使用方式上有着显著的区别。 分配方式 : 堆(Heap) :堆是由程序员手动分配和释放的内存区域。在C++中,通常使用 new 和 delete 或 malloc() 和 free() 来进行堆内存的分配和释放。堆上的内存分配和释放是动态的,大小不固定。 栈(Stack) :栈是由编译器自动管理的内存区域。在函数调用时,函数的参数、局部变量和返回地址等数据都存储在栈上。栈上的内存分配和释放是静态的,由编译器根据程序结构进行自动管理。 存储结构 : 堆 :堆上的内存分配是零散的,不连续的,对象之间没有特定的顺序关系。 栈 :栈上的内存分配是连续的,存储结构是一种先进后出(FILO)或后进先出(LIFO)的结构。 生命周期 : 堆 :堆上的内存分配由程序员控制,直到程序员显式地释放它们或程序结束时,内存才会被释放。因此,堆上的内存分配具有更长的生命周期。 栈 :栈上的内存分配由编译器管理,当函数执行结束时,函数的栈帧会被销毁,栈上的内存会自动释放。因此,栈上的内存分配具有较短的生命周期,仅限于函数的执行期间。 使用方式 : 堆 :堆通常用于存储动态分配的数据结构,如动态数组、对象等。由于堆上的内存分配由程序员手动控制,因此在使用堆上的内存时需要小心管理,以避免内存泄漏和内存溢出。 栈 :栈通常用于存储局部变量、函数参数和返回地址等。由于栈上的内存分配由编译器自动管理,因此在使用栈上的内存时不需要手动释放,也不容易出现内存泄漏等问题。 总的来说,堆和栈是两种不同的内存区域,各自具有不同的特性和用途。选择使用堆还是栈取决于你的具体需求和程序设计。