【three.js】Shader着色器
原始着色器材质RawShaderMaterial
两种着色器材质的 RawShaderMaterial
和 ShaderMaterial
的区别和用法
区别:
ShaderMaterial
会自动将一些初始化着色器的参数添加到代码中(内置attributes
和uniforms
)
RawShaderMaterial
则什么都不会添加。
RawShaderMaterial
特点:允许直接编写原始的 GLSL(OpenGL Shading Language)代码来控制顶点和片元的处理。它提供了最大的灵活性,但也需要开发者对着色器编程有深入的理解。
设置精度:使用 RawShaderMaterial 时,开发者需要在 GLSL 代码中手动设置浮点数的精度(如
precision mediump float;
)。适用场景:适合需要高度定制着色器行为的高级用户,或者当现有的 ShaderMaterial 不能满足特定需求时。
ShaderMaterial
特点:是 Three.js 提供的一个高级封装,它基于 RawShaderMaterial,但增加了一些便利性功能和默认设置。例如,它会自动处理浮点数的精度问题。
设置精度:在 ShaderMaterial 中,开发者通常不需要手动设置精度,因为 Three.js 会根据渲染器的配置自动处理。
适用场景:适合大多数需要自定义着色器的场景,特别是当开发者希望避免手动管理精度设置和其他底层细节时。
塑料质感(Plastic Shader)和动画质感(Toon Shader)
塑料质感
特点:模拟塑料表面的光泽和反射效果。通常通过调整高光强度、光泽度和颜色来实现。
实现:在片元着色器中,可以使用菲涅尔方程来计算反射率,并结合环境光和漫反射来计算最终颜色。
动画质感
特点:模拟卡通或动画风格的渲染效果。通常表现为颜色分块、边缘硬化和简化的光照模型。
实现:在片元着色器中,可以使用阶跃函数或平滑阶跃函数来控制颜色的过渡,从而实现分块效果。同时,可以通过调整光照模型来简化阴影和高光的表现。
着色器的类型
顶点着色器Vertex Shader
顶点着色器的作用是将几何体的每个顶点放置在 2D
渲染空间上,即顶点着色器将 3D
顶点坐标转换为 2D
canvas
坐标。
main函数
它将被自动调用,并且不会返回任何内容。
void main() {}
gl_Position
gl_Position
是一个内置变量,我们只需要给它重新赋值就能使用,它将会包含屏幕上的顶点的位置。下面 main
函数中就是用于给它设置合适的值。执行这段指令后,将得到一个 vec4
,意味着我们可以直接在 gl_Position
变量上使用其x
、y
、z
和 w
属性。
void main() {gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);gl_Position.x += 0.5;gl_Position.y += 0.5;
}
平面向右上角发生了位移,但是需要注意的是,我们并没有像在 Three.js
中一样将平面在三维空间中进行了移动,我们只是在二维空间中移动了平面的投影。就像你在桌子上画了一幅具有透视效果的画,然后把它向桌子右上角移动,但是你的画中的透视效果并没有发生变化。
gl_Position
的作用是在 2D
空间上定位 📍
顶点,既然是 2D
空间,为什么需要使用一个四维向量表示呢?实际上是这些坐标并不是精确的在 2D
空间,而是位于被称为 Clip Space
需要四个维度的裁切空间。裁切空间是指在 -1
到 +1
范围内所有 x
、y
、z
3
个方向上的空间,第四个值 w
用于表示透视。就像把所有东西都放在 3D
盒子中一样,任何超出范围的内容都将被裁切。gl_Position
这些内容的这些内容都是自动完成的,我们只需明白其大概原理即可。
位置属性Position attributes
相同的代码将应用于几何体的每一个顶点,属性变量 attribute
是在顶点之间唯一会发生改变的变量。相同的顶点着色器 Vertex Shader
将应用于每一个顶点,position
属性将包含具体顶点的 x, y, z
坐标值。我们可以使用如下代码获取顶点位置:
attribute vec3 position;
因为 gl_Position
是 vec4
类型,可以使用以下方法将 vec3
转化成 vec4
:
gl_Position = /* ... */ vec4(position, 1.0);
矩阵限定变量Matrices uniforms
每个矩阵将转换 position
,直到我们获得最终的裁切空间坐标。下面是 3
个矩阵,因为在几何体所有顶点中它们的值都是相同的,我们可以通过 uniform
来获取它们。
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
下面将对每个矩阵做出一些变换:
modelMatrix
:将进行网格相关的变换,如缩放、旋转、移动等操作变换都将作用于position
。
viewMatrix
:将进行相机相关的变换,如我们向左移动相机,顶点应该在右边、如果我们朝着网格方向移动相机,顶点会变大等。
projectionMatrix
:会将我们的坐标转化为裁切空间坐标。
为了使用矩阵,我们需要将其相乘,如果想让一个 mat4
作为变量,则该变量类型必须是 vec4
。我们也可以将多个矩阵相乘:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
实际上还可以使用更短的写法来让 viewMatrix
和 modelMatrix
组合成一个 projectionMatrix
,虽然代码少了,但我们可控制的步骤也少了。
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
attribute vec3 position;void main(){gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
实际中我们会选择更长的写法,以便于更好地理解及对 position
进行更多的控制。
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
attribute vec3 position;void main(){vec4 modelPosition = modelMatrix * vec4(position, 1.0);vec4 viewPosition = viewMatrix * modelPosition;vec4 projectedPosition = projectionMatrix * viewPosition;~~~~gl_Position = projectedPosition;
}
上面两种写法都是等价的,使用下面这种时,我们可以更方便地进行控制,比如可以通过调整 modelPosition
的值来对整个模型进行移动,通过以下代码,就能向上移动模型:
void main() {vec4 modelPosition = modelMatrix * vec4(position, 1.0);modelPosition.y += 1.0;// ...
}
void main() {vec4 modelPosition = modelMatrix * vec4(position, 1.0);modelPosition.z += sin(modelPosition.x * 10.0) * 0.1;// ...
}
attribute
:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点的位置。
uniform
:顶点着色器使用的常量数据,不能被修改,一般用于对同一组顶点组成的单个3D
物体中所有顶点都相同的变量,如当前光源的位置。
片元着色器Fragment Shader
Fragment Shader
在 Vertex Shader
之后执行,它的作用是为几何体的每个可见像素进行着色。我们可以通过uniforms
将数据发送给它,也可以将 Vertex Shader
中的数据发送给它,我们将这种从 Vertex Shader
发送到 Fragment Shader
的数据称为 varying
。
Fragment Shader
中最直接的指令就是可以使用相同的颜色为所有像素进行着色。如果只设置了颜色属性,就相当于得到了与 MeshBasicMaterial
等价的材质。如果我们将光照的位置发送给 Fragment Shader
,然后根据像素收到光照影响的多少来给像素上色,此时就能得到与 MeshPhongMaterial
效果等价的材质。
片元着色器的代码将应用于几何体的每个可见像素,这就是片元着色器在顶点着色器之后运行的原因,它的代码比顶点着色器更易于管理
主函数main
void main() {}
精度Precision
在顶部有一条这样的指令,我们用它来决定浮点数的精度,有以下几种值供选择:
highp
:会影响性能,在有些机器上可能无法运行;
mediump
:常用的类型;
lowp
:可能会由于精度问题产生错误
precision mediump float;
RawShaderMaterial
原始着色器材质才需要设置精度,在着色器材质 ShaderMaterial
中会自动处理。
在顶点着色器中也可以是指精度,但是这是非必须的。
gl_FragColor
gl_FragColor
和 gl_Position
类似,但它用于颜色。它也一样是已经被内置声明了的,我们只需要在main
函数中重新给它赋值。它是一个 vec4
,前三个值是红色、绿色、蓝色通道 (r, g, b)
,第四个值是透明度 alpha
(a)
。gl_FragColor
的每个值的取值范围是 0.0
到 1.0
,如果我们设置的值高于它们,也不会产生报错。
gl_FragColor = vec4(0.5, 0.0, 1.0, 1.0);
为了 alpha
透明度值可以生效,我们需要在材质中将 transparent
属性设置为 true
const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,transparent: true
})
属性Attributes
Attributes
是每个顶点之间变化的值,我们之前已经有一个命名为 position
的属性变量,它是每个顶点在坐标轴中的 vec3
值。我们将为每个顶点添加一个随机值,并根据这个值在 z
轴上移动该顶点。在 JavaScript
代码中我们可以像下面这个直接给 BufferGeometry
添加 attribute
属性。然后再创建一个 32位
的浮点类型数组 Float32Array
,为了知道几何体中有多少个顶点,现在可以通过 attributes
属性获取。最后在 BufferAttribute
中使用该数组,并将它添加到几何体的属性中。
setAttribute
:第一个参数是需要设置的attribute
属性名称,然后在着色器中可以使用该名字,属性名命名时最好加一个a
前缀方便区分。
BufferAttribute
:第一个参数是数据数组;第二个参数表示组成一个属性的值的数量,如我们要发送一个(x, y, z)
构成位置,则需要使用3
,示例中每个顶点的随机数只有1个
,因此这个参数使用1
。
const geometry = new THREE.PlaneBufferGeometry(1, 1, 32, 32)
const count = geometry.attributes.position.count
const randoms = new Float32Array(count)
// 使用随机数填充数组
for(let i = 0; i < count; i++) {randoms[i] = Math.random()
}
// 添加到几何体的属性中
geometry.setAttribute('aRandom', new THREE.BufferAttribute(randoms, 1))
现在,我们可以在顶点着色器中获取该属性,并使用它移动顶点,可以得到一个如下图所示的一个由随机尖峰构成的平面。
attribute float aRandom;void main(){// ...modelPosition.z += aRandom * 0.1;// ...
}
限定变量Varyings
varying
: 从顶点着色器发送到片元着色器中的插值计算数据
现在我们若想在片元着色器中想使用 aRandom
属性给片元着色,是无法直接使用 attribute
属性变量的。此时,实现这个功能的方法就是将这个值从顶点着色器发送到片元着色器,称这种变量为 varying
。我们需要在两种着色器中都做如下的操作:
在顶点着色器中,我们需要在 main
函数之前创建 varying
,将其命名为以 v
作为前缀的变量名 vRandom
,然后在 main
函数中给它赋值:
varying float vRandom;void main() {// ...vRandom = aRandom;
}
在片元着色器中,使用相同的方法声明,然后在 main
函数中使用它,可以得到如下的染色效果:
precision mediump float;
varying float vRandom;void main() {gl_FragColor = vec4(0.5, vRandom, 1.0, 1.0);
}
varying的一个有趣之处是,顶点之间的值是线性插值的,如GPU在两个顶点之间绘制一个片元,一个顶点的varying是1.0,另一个顶点的varying是0.0,则该片元值将为0.5。这个特性可以实现平滑的渐变效果。
统一变量Uniforms
1、概念:
Uniforms(统一变量)是OpenGL着色器编程中的一种特殊全局变量,用于在图形渲染管线的不同阶段(如顶点着色器、片段着色器等)共享常量数据。
2、特点:
Uniforms的值由CPU端的应用程序设置,并且在整个渲染调用过程中保持不变。
Uniforms的生命周期跨越整个渲染帧,在这一帧内其值是恒定的。
一个Uniforms变量在被链接在一起的所有着色器阶段中都是可见的,如果顶点着色器和片段着色器都引用了同一个Uniforms变量,则它们将访问到相同的值。
Uniforms变量不能在着色器代码中进行赋值,但可以在声明时初始化一个缺省值。
3、定义方法:
在GLSL(OpenGL Shading Language)中,使用关键字uniform
进行声明,并指定其数据类型,例如矩阵、向量、标量或者结构体。例如:uniform mat4 modelMatrix;
(用于存储模型变换矩阵),uniform vec3 lightPosition;
(存储光源位置),uniform float time;
(表示当前时间)。
4、赋值与传参:
应用程序需要使用OpenGL API函数来为Uniforms变量分配内存地址并设置其值。这些函数包括glGetUniformLocation
(获取Uniforms变量在着色器中的位置标识符),然后使用glUniform*系列函数
(如glUniform1f
,glUniform3fv
,glUniformMatrix4fv
等)来传递实际的数据。
当Uniforms变量数量较多时,可以利用Uniform Buffer Objects(UBOs)进行优化。UBOs允许将多个Uniforms变量打包到连续的缓冲区中,一次性上传至GPU,从而减少API调用开销。
5、自定义Location:
在着色器代码中,可以使用location
布局限定符来指定Uniforms变量的位置。这样,OpenGL在链接着色器时会尝试将指定的位置分配给这些Uniforms变量。
6、活动Uniforms:
在链接后的着色器程序中,并非所有声明的Uniforms都会被认为是“活跃”的。活跃的Uniforms是指在任何片段着色器、顶点着色器或其他类型的着色器阶段中有用到的Uniforms变量。
可以使用glGetActiveUniform
等函数来查询这些在链接后的着色器程序中确实起作用的Uniforms变量的详细信息,包括其名称、类型、大小和数组元素的数量等。
7、限制与注意事项:
OpenGL对Uniforms变量的数量和大小有限制,这取决于硬件支持。超出限制会导致无法创建更多的Uniforms变量或无法设置更大的Uniforms数组。
如果在顶点着色器和片段着色器中均声明了同一个Uniforms变量,则声明的类型必须相同,且在两个着色器中的值也需相同。
码字不易,各位大佬点点赞呗
相关文章:
【three.js】Shader着色器
原始着色器材质RawShaderMaterial 两种着色器材质的 RawShaderMaterial 和 ShaderMaterial 的区别和用法 区别: ShaderMaterial 会自动将一些初始化着色器的参数添加到代码中(内置 attributes 和 uniforms) RawShaderMaterial 则什么都不会添…...
在 macOS 中,设置自动将文件夹排在最前
文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称...
创建并配置华为云虚拟私有云
目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式,它将云服务部署在企业或组织内部的私有基础设施上,仅供该企业或组织内部使用,不对外提供服务.私有云的主要特点包括: 私密性:私有云的资源(如…...
Spark是什么?Flink和Spark区别
Spark是什么?Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架,主要用于大规模数据处理和分析。它支持多种数据处理模式,包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...
代码随想录 day 25
第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/…...
数据仓库中的指标体系模型介绍
数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI(关键绩效指标)模型5. 主题域模型6.平衡计分卡(BSC)模型7.数据指标框架模…...
xr-frame 通过shader去除视频背景色,加载透明视频
目录 前言 实现思路 获取 XR 框架系统: 注册自定义效果 创建效果对象 渲染通道配置 着色器代码 顶点着色器 片元着色器(颜色分量g达到条件的片元将被透透明) effect-removeBlack 完整代码 wxml中使用 前言 实现了一个用于注册自定…...
论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明,…...
Kraft模式安装Kafka(含常规、容器两种安装方式)
一、#创作灵感# 公司使用Kafka的软件项目较多,故写技术笔记巩固知识要点 二、软件环境 - Kafka 3.9.0 官方下载地址:Kafka 3.9.0 - Docker Desktop 4.37 容器图形化工具 官方下载地址:Docker Desktop 4.37 特别说明 - Docker Desktop…...
旷视科技C++面试题及参考答案
在 Linux 系统下常用的命令有哪些? 在 Linux 系统中有许多常用命令。首先是文件和目录操作相关的命令。“ls” 命令用于列出目录的内容,它有很多选项,比如 “ls -l” 可以以长格式显示文件和目录的详细信息,包括文件权限、所有者、大小、修改时间等;“ls -a” 则会显示所有…...
IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)
时序预测 | MATLAB实现IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元) 目录 时序预测 | MATLAB实现IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现IWOA-GRU和GRU时间序列预测…...
edeg插件/扩展推荐:助力生活工作
WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...
TPS和QPS的区别
TPS全称(Transactions Per Second)QPS全称(Queries Per Second)它们都是衡量系统性能的指标,都是表示单位时间内处理的事务或者查询的数量 TPS 定义:TPS指的是系统每秒可以处理的事务数量,一个…...
鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理
文章目录 一、call模块(拨打电话)1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块(短信服务)1、创建短信2、发送短信 三、radio模块(网络搜索&#x…...
如何处理 JavaScript 中的函数防抖问题?
在 JavaScript 中,函数防抖(Debouncing)是一种控制函数执行频率的技术,通常用于处理用户输入事件(例如键盘输入、滚动事件等)。防抖的核心思想是:在连续触发某个事件时,只有在事件停…...
sql server期末复习
表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...
初学STM32 --- 外部SRAM
目录 SRAM简介 SRAM特性: XM8A51216 功能框图 8080并口读时序编辑 8080并口写时序 SRAM 读写操作步骤 FSMC介绍 FSMC时序介绍 FSMC控制器对内核地址映射编辑 FSMC HAL库相关驱动 SRAM驱动步骤 SRAM简介 静态随机存取存储器(Static Random-Access Memory&am…...
XXX公司面试真题
一、一面问题 1.线程池的主要参数 核心线程数最大线程数空闲线程存活时间存活时间单位任务队列线程工厂拒绝策略允许核心线程超时 2. 线程的状态 新建状态就绪状态运行状态阻塞状态死亡状态 补充:线程阻塞的原因 线程调用sleep()方法进入睡眠状态 线程得到一个…...
MySQL 01 02 章——数据库概述与MySQL安装篇
一、数据库概述 (1)为什么要使用数据库 数据库可以实现持久化,什么是持久化:数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是:将内存中的数据存储在关系型数据库中,当然也可以…...
[读书日志]8051软核处理器设计实战(基于FPGA)第四篇:verilog语法特性
第一篇https://blog.csdn.net/m0_74021449/article/details/144796689 第二篇https://blog.csdn.net/m0_74021449/article/details/144813103 第三篇https://blog.csdn.net/m0_74021449/article/details/144834117 4.verilog硬件描述语言基础 这部分主要讲述verilog基础语法…...
大模型高效推理综述
大模型高效推理综述 1 Introduction2 Preliminaries2.1 transformer架构的LLM2.2 大模型推理过程2.3 推理效率分析 3 TAXONOMY(分类)4.数据级别优化4.1输入压缩4.1.1 提示词裁剪(prompt pruning)4.1.2 提示词总结(prompt summary)…...
HTML5实现好看的博客网站、通用大作业网页模板源码
HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码,博客网站源码,HTML模板源码࿰…...
在Microsoft Windows上安装MySQL
MySQL仅适用于Microsoft Windows 64位操作系统,在Microsoft Windows上安装MySQL有不同的方法:MSI、包含您解压缩的所有必要文件的标准二进制版本(打包为压缩文件)以及自己编译MySQL源文件。 注意:MySQL8.4服务器需要在…...
adaface人脸特征提取之ncnn推理
目录 1. 背景2. 准备工作2.1 ncnn库下载2.2 adaface模型下载2.3 模型转换 3. 代码实现4. 模型量化 1. 背景 最近项目要求Android端使用adaface做人脸特征提取,最终选择ncnn作为推理框架 2. 准备工作 2.1 ncnn库下载 https://github.com/Tencent/ncnn/tree/maste…...
iOS 逆向学习 - iOS Security Features:硬件与软件多重防护体系
iOS 逆向学习 - iOS Security Features:硬件与软件多重防护体系 iOS 安全特性全面解析:构筑多层次防御体系一、iOS 的硬件安全特性1. Secure Enclave(安全隔区)2. Hardware Root of Trust(硬件信任根)3. De…...
纯前端实现将pdf转为图片(插件pdfjs)
需求来源 预览简历功能在移动端,由于用了一层iframe把这个功能嵌套在了app端,再用一个iframe来预览,只有ios能看到,安卓就不支持,查了很多资料和插件,原理基本上都是用iframe实现的。最终转换思路…...
stm32HAL库使LED闪烁
PC13引脚为开漏接法 生成代码时设置为out put open drain gpio out put level 设置为high 1表示熄灭 我们将pa9引脚连接为推挽接法 生成代码时设置为 out put push pull Gpio out put level 设置为low 0 表示熄灭 代码使其亮起再延时0.5秒再熄灭再延时0.5秒...
《数据结构》期末考试测试题【中】
《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为?22. 单链表的存储密度比1?23.单链表的那些操作的效率受链表长度的影响?24.顺序表中某元素的地址为?25.m叉树第K层的结点数为?26. 在双向循环链表某节点…...
【Vue3项目实战系列一】—— 全局样式处理,导入view-ui-plus组件库,定制个性主题
😉 你好呀,我是爱编程的Sherry,很高兴在这里遇见你!我是一名拥有十多年开发经验的前端工程师。这一路走来,面对困难时也曾感到迷茫,凭借不懈的努力和坚持,重新找到了前进的方向。我的人生格言是…...
ChatGPT 主流模型GPT-4/GPT-4o mini的参数规模是多大?
微软论文又把 OpenAI 的机密泄露了??在论文中明晃晃写着: o1-preview 约 300B;o1-mini 约 100BGPT-4o 约 200B;GPT-4o-mini 约 8BClaude 3.5 Sonnet 2024-10-22 版本约 175B微软自己的 Phi-3-7B,这个不用约…...
初学stm32 --- RTC实时时钟
目录 RTC简介 常用的RTC方案 STM32 F1 RTC框图介绍 后备寄存器和RTC寄存器特性(F1) F1 RTC相关寄存器介绍 RCC_APB1ENR寄存器编辑 PWR_CR寄存器 RCC_BDCR寄存器 RTC_CRL寄存器 RTC_CRH寄存器 RTC_PRLH寄存器 RTC_PRLL寄存器 RTC_CNTH寄存器 …...
Qt之屏幕录制设计(十六)
Qt开发 系列文章 - screencap(十六) 目录 前言 一、实现原理 二、实现方式 1.创建录屏窗口 2.录屏窗口类定义 3.自建容器对象定义 4.用户使用 5.效果演示 总结 前言 利用Qt实现屏幕录制设计,可以通过使用Qt自带的类QScreen、QPixma…...
25年1月更新。Windows 上搭建 Python 开发环境:Python + PyCharm 安装全攻略(文中有安装包不用官网下载)
引言 随着 Python 在数据科学、Web 开发、自动化脚本等多个领域的广泛应用,越来越多的开发者选择它作为首选编程语言。而 PyCharm 作为一个功能强大的集成开发环境(IDE),为 Python 开发者提供了极大的便利。本文将详细介绍如何在 …...
CTF杂项——[LitCTF 2024]涐贪恋和伱、甾―⑺dé毎兮毎秒
得到一张图片 有两种方式可以得到flag 第一种:LSB 第二种:zsteg...
从零开始手写缓存之如何实现固定缓存大小
cache 发展之路 1、HashMap或者ConcurrentHashMap public class CustomerService {private HashMap<String,String> hashMap new HashMap<>();private CustomerMapper customerMapper;public String getCustomer(String name){String customer hashMap.get(nam…...
Kubernetes——part4-1 Kubernetes集群 服务暴露 Nginx Ingress Controller
Kubernetes集群 服务暴露 Nginx Ingress Controller 一、ingress控制器 1.1 ingress控制器作用 (类似于slb,做代理服务) ingress controller可以为kubernetes 集群外用户访问Kubernetes集群内部pod提供代理服务。 提供全局访问代理访问流程…...
前端小案例——520表白信封
前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...
《机器学习》——线性回归模型
文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…...
测试用例颗粒度说明
当我们在编写测试用例时,总是会遇到一个问题:如何确定测试用例的颗粒度?测试用例过于粗糙,可能无法全面覆盖系统的细节;而颗粒度过细,又会导致测试重复、冗余。掌握合适的颗粒度,不仅可以提高测…...
Kali 离线安装 ipmitool 笔记
在Kali Linux上离线安装 ipmitool 的步骤如下: 一、获取 ipmitool 的安装包和依赖 由于是离线安装,您需要先在一台可以联网的机器上下载 ipmitool 及其所有依赖包。 方法一:使用 apt 下载包 在联网的机器上,运行以下命令以准备…...
基于word2vec的文本大数据分析
基于word2vec的文本大数据分析 效果: 一、简介 Word2Vec是一种词向量表示方法,是在自然语言处理领域(NLP)的神经网络模型,是一种无监督学习,包含两种模型架构:CBOW模型与Skip-Gram模型。 常用于:相似度计算、词类聚类、文本分类、句子和文档表示、搜索引擎优化、情…...
BGP基础配置实验
一、实验拓补 二、实验要求及分析 实验要求: 1,R1为AS 100区域;R2、R3、R4为AS 200区域且属于OSPF协议;R5为AS 300区域; 2,每个设备上都有环回,且通过环回可以使设备互通; 实验分…...
Maven核心与单元测试
目录 一. Maven概述二. IDEA集成Maven2.1 创建Maven项目2.2 Maven坐标2.3 导入Maven项目 三. 依赖管理四. Maven的生命周期五. 单元测试5.1 快速入门5.2 断言5.3 常见注解5.4 依赖范围 六. Maven常见问题 \quad 一. Maven概述 \quad \quad 二. IDEA集成Maven \quad 2.1 创建Mav…...
Go语言的 的继承(Inheritance)基础知识
Go语言的继承(Inheritance)基础知识 引言 在面向对象编程(OOP)中,继承是一个重要的概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。这种机制在许…...
常见的框架漏洞复现
1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多&…...
SLA 简介
SLA 是 Service Level Agreement(服务级别协议) 的缩写,广泛应用于企业服务管理、IT服务、云计算等领域。以下是对 SLA 的详细解释: SLA 的定义 服务级别协议(SLA)是服务提供方(Service Provid…...
基于动力学的MPC控制器设计盲点解析
文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…...
leetcode 面试经典 150 题:轮转数组
链接轮转数组题序号189题型数组解法1. 额外数组法,2. 原数组翻转法(三次翻转法)难度中等熟练度✅✅✅✅ 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,…...
Elasticsearch:探索 Elastic 向量数据库的深度应用
Elasticsearch:探索 Elastic 向量数据库的深度应用 一、Elasticsearch 向量数据库简介 1. Elasticsearch 向量数据库的概念 Elasticsearch 本身是一个基于 Lucene 的搜索引擎,提供了全文搜索和分析的功能。随着技术的发展,Elasticsearch 也…...
From matplotl1b.path 1mport failed to import ImportError:numpy.core.multiarray
问题:From matplotl1b.path 1mport failed to import ImportError:numpy.core.multiarray 安装labelme的时候说numpy与环境不兼容,调不了labelme 解决1:安装虚拟环境 (这里安装labelmede 虚拟环境) #查看python版本 …...