QML中的3D功能--自定义着色器开发
在 Qt 3D 中使用自定义着色器可以实现高度定制化的渲染效果。以下是完整的自定义着色器开发方案。
一、基础着色器创建
1. 创建自定义材质
qml
import Qt3D.Core 2.15
import Qt3D.Render 2.15
import Qt3D.Extras 2.15Entity {components: [Transform { translation: Qt.vector3d(0, 0, -5) },CuboidMesh {},Material {effect: Effect {techniques: [// OpenGL技术Technique {graphicsApiFilter {api: GraphicsApiFilter.OpenGLprofile: GraphicsApiFilter.CoreProfilemajorVersion: 3minorVersion: 3}renderPasses: [RenderPass {shaderProgram: ShaderProgram {vertexShaderCode: "#version 330in vec3 vertexPosition;in vec3 vertexNormal;uniform mat4 mvp;out vec3 vNormal;void main() {gl_Position = mvp * vec4(vertexPosition, 1.0);vNormal = vertexNormal;}"fragmentShaderCode: "#version 330in vec3 vNormal;out vec4 fragColor;void main() {vec3 lightDir = normalize(vec3(1,1,1));float diff = max(dot(vNormal, lightDir), 0.0);fragColor = vec4(diff * vec3(1.0,0.5,0.2), 1.0);}"}}]},// Vulkan技术Technique {graphicsApiFilter {api: GraphicsApiFilter.VulkanmajorVersion: 1minorVersion: 0}// Vulkan着色器代码...}]}}]
}
二、高级着色器技术
1. 着色器参数传递
qml
Material {parameters: [// 统一变量Parameter { name: "time"; value: timeUniform.value },Parameter { name: "color"; value: "blue" },// 纹理Parameter {name: "diffuseTexture"value: Texture2D {generateMipMaps: trueminificationFilter: Texture.LinearMipMapLinearmagnificationFilter: Texture.LinearwrapMode {x: WrapMode.Repeaty: WrapMode.Repeat}TextureImage {source: "texture.png"}}}]
}// 动画化参数
NumberAnimation {id: timeUniformtarget: timeUniformproperty: "value"from: 0to: 100duration: 5000loops: Animation.Infinite
}
2. 几何着色器示例
qml
ShaderProgram {geometryShaderCode: "#version 330layout(triangles) in;layout(triangle_strip, max_vertices=3) out;in vec3 vNormal[];out vec3 gNormal;uniform float explodeAmount;void main() {vec3 avgPos = (gl_in[0].gl_Position.xyz + gl_in[1].gl_Position.xyz + gl_in[2].gl_Position.xyz) / 3.0;for(int i=0; i<3; i++) {vec3 dir = normalize(gl_in[i].gl_Position.xyz - avgPos);gl_Position = gl_in[i].gl_Position + vec4(dir * explodeAmount, 0.0);gNormal = vNormal[i];EmitVertex();}EndPrimitive();}"
}
3. 计算着色器 (Qt 6.2+)
qml
ComputeCommand {workGroupX: 32workGroupY: 32workGroupZ: 1shaderProgram: ShaderProgram {computeShaderCode: "#version 430layout(local_size_x = 32, local_size_y = 32) in;layout(rgba32f, binding = 0) uniform image2D outputImage;void main() {ivec2 pixelCoords = ivec2(gl_GlobalInvocationID.xy);vec4 color = vec4(float(pixelCoords.x)/1024.0,float(pixelCoords.y)/768.0,0.5,1.0);imageStore(outputImage, pixelCoords, color);}"}
}
三、着色器特效实现
1. 卡通渲染 (Toon Shading)
glsl
// 顶点着色器
vertexShaderCode: "#version 330in vec3 vertexPosition;in vec3 vertexNormal;uniform mat4 mvp;uniform mat4 modelMatrix;out vec3 vNormal;out vec3 vPosition;void main() {gl_Position = mvp * vec4(vertexPosition, 1.0);vNormal = normalize(mat3(modelMatrix) * vertexNormal);vPosition = vec3(modelMatrix * vec4(vertexPosition, 1.0));}
"// 片段着色器
fragmentShaderCode: "#version 330in vec3 vNormal;in vec3 vPosition;out vec4 fragColor;uniform vec3 lightPos = vec3(5,5,5);uniform vec3 lightColor = vec3(1,1,1);uniform vec3 objectColor = vec3(0.5,0.3,0.8);void main() {vec3 lightDir = normalize(lightPos - vPosition);float diff = max(dot(vNormal, lightDir), 0.0);// 离散化光照if(diff > 0.8) diff = 1.0;else if(diff > 0.5) diff = 0.6;else if(diff > 0.2) diff = 0.3;else diff = 0.1;vec3 diffuse = diff * lightColor;vec3 result = (diffuse) * objectColor;// 添加轮廓float edge = max(dot(vNormal, vec3(0,0,1)), 0.0);if(edge < 0.2) result = vec3(0,0,0);fragColor = vec4(result, 1.0);}
"
2. 水波纹效果
glsl
// 顶点着色器
vertexShaderCode: "#version 330in vec3 vertexPosition;in vec2 vertexTexCoord;uniform mat4 mvp;uniform float time;out vec2 vTexCoord;void main() {float wave = sin(time + vertexPosition.x * 5.0) * 0.1;vec3 pos = vertexPosition + vec3(0, wave, 0);gl_Position = mvp * vec4(pos, 1.0);vTexCoord = vertexTexCoord;}
"// 片段着色器
fragmentShaderCode: "#version 330in vec2 vTexCoord;uniform sampler2D waterTexture;uniform float time;out vec4 fragColor;void main() {vec2 distortedTexCoord = vTexCoord + vec2(sin(time + vTexCoord.y * 10.0) * 0.02,cos(time + vTexCoord.x * 10.0) * 0.02);vec4 color = texture(waterTexture, distortedTexCoord);// 添加高光float spec = pow(max(0.0, sin(vTexCoord.x * 50.0 + time * 5.0)), 10.0);color.rgb += vec3(spec * 0.5);fragColor = color;}
"
四、性能优化技巧
1)着色器变体管理:
qml
Technique {filterKeys: [FilterKey { name: "renderingStyle"; value: "forward" },FilterKey { name: "lightingModel"; value: "phong" }]// ...
}
2)着色器预编译:
qml
ShaderProgram {id: precompiledShadervertexShaderCode: loadShaderSource("shaders/precompiled.vert.qsb")fragmentShaderCode: loadShaderSource("shaders/precompiled.frag.qsb")function loadShaderSource(file) {var request = new XMLHttpRequest()request.open("GET", file, false)request.send(null)return request.responseText}
}
3)着色器LOD:
qml
LevelOfDetail {thresholds: [10, 50, 100]currentIndex: calculateLodIndex()Technique { /* 高细节着色器 */ }Technique { /* 中细节着色器 */ }Technique { /* 低细节着色器 */ }
}
五、调试与问题排查
1)着色器错误捕获:
qml
ShaderProgram {onLogChanged: console.log("Shader Log:", log)onStatusChanged: {if (status === ShaderProgram.Error)console.error("Shader Error:", log)}
}
2)帧调试器集成:
qml
RenderSettings {activeFrameGraph: ForwardRenderer {// ...渲染设置...DebugOverlay {shaderInfoEnabled: true}}
}
3)变量可视化调试:
glsl
// 临时调试输出
fragColor = vec4(vNormal * 0.5 + 0.5, 1.0); // 可视化法线
// fragColor = vec4(vec3(gl_FragCoord.z), 1.0); // 可视化深度
六、完整示例:波浪变形+边缘高光效果
1. QML主文件 (main.qml)
import QtQuick 2.15
import Qt3D.Core 2.15
import Qt3D.Render 2.15
import Qt3D.Extras 2.15
import QtQuick.Controls 2.15ApplicationWindow {width: 1280height: 720visible: trueView3D {anchors.fill: parentcamera: cameraEntity {id: sceneRootCamera {id: cameraprojectionType: CameraLens.PerspectiveProjectionfieldOfView: 45aspectRatio: 16/9nearPlane: 0.1farPlane: 1000.0position: Qt.vector3d(0, 1, 6)upVector: Qt.vector3d(0, 1, 0)viewCenter: Qt.vector3d(0, 0, 0)}components: [RenderSettings {activeFrameGraph: ForwardRenderer {clearColor: "black"camera: camera}},InputSettings {}]// 自定义着色器实体Entity {id: customShaderEntitycomponents: [Transform {id: entityTransformtranslation: Qt.vector3d(0, -0.5, 0)rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), -45)},TorusMesh {id: torusMeshradius: 1.5minorRadius: 0.5rings: 50slices: 50},CustomMaterial {id: customMaterial// 参数通过QML控制time: timeSlider.valuewaveHeight: waveHeightSlider.valuehighlightColor: colorPicker.color}]}// 环境光Entity {components: [DirectionalLight {worldDirection: Qt.vector3d(0.3, -1, 0.2).normalized()color: Qt.rgba(0.5, 0.5, 0.5, 1)intensity: 0.5}]}}}// 控制面板Pane {anchors.bottom: parent.bottomanchors.horizontalCenter: parent.horizontalCenterwidth: parent.width * 0.8height: 150Column {spacing: 5Row {spacing: 10Label { text: "时间: "; anchors.verticalCenter: parent.verticalCenter }Slider {id: timeSliderfrom: 0to: 100value: 0width: 200}Label { text: "波浪高度: "; anchors.verticalCenter: parent.verticalCenter }Slider {id: waveHeightSliderfrom: 0to: 1value: 0.3width: 200}}Row {spacing: 10Label { text: "高光颜色: " }ColorDialog {id: colorDialogtitle: "选择高光颜色"}Button {text: "选择颜色"onClicked: colorDialog.open()}Rectangle {width: 30height: 30color: colorPicker.colorborder.width: 1}}}}// 颜色选择器ColorDialog {id: colorPickercolor: "cyan"}// 自动动画NumberAnimation {target: timeSliderproperty: "value"from: 0to: 100duration: 10000loops: Animation.Infiniterunning: true}
}
2. 自定义材质 (CustomMaterial.qml)
import Qt3D.Core 2.15
import Qt3D.Render 2.15Material {id: root// 可绑定属性property real time: 0.0property real waveHeight: 0.3property color highlightColor: "cyan"// 材质参数parameters: [Parameter { name: "time"; value: root.time },Parameter { name: "waveHeight"; value: root.waveHeight },Parameter { name: "highlightColor"; value: root.highlightColor }]// 材质效果effect: Effect {techniques: [// OpenGL技术Technique {graphicsApiFilter {api: GraphicsApiFilter.OpenGLprofile: GraphicsApiFilter.CoreProfilemajorVersion: 3minorVersion: 3}renderPasses: [RenderPass {shaderProgram: ShaderProgram {id: gl3ShaderProgram// 顶点着色器vertexShaderCode: "#version 330 corein vec3 vertexPosition;in vec3 vertexNormal;in vec2 vertexTexCoord;uniform mat4 modelViewProjection;uniform mat4 modelMatrix;uniform float time;uniform float waveHeight;out vec3 vNormal;out vec3 vPosition;out vec2 vTexCoord;void main() {// 波浪变形float wave = sin(time + vertexPosition.x * 5.0) * cos(time + vertexPosition.z * 3.0) * waveHeight;vec3 displacedPosition = vertexPosition + vec3(0.0, wave, 0.0);gl_Position = modelViewProjection * vec4(displacedPosition, 1.0);// 计算变形后的法线float dx = cos(time + vertexPosition.x * 5.0) * 5.0 * waveHeight;float dz = -sin(time + vertexPosition.z * 3.0) * 3.0 * waveHeight;vec3 tangent = normalize(vec3(1.0, dx, 0.0));vec3 bitangent = normalize(vec3(0.0, dz, 1.0));vNormal = normalize(cross(tangent, bitangent));vPosition = vec3(modelMatrix * vec4(displacedPosition, 1.0));vTexCoord = vertexTexCoord;}"// 片段着色器fragmentShaderCode: "#version 330 corein vec3 vNormal;in vec3 vPosition;in vec2 vTexCoord;uniform vec3 highlightColor;uniform float time;out vec4 fragColor;void main() {// 基础颜色vec3 baseColor = vec3(0.2, 0.4, 0.8);// 光照计算vec3 lightPos = vec3(3.0, 5.0, 2.0);vec3 lightDir = normalize(lightPos - vPosition);vec3 viewDir = normalize(-vPosition);vec3 reflectDir = reflect(-lightDir, vNormal);// 漫反射float diff = max(dot(vNormal, lightDir), 0.0);vec3 diffuse = diff * vec3(1.0);// 镜面反射 (Blinn-Phong)vec3 halfwayDir = normalize(lightDir + viewDir);float spec = pow(max(dot(vNormal, halfwayDir), 0.0), 32.0);vec3 specular = spec * highlightColor;// 边缘高光float rim = 1.0 - max(dot(viewDir, vNormal), 0.0);rim = smoothstep(0.7, 1.0, rim);vec3 rimLight = rim * highlightColor * 0.8;// 组合所有光照vec3 result = (diffuse + specular + rimLight) * baseColor;// 添加基于UV的图案float pattern = sin(vTexCoord.x * 20.0 + time) * sin(vTexCoord.y * 20.0 + time);pattern = smoothstep(-0.3, 0.3, pattern);result = mix(result, vec3(1.0), pattern * 0.3);fragColor = vec4(result, 1.0);}"}// 渲染状态配置renderStates: [CullFace { mode: CullFace.Back },DepthTest { depthFunction: DepthTest.Less }]}]},// Vulkan技术 (可选)Technique {graphicsApiFilter {api: GraphicsApiFilter.VulkanmajorVersion: 1minorVersion: 0}// Vulkan着色器代码...}]}
}
3. 效果说明
这个完整示例实现了以下效果:
-
波浪变形:顶点着色器中基于时间的正弦波变形
-
动态法线计算:根据变形表面重新计算法线
-
多光源组合:包含漫反射、镜面反射和边缘高光
-
UV图案效果:基于纹理坐标的动画图案
-
QML控制:通过滑块控制波浪高度和时间动画
-
颜色选择:可交互选择高光颜色
4. 扩展建议
1)添加纹理支持:
qml
// 在CustomMaterial.qml中添加
property alias texture: textureParam.valueParameter {id: textureParamname: "diffuseTexture"value: Texture2D {generateMipMaps: trueminificationFilter: Texture.LinearMipMapLinearmagnificationFilter: Texture.LinearTextureImage {source: "texture.png"}}
}
2)添加几何着色器:
glsl
// 在ShaderProgram中添加
geometryShaderCode: "#version 330 corelayout(triangles) in;layout(triangle_strip, max_vertices=3) out;in vec3 vNormal[];out vec3 gNormal;uniform float explodeAmount;void main() {vec3 avgPos = (gl_in[0].gl_Position.xyz + gl_in[1].gl_Position.xyz + gl_in[2].gl_Position.xyz) / 3.0;for(int i=0; i<3; i++) {vec3 dir = normalize(gl_in[i].gl_Position.xyz - avgPos);gl_Position = gl_in[i].gl_Position + vec4(dir * explodeAmount, 0.0);gNormal = vNormal[i];EmitVertex();}EndPrimitive();}
"
3)性能优化:
qml
// 使用预编译的着色器二进制文件
ShaderProgram {vertexShaderCode: loadShader("shaders/wave.vert.qsb")fragmentShaderCode: loadShader("shaders/wave.frag.qsb")function loadShader(file) {var xhr = new XMLHttpRequestxhr.open("GET", file, false)xhr.send()return xhr.responseText}
}
相关文章:
QML中的3D功能--自定义着色器开发
在 Qt 3D 中使用自定义着色器可以实现高度定制化的渲染效果。以下是完整的自定义着色器开发方案。 一、基础着色器创建 1. 创建自定义材质 qml import Qt3D.Core 2.15 import Qt3D.Render 2.15 import Qt3D.Extras 2.15Entity {components: [Transform { translation: Qt.v…...
如何防止接口被刷
目录 🛡️ 一、常见的防刷策略分类 🔧 二、技术实现细节 ✅ 1. 基于 IP 限流 ✅ 2. 给接口加验证码 ✅ 3. 使用 Token 限制接口访问权限 ✅ 4. 给接口加冷却时间(验证码类经典) ✅ 5. 使用滑动窗口限流算法(更精…...
18、TimeDiff论文笔记
TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff(架构)原理训练推理其他关键点解释 DDPM(相关数学)1、正态分布2、条件概率1. **与多个条件相关**&…...
docker底层原理
一句话,dockerfile里面的一行指令,就是一个layer层 docker底层原理 在机器上安装docker服务器端的程序,就会在机器上自动创建以下目录,默认安装路径是/var/lib/ docker服务器端的工作目录的作用如下,镜像的每一层的元数…...
YOLO拓展-NMS算法
1.概述 NMS(non maximum suppression)即非极大值抑制,其本质就是搜索局部极大值,抑制非极大值元素,可以理解为局部最大搜索。 这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据…...
Docker Swarm 容器与普通 Docker 容器的网卡差异
问题背景 在 Docker Swarm 网络空间启动的容器有两张网卡(eth0 和 eth1),而普通 Docker 容器只有一张网卡(eth0)。以下通过分析 ip addr show 和 ip link show 的输出,解释原因。 命令输出解析 Docker S…...
【Linux】线程ID、线程管理、与线程互斥
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 上篇文章: 【Linux】线程:从原理到实战,全面掌握多线程编程!-CSDN博客 下…...
服务器简介(含硬件外观接口介绍)
服务器(Server)是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠,能够长时间无间断运行,支持多个用户或客户端的请求。简单来说,服务器就是专门用来存储、管理和提供数…...
自动驾驶---决策规划之导航增强端到端
1 背景 自动驾驶算法通常包括几个子任务,包括3D物体检测、地图分割、运动预测、3D占用预测和规划。近年来,端到端方法将多个独立任务整合到多任务学习中,优化整个系统,包括中间表示,以实现最终的规划任务。随着端到端技…...
Datawhale AI春训营 世界科学智能大赛--合成生物赛道:蛋白质固有无序区域预测 小白经验总结
一、报名大赛 二、跑通baseline 在魔塔社区创建实例,根据教程完成速通第一个分数~ Datawhale-学用 AI,从此开始 三、优化实例(这里是我的学习优化过程) 1.先将官方给的的模型训练实例了解一遍(敲一敲代码) 训练模…...
基于Java(Struts2 + Hibernate + Spring)+MySQL实现的(Web)在线预约系统
基于Struts2 Hibernate Spring的在线预约系统 1.引言 1.1编写目的 针对医院在线预约挂号系统,提供详细的设计说明,包括系统的需求、功能模块、界面设计、设计方案等,以辅助开发人员顺利进行系统的开发并让项目相关者可以对这个系统进行分…...
PHP获取大文件行数
在PHP中获取大文件的行数时,直接读取整个文件到内存中可能会导致内存溢出,特别是对于非常大的文件。因此,最有效的方法是逐行读取文件并计数。以下是一些实现方法: 方法一:使用 fgets() fgets() 函数逐行读取文件&am…...
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型? 一、8大主流Web开发语言技术对比 1. PHP开发:中小型网站的首选方案 最新版本:PHP 8.3(2023年11月发布)核心优势: 全球78%的网站…...
Win7模拟器2025中文版:重温经典,掌上电脑体验
随着科技的快速发展,现代操作系统变得越来越高级,但许多用户仍然怀念经典的Windows 7系统。如果你也想重温那种熟悉的操作体验,Win7模拟器2025中文版 是一个不错的选择。这款软件能够让你在手机上轻松实现Windows 7系统的模拟,带来…...
HTML5+CSS3小实例:CSS立方体
实例:CSS立方体 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&q…...
使用 Vite 快速搭建现代化 React 开发环境
1.检查环境 说明:检测环境,node版本为18.20.6。 2.创建命令 说明:创建命令,选择对应的选项。 npm create vitelatest 3.安装依赖 说明:安装相关依赖。 npm i...
Linux网络编程——基于ET模式下的Reactor
一、前言 上篇文章中我们已经讲解了多路转接剩下的两个接口:poll和epoll,并且知道了epoll的两种工作模式分别是 LT模式和ET模式,下来我们就实现的是一个简洁版的 Reactor,即半同步半异步I/O,在linux网络中,…...
【现代深度学习技术】循环神经网络04:循环神经网络
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
1. 认识DartGoogle为Flutter选择了Dart语言已经是既
1. 认识Dart Google为Flutter选择了Dart语言已经是既定的事实,无论你多么想用你熟悉的语言,比如JavaScript、TypeScript、ArkTS等来开发Flutter,至少目前都是不可以的。 Dart 是由谷歌开发的计算机编程语言,它可以被应用于 Web/…...
学习设计模式《三》——适配器模式
一、基础概念 适配器模式的本质是【转换匹配,复用功能】; 适配器模式定义:将一个类的接口转换为客户希望的另外一个接口;适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的目的:复用…...
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识 引言 在微服务架构中,分布式事务处理和性能优化是面试中高频出现的主题。随着系统规模的扩大,如何保证数据一致性和系统性能成为开发者…...
Elasticsearch只返回指定的字段(用_source)
在Elasticsearch中,当你想要查询文档但不返回所有字段,只返回指定的字段(比如这里的id字段),你可以使用_source参数来实现这一点。但是,有一点需要注意:Elasticsearch的_source字段默认是返回的…...
【Linux “sed“ 命令详解】
本章目录: 1. 命令简介sed 的优势: 2. 命令的基本语法和用法基本语法:参数说明:常见用法场景:示例1:替换文本示例2:删除空行示例3:从命令输出中处理内容 3. 命令的常用选项及参数常用命令动作&a…...
JMETER使用
接口测试流程: 1.获取接口文档,熟悉接口业务 2.编写接口测试用例以及评审 正例:输入正常的参数,验证接口能否正常返回 反例:权限异常(为空、错误、过期)、参数异常(为空、长度异常、类型异常)、其他异常(黑名单、调用次数限制)、兼容异常(一个接口被多种…...
JavaWeb 课堂笔记 —— 13 MySQL 事务
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
离线安装elasticdump并导入和导出数据
离线安装elasticdump 在 CentOS 或 RHEL 系统上安装 elasticdump,你可以使用 npm(Node.js 的包管理器)来安装,因为 elasticdump 是一个基于 Node.js 的工具。以下是步骤 先在外网环境下安装 下载nodejs和npm(注意x8…...
WhatTheDuck:一个基于浏览器的CSV查询工具
今天给大家介绍一个不错的小工具:WhatTheDuck。它是一个免费开源的 Web 应用程序,允许用户上传 CSV 文件并针对其内容执行 SQL 查询分析。 WhatTheDuck 支持 SQL 代码自动完成以及语法高亮。 WhatTheDuck 将上传的数据存储为 DuckDB 内存表,继…...
关于数字信号与图像处理——基于Matlab的图像增强技术
本篇博客是在做数字信号与图像处理实验中的收获。 具体内容包括:根据给定的代码放入Matlab中分别进行两次运行测试——比较并观察运行后的实验结果与原图像的不同点——画出IJ的直方图,并比较二者差异。接下来会对每一步进行具体讲解。 题目:…...
MySQL数据库 - 锁
锁 此笔记参考黑马教程,仅学习使用,如有侵权,联系必删 文章目录 锁1. 概述1.1 介绍1.2 分类 2. 全局锁2.1 介绍2.2 语法2.3 特点(弊端) 3. 表级锁3.1 介绍3.2 表锁3.3 元数据锁(meta data lock࿰…...
免费多平台运行器,手机畅玩经典主机大作
软件介绍 飞鸟模拟器是一款面向安卓设备的免费游戏平台,支持PS2/PSP/NDS等十余种经典主机游戏运行。 该软件突破传统模拟器复杂操作模式,采用智能核心加载技术,用户只需双击主程序即可开启游戏之旅,真正实现"即下即玩"…...
计算机软考中级 知识点记忆——排序算法 冒泡排序-插入排序- 归并排序等 各种排序算法知识点整理
一、📌 分类与比较 排序算法 最优时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 应用场景与特点 算法策略 冒泡排序 O(n) O(n) O(n) O(1) 稳定 简单易实现,适用于小规模数据排序。 交换排序策略 插入排序 O(n) O(n) O…...
STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统
STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统 Norflash简介NorFlash操作驱动代码文件系统测试代码 Norflash简介 NOR Flash是一种类型的非易失性存储器,它允许在不移除电源的情况下保留数据。NOR Flash的名字来源于其内部结构中使用的NOR逻辑门。…...
uniapp-x 二维码生成
支持X,二维码生成,支持微信小程序,android,ios,网页 - DCloud 插件市场 免费的单纯用爱发电的...
当HTTP遇到SQL注入:Java开发者的攻防实战手册
一、从HTTP请求到数据库查询:漏洞如何产生? 危险的参数拼接:Servlet中的经典错误 漏洞代码重现: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String category = request.getParameter("…...
[dp20_完全背包] 介绍 | 零钱兑换
目录 1. 完全背包 题解 背包必须装满 2.零钱兑换 题解 1. 完全背包 链接: DP42 【模板】完全背包 描述 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi ,价值为wiwi。 &a…...
精打细算 - GPU 监控
精打细算 - GPU 监控 在上一篇,咱们历经千辛万苦,终于让应用程序在 Pod 的“驾驶舱”里成功地“点火”并用上了 GPU。太棒了!但是,车开起来是一回事,知道车速多少、油耗多少、引擎水温是否正常,则是另一回事,而且同样重要,对吧? 我们的 GPU 应用跑起来了,但新的问题…...
故障诊断 | CNN-BiGRU-Attention故障诊断
效果一览 摘要 在现代工业生产中,设备的稳定运行至关重要,故障诊断作为保障设备安全、高效运行的关键技术,其准确性和及时性直接影响着生产效率与成本[[doc_refer_1]][[doc_refer_2]]。随着工业设备复杂性的不断增加,传统故障诊断方法已难以满足实际需求。深度学习技术凭借…...
单片机AIN0、AIN1引脚功能
目录 1. 模拟-数字转换器(ADC) 2. 交流电源(AC) 总结 这两部分有什么区别? 在这个电路图中,两个部分分别是模拟-数字转换器(ADC)和交流电源(AC)。以下是这…...
交换机与路由器的主要区别:深入分析其工作原理与应用场景
在现代网络架构中,交换机和路由器是两种至关重要的设备。它们在网络中扮演着不同的角色,但很多人对它们的工作原理和功能特性并不十分清楚。本文将深入分析交换机与路由器的主要区别,并探讨它们的工作原理和应用场景。 一、基本定义 1. 交换…...
uniApp小程序保存定制二维码到本地(V3)
这里的二维码组件用的 uv-ui 的二维码 可以按需引入 QRCode 二维码 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 <uv-qrcode ref"qrcode" :size"280" :value"payCodeUrl"></uv-qrcode>&l…...
手机投屏到电视方法
一、投屏软件 比如乐播投屏 二、视频软件 腾讯视频、爱奇艺 三、手机无线投屏功能 四、有线投屏 五、投屏器...
桌面应用UI开发方案
一、基于 Web 技术的跨平台方案 Electron Python/Go 特点: 技术栈:前端使用 HTML/CSS/JS,后端通过 Node.js 集成 Python/Go 模块或服务。 跨平台:支持 Windows、macOS、Linux 桌面端,适合开发桌面应用。 生态成熟&…...
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...
山东科技大学深度学习考试回忆
目录 一、填空(五个空,十分) 二、选择题(五个,十分) 三、判断题(五个,五分) 四、论述题(四个,四十分) 五、计算题(二个ÿ…...
【Flutter动画深度解析】性能与美学的完美平衡之道
Flutter的动画系统是其UI框架中最引人注目的部分之一,它既能创造令人惊艳的视觉效果,又需要开发者对性能有深刻理解。本文将深入剖析Flutter动画的实现原理、性能优化策略以及设计美学,帮助你打造既流畅又美观的用户体验。 一、Flutter动画核…...
【嵌入式】——Linux系统远程操作和程序编译
目录 一、虚拟机配置网络设置 二、使用PuTTY登录新建的账户 1、在ubuntu下开启ssh服务 2、使用PuTTY连接 三、树莓派实现远程登录 四、树莓派使用VNC viewer登录 五、Linux使用talk聊天程序 1、使用linux自带的talk命令 2、使用c语言编写一个talk程序 一、虚拟机配置网络…...
零、HarmonyOS应用开发者基础学习总览
零、HarmonyOS应用开发者基础认证 1 整体学习内容概览 1 整体学习内容概览 通过系统化的课程学习,熟练掌握 DevEco Studio,ArkTS,ArkUI,预览器,模拟器,SDK 等 HarmonyOS 应用开发的关键概念,具…...
记录一次项目中使用pdf预览过程以及遇到问题以及如何解决
背景 项目中现有的pdf浏览解析不能正确解析展示一些pdf文件,要么内容一直在加载中展示不出来,要么展示的格式很凌乱 解决 方式一:(优点:比较无脑,缺点:不能解决遇到的一些特殊问题࿰…...
致远OA——自定义开发rest接口
文章目录 :apple: 业务流程 🍎 业务流程 代码案例: https://pan.quark.cn/s/57fa808c823f 官方文档: https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登录系统 —— 后台管理 —— 切换系…...
STL之vector基本操作
写在前面 我使用的编译器版本是 g 11.4.0 (Ubuntu 22.04 默认版本),支持C17的全部特性,支持C20的部分特性。 vector的作用 我们知道vector是动态数组(同时在堆上存储数组元素),我们在不确定数…...