当前位置: 首页 > news >正文

Shadertoy着色器移植到Three.js经验总结

Shadertoy是一个流行的在线平台,用于创建和分享WebGL片段着色器。里面有很多令人惊叹的画面,甚至3D场景。本人也移植了几个ShaderToy上的着色器。本文将详细介绍移植过程中需要注意的关键点。

1. 基本结构差异

想要移植ShaderToy的shader到three.js,需要先了解他们直接的差异。他们之间的差异主要在以下几个方面:

  1. ShaderToy没有顶点着色器
    ShaderTory上面的shader只有片元着色器,没有几何,移植到three.js上需要构造一个默认的顶点着色器,同时提供几何信息。这个也比较简单,使用两个三角形铺面整个视口即可。其实用其他的方式也可以,例如用一个大的三角形,只要有个物体几何能充满整个视口即可。

  2. ShaderToy提供了很多内置变量
    ShaderToy提供了不少内置变量,,在three.js中需要咱们自己用uniform来传入。ShaderToy内置变量处理方法如下:

全局变量含义three.js修改方案核心代码
uniform vec3 iResolution;视口大小,单位像素uniforms.iResolution = { value: new THREE.Vector2(options.width, options.hieght) }
uniform float iTime;从开始运行到现在的时间,单位秒var clock = new THREE.Clock();
this.uniforms.iTime.value = this.clock.getElapsedTime();
uniform float iTimeDelta;上一帧渲染到现在的时间,单位秒var clock = new THREE.Clock();
this.uniforms.iTimeDelta.value = this.clock.getDelta();
uniform int iFrame;第几帧this.uniforms.iFrame.value = this.uniforms.iFrame.value + 1;
uniform float iChannelTime[4];//
uniform vec3 iChannelResolution[4];每个通道的分辨率,单位像素uniforms[“iChannelResolution”] = { type: “v3v”, value: [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), ] };
uniform vec4 iMouse;是vec4类型,xy是鼠标当前位置与单击位置,zw是单击位置document.addEventListener(‘mousemove’, (e) => { material.uniforms.iMouse.value.x = e.clientX; material.uniforms.iMouse.value.y = window.innerHeight - e.clientY; }); document.addEventListener(‘mousedown’, (e) => { material.uniforms.iMouse.value.z = e.clientX; material.uniforms.iMouse.value.w = window.innerHeight - e.clientY; });
uniform samplerXX iChanneli;通道的纹理uniforms[“iChannel” + i] = { type: “t”, value: texture }
  1. ShaderToy语法的差异

ShaderToy语法核心都是 GLSL,只是在在变量命名、输入输出方式、内置函数/变量等方面存在区别。以下是关键语法差异的对比:

ShaderToythree.js
入口函数是:mainImage(out vec4 fragColor, in vec2 fragCoord)入口函数是:void main()
fragCoord当前像素的坐标用的是gl_FragCoord
用变量fragColor作为输出通过 gl_FragColor 变量输出
不需要定义变量精度需定义精度:precision highp float; precision highp int;precision highp sampler2D;precision highp samplerCube;

移植基本模版

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Shadertoy to Three.js</title><style>body {margin: 0;overflow: hidden;}canvas {display: block;}</style>
</head><body><script src="./three.min.js"></script><script>const scene = new THREE.Scene();const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);const renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);console.log(renderer.capabilities.isWebGL2)const geometry = new THREE.BufferGeometry();geometry.setAttribute("position", new THREE.Float32BufferAttribute([-1, -1, 0,1, -1, 0,1, 1, 0,-1, 1, 0], 3))geometry.setIndex([0, 1, 2, 0, 2, 3]);const material = new THREE.RawShaderMaterial({uniforms: {iResolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) },iTime: { value: 0 },mouse: { value: new THREE.Vector4(0, 0, 0, 0) },},// glslVersion: THREE.GLSL3,vertexShader: `#version 300 esin vec3 position;void main() {gl_Position = vec4(position, 1.0);}`,fragmentShader: `#version 300 es
precision highp float;
precision highp int;
precision highp sampler2D;
precision highp samplerCube;
out vec4 fragColor;uniform vec2 iResolution;
uniform float iTime;void main(  )
{vec2 uv = gl_FragCoord.xy/iResolution.xy;// [0,1]uv -= 0.5;uv.x *= iResolution.x / iResolution.y;float d = length(uv);float r = 0.3;float c = smoothstep(r, r + 0.002, d);fragColor = vec4(vec3(c), 1.);
}
`});const plane = new THREE.Mesh(geometry, material);scene.add(plane);window.addEventListener('resize', () => {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);material.uniforms.iResolution.value.set(window.innerWidth, window.innerHeight);});document.addEventListener('mousemove', (e) => {material.uniforms.iMouse.value.x = e.clientX;material.uniforms.iMouse.value.y = window.innerHeight - e.clientY;});document.addEventListener('mousedown', (e) => {material.uniforms.iMouse.value.z = e.clientX;material.uniforms.iMouse.value.w = window.innerHeight - e.clientY;});function animate() {requestAnimationFrame(animate);material.uniforms.iTime.value = performance.now() / 1000; // 秒为单位renderer.render(scene, camera);}animate();</script>
</body></html>

这个模版是画圆的实例,效果如下:

有以下几点需要注意:

  1. 两个三角形面片的坐标已经在[-1, 1]之间,不需要在VertexShader进行坐标变换,所有顶点着色器代码没有MVP矩阵:
#version 300 es
in vec3 position;
void main() {gl_Position = vec4(position, 1.0);
}
  1. 使用了RawShaderMaterial而不是ShaderMaterial,这样可对Shader代码进行完全掌控
  2. 语法上使用了WebGL2.0的语法,如果使用1.0的语法,需去掉版本声明、一些关键字

最后展示一个稍微复杂点的Shader效果:

结语

将Shadertoy着色器移植到Three.js需要对两者之间的差异有清晰理解。正确处理全局变量、语法、渲染管线等关方面的差异,可将绝大多数Shadertoy效果成功移植到Three.js项目中。

相关文章:

Shadertoy着色器移植到Three.js经验总结

Shadertoy是一个流行的在线平台&#xff0c;用于创建和分享WebGL片段着色器。里面有很多令人惊叹的画面&#xff0c;甚至3D场景。本人也移植了几个ShaderToy上的着色器。本文将详细介绍移植过程中需要注意的关键点。 1. 基本结构差异 想要移植ShaderToy的shader到three.js&am…...

基于BenchmarkSQL的OceanBase数据库tpcc性能测试

基于BenchmarkSQL的OceanBase数据库tpcc性能测试 安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库和测试表配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试报告重复测试流程梳理安装Benchmar…...

Flutter 泛型 泛型方法 泛型类 泛型接口

目录 泛型简单使用 泛型类的简单使用 泛型接口的使用 通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验) 泛型简单使用 main(){print(getData2("XXX"));getData2<String>("XXX");getData2<int>(1);}Str…...

边缘函数:全栈开发的最后1毫秒性能革命

一、边缘计算的时空折叠术 1. 传统CDN vs. 智能边缘网络 全球电商平台实测数据&#xff1a; 场景云端处理延迟边缘处理延迟转化率提升搜索建议320ms8ms18%个性化推荐450ms12ms27%实时库存检查680ms9ms42%欺诈检测920ms15ms63% 二、边缘全栈架构的量子纠缠 1. 代码的时空分布…...

网店专用版批量转账系统,覆盖淘宝、拼多多、抖店订单信息自动核对+插旗自动备注,支持微信支付宝批量转账

不少电商人在运营过程中&#xff0c;需要用转账工具来解决日常运营过程中的返款问题。 但在实际操作过程中&#xff0c;往往有很多问题。东哥在这里梳理下&#xff0c;方便大家了解&#xff1a; 1.错返/漏返的情况时有发生 为什么会错返和漏返&#xff1f; 实际来看&#x…...

AUTOSAR_RS_ClassicPlatformDebugTraceProfile

AUTOSAR经典平台调试、跟踪与分析支持 AUTOSAR组件调试、跟踪与分析功能详解 目录 简介ARTI核心扩展 核心特定ARTI扩展结构核心参数定义 操作系统和任务扩展 OS特定ARTI扩展任务特定ARTI扩展软件组件特定扩展 总体架构 组件结构接口定义 错误处理 默认错误跟踪器(DET) 总结 1.…...

vue中将html2canvas转成的图片传递给后台 Python Flask 服务

下面将详细介绍如何在 Vue 项目里把 html2canvas 转换得到的图片传递给后台的 Python Flask 服务。 前端&#xff08;Vue&#xff09;步骤 1. 安装依赖 首先要确保已经安装了 html2canvas 和 axios&#xff0c;若未安装&#xff0c;可在终端执行以下命令&#xff1a; npm i…...

基于深度学习的智能交通流量监控与预测系统设计与实现

基于深度学习的智能交通流量监控与预测系统设计与实现 摘要 随着城市化进程的加速和机动车保有量的激增&#xff0c;交通拥堵、事故频发、环境污染等问题日益严峻&#xff0c;对传统的交通管理方式提出了巨大挑战。智能交通系统&#xff08;ITS&#xff09;作为解决这些问题的…...

鸿蒙系统应用开发全栈指南

一、开发环境搭建与工具链配置 1. DevEco Studio深度解析 作为鸿蒙生态的官方IDE&#xff0c;DevEco Studio 4.2版本已集成ArkTS 3.0编译器与AI代码助手功能。安装过程需注意&#xff1a; 系统要求&#xff1a;Windows 10 21H2或macOS Monterey以上环境依赖&#xff1a;Node…...

STC32裸机项目集成FreeRTOS的实战问题解析

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer

振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer 振弦式应变计是一种专为长期埋设于水工建筑物及各类混凝土结构内部而设计的测量仪器&#xff0c;可广泛应用于梁体、柱体、桩基、挡土墙、隧道衬砌、桥墩及基岩等结构的应变与应力监测&#xff0c;同时具…...

AVFormatContext 再分析

说明 &#xff1a;将 avfromatContext 的变量依次打印分析&#xff0c;根据ffmpeg 给的说明&#xff0c;猜测&#xff0c;结合网上的文章字节写测试代码分析。 从常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的个数 /** …...

力扣hot100,739每日温度(单调栈)详解

时隔多久又遇到单调栈的题了&#xff0c;上次记得是接雨水的题&#xff0c;简单讲一下单调栈的适用场景和定义。 意义:看名字就知道单调栈是一个栈里面的数据是单调的 。 解决问题: 单调栈主要用于解决需要**快速找到某个元素附近更大或更小的元素**的问题&#xff0c;其核心…...

怎么检测代理IP延迟?如何选择低延迟代理?

在跨境电商、数据采集以及社交媒体管理等活动中&#xff0c;代理IP的延迟是评估其性能的关键指标之一。高延迟的代理IP可能显著影响任务效率&#xff0c;特别是在需要高并发或大量请求的情况下。本文将介绍几种测试海外代理IP延迟的方法。 一、使用Ping命令测试延迟 Ping命令…...

QEMU 10.0 发布

QEMU 10.0 于 2025 年 4 月 23 日发布。此版本包含 2800 多个提交&#xff0c;来自 211 位作者。以下是一些主要的更新内容&#xff1a; CPU 和主板支持增强 x86 架构&#xff1a;优化了字符串操作指令&#xff0c;显著缩短启动时间。新增了 Intel Clearwater Forest 和 Sierra…...

C++和Java该如何选择?

我真诚的建议你选择C。因为国内Java程序员内卷太严重了&#xff0c;某些公司发布一个Java岗位&#xff0c;立刻就有几百人打招呼&#xff1b;而发布一个C岗位&#xff0c;打招呼的人数就那么十几个。 要知道&#xff0c;无论什么时候&#xff0c;只要你能够学得动C&#xff0c…...

Javase 基础入门 —— 06 final + 单例

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 final 关…...

web 开发中,前端部署更新后,该怎么通知用户刷新

web 开发中&#xff0c;前端部署更新后&#xff0c;该怎么通知用户刷新&#xff1f; 浏览器为什么存在刷新按钮&#xff1f;&#x1f518; 因为需要重新加载js&#xff0c;css&#xff0c;html。但为何需要重新加载这些东西&#xff1f;直白点说这些东西其实就是一个文档&…...

LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系

之前一直搞不懂这些乱七八糟的Tex到底有啥区别&#xff0c;不同引擎不同编译器换来换去&#xff0c;查了些资料又问了下AI&#xff0c;总算是搞懂了。 大概是这样&#xff0c;很久以前有人写了个Tex排版引擎&#xff0c;输入一些代码命令&#xff0c;输出dvi文件&#xff08;设…...

深入解析 npm 与 Yarn:Node.js 包管理工具对比与选型指南

在 Node.js 生态中&#xff0c;依赖管理是项目开发的核心环节。npm&#xff08;Node Package Manager&#xff09;和 Yarn 作为两大主流包管理工具&#xff0c;虽目标一致但各有特色。本文将从技术实现、使用场景、生态整合等维度深度对比&#xff0c;助你选择更适合的工具。​…...

PDF嵌入图片

所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源码 /*** PDF工具*/ public class PdfUtils {/*** 嵌入图…...

Coding Practice,48天强训(24)

Topic 1&#xff1a;判断是不是平衡二叉树&#xff08;递归&#xff09; 判断是不是平衡二叉树_牛客题霸_牛客网 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…...

技术分享 | Oracle-RAC修改IP信息

本文为墨天轮数据库管理服务团队第61期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问胡振兴&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 在生产中有时候会遇到网络变更&#xff0c;Oracle RAC IP信息更换等情况&…...

北京工业大学25计专上岸经验分享

1.个人情况介绍 本科就读于河北双非&#xff0c;专业为计算机科学与技术&#xff0c;四级三次498&#xff0c;六级两次460&#xff0c;拿过几次校级奖学金&#xff0c;竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前&#xff0c;保研保7排8&#xff0c;遗憾选择考研继…...

rabbitmq常用命令

目录 1.查看集群状态 2.查看消息对列的堆积 3.重启mq服务 4.清理mq队列消息 1.查看集群状态 rabbitmqctl cluster_status 2.查看消息对列的堆积 rabbitmqctl list_queues rabbitmqctl list_queues | grep -v 0$ 3.重启mq服务 systemctl status rabbitmq-server.servic…...

Spring Cloud Alibaba 整合 Sentinel:实现微服务高可用防护

一、Sentinel 简介 Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件&#xff0c;主要提供以下核心功能&#xff1a; 流量控制&#xff1a;针对不同的调用关系&#xff0c;以不同的运行指标&#xff08;如 QPS、线程数、系统负载等&#xff09;为基准&#xff0c;对…...

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch)

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch) 这篇文章主要介绍了2020年IROS提出的一种名为GRCN的检测模型,给出了代码各部分的说明,并给出windows系统下可以直接复现的完整代码,包含Cornell数据集。 模型结构图 github源码地址:https://github.com/skumra/robo…...

《一键式江湖:Docker Compose中间件部署108式》开篇:告别“配置地狱”,从此笑傲云原生武林!》

&#xff08;&#x1f5e1;️江湖险恶&#xff0c;少侠可曾受困&#xff1f;&#xff09; 深夜&#x1f319;&#xff0c;你盯着屏幕泛红的终端报错&#xff0c;第3次从GitHub某个无名仓库扒下残缺的docker-compose.yaml&#xff0c; 却发现&#xff1a; RabbitMQ连不上&#…...

C语言内敛函数

目录 1、内敛函数的定义 2、内敛函数的特点 2.1 减少函数调用开销 2.2 代码膨胀 2.3 编译器决定 2.4 适用于小型函数 3、示例 4、注意事项 在C语言中&#xff0c;内敛函数&#xff08;Inline Function&#xff09;是一种通过编译器优化来减少函数调用开销的机制。它通过…...

DAY8-GDB调试及打桩

GDB打桩 1.类成员函数打桩 // example1.cpp #include <iostream>class Calculator { public:int add(int a, int b) {return a b;} };int main() {Calculator calc;std::cout << "Result: " << calc.add(2, 3) << std::endl;return 0; }(…...

三、UI自动化测试03--操作方法API

目录 一、元素操作⽅法二、浏览器操作⽅法1. Part1: 设置最⼤化/⼤⼩/位置扩展: Web/APP 项⽬⻚⾯布局坐标系示意2. Part2: 后退/前进/刷新3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址 三、获取元素信息⽅法1. Part1: 获取⼤⼩/⽂本/属性值2. Part2: 判断元素是否可⻅/可⽤/可…...

人工智能—— K-means 聚类算法

目录 摘要 16 K-means 聚类算法 16.1 本章工作任务 16.2 本章技能目标 16.3 本章简介 16.4 编程实战 16.5 本章总结 16.6 本章作业 本章已完结&#xff01;&#xff01;&#xff01; 摘要 本章实现的工作是&#xff1a;首先采用Python语言读取样本数据(学生的语文、数…...

使用XMLSpy校验xml是否合法

# 背景说明 近期大部分地区都在做或将要做数据迁移&#xff0c;基本所有产品的迁移工具底层都依赖了XSD文件对迁移的结构化数据对应XML文件进行初步校验&#xff0c;但有些XSD的问题提示不太容易理解&#xff0c;正好N年前我做XX数据上报时用过XMLSpy可以直接校验每个xml是否合…...

游戏引擎学习第248天:清理数据块显示

启动代码&#xff0c;构建游戏&#xff0c;回顾并为今天的工作做好准备 今天还需要做一些额外的调整。具体来说&#xff0c;我们希望能编辑一些调试值&#xff0c;而这个结构在当前的调试系统中已经有了&#xff0c;所以今天主要是清理一些无关的部分&#xff0c;并进行一些连…...

基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名&#xff08;即文件名&#xff09;必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…...

腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架

在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架&#xff0c;Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况&#xff0c;Kuikly 是一个面向终端技术栈的跨端开发框架&#xff0c;完全基于kotlin语言开发&#xff0c;提供原生的性能和体验。 按照官方的说法&…...

【c++】AVL树模拟实现

简介 AVL树是最先被发明出来的自平衡二叉查找树&#xff0c;在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子&#xff0c;每一个节点都有一个平衡因子&#xff08;一般是右子树高度 - 左子树高度&#xff09;&#xff1b;AVL树要…...

具身智能模型开发训练技法之仿真平台动捕数据重定向

具身智能大模型的开发与训练高度依赖大量的数据输入&#xff0c;形象地说&#xff0c;如同需要持续的“数据喂养”。只有经过不断地进行数据积累和模型训练&#xff0c;具身智能大模型才能够实现自主感知、自主决策以及自主执行的完整进程。在多样化的数据形态中&#xff0c;真…...

手撕——贪吃蛇小游戏(下)

引言 上一章介绍了实现贪吃蛇小游戏必备的知识点。 这章&#xff0c;让我们一起开启手搓核弹之旅吧。 先附上贪吃蛇代码的git&#xff1a;贪吃蛇小游戏_4_23 Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 上一章的窗口&#xff1a; 手撕——贪吃蛇小游戏&#xff0…...

C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载

在 C 中&#xff0c;类的默认成员函数是编译器自动生成的重要机制&#xff0c;合理利用这些函数可以简化代码编写&#xff0c;同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开&#xff0c;结合具体案例深入解析。 一、默认成员…...

【Jupyter 启动时如何指定目录】

你在 Windows 系统下运行 jupyter notebook 时&#xff0c;遇到了 Jupyter Notebook 打开的目录不是你想要的 E:\desktop\yolo-study&#xff0c;而是其他路径。这可能是由于 Jupyter 的默认配置问题 或 启动路径问题 导致的。 &#x1f50d; 原因分析 Jupyter 默认根目录设置错…...

PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞&#xff1a;SameSite相关绕过 当浏览器访问服务器时&#xff0c;服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…...

openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)

​ 相关资料&#xff1a; 1.communication_dsoftbus: 暂无描述 - Gitee.com 2.dsoftbus_tool: OpenHarmony 分布式软总线样例 3.OpenAtom OpenHarmony​ 4.OpenAtom OpenHarmony 编译该demo之前需要大家搭建拉取openharmony源码&#xff0c;搭建开发环境&#xff0c;同时全…...

关于 Web 服务器的五个案例

一、案例题目&#xff1a; 1.多 IP 访问多网站&#xff08;在 RHCE 练习二中的实验二&#xff09; 2.多端口访问多网站 3.多域名访问多网站 4.虚拟目录和用户控制 5.https/443 二、案例实验 2.多端口访问多网站 ① 开始还是先关闭我们的防火墙以及 selinux [rootserve…...

第十二章-PHP文件上传

第十二章-PHP文件上传 一&#xff0c;文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时&#xff0c;浏览器会将表单数据编码为多部分&#xff08;multipart&#xff09;格式。 Boundary分隔符&#xff1a;随机生成的…...

shell脚本部署disu博客

#!/bin/bash #关闭防火墙 systemctl status firewalld &>/dev/null if [ $? -ne 0 ];then systemctl stop firewalld &>/dev/null else echo “firewalld is disabled” fi #关闭selinux filegetenforce if [ “$fine” “Disabled” ];then echo “firewalld…...

NdrpPointerUnmarshallInternal函数分析之pFormatPointee指针的确定

第一部分&#xff1a; 0: kd> p RPCRT4!NdrPointerUnmarshall0x29: 001b:77c46ce4 e8b6f6ffff call RPCRT4!NdrpPointerUnmarshall (77c4639f) 0: kd> t Breakpoint 4 hit RPCRT4!NdrpPointerUnmarshall: 001b:77c4639f 55 push ebp 0: kd> …...

STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)

第 1 章 延时&#xff1a;嵌入式系统的时间控制基石 1.1 延时基础&#xff1a;从概念到硬件实现 1.1.1 什么是延时&#xff1f; 定义&#xff1a;延时是通过软件或硬件手段&#xff0c;使程序执行过程中暂停指定时间&#xff0c;再继续后续操作的技术。本质是对时间的精确或…...

2025 FIC wp

这次比赛计算机和手机大部分题目都比较常规 第一和第四部分有点让人摸不着头脑 比赛的时候第一部分有四个题没出 第四部分基本都没怎么出 现在复盘一下 把我当时做题的心得和获取的新知识记录一下 互联网取证的部分就先学习一下别的师傅 检材 链接&#xff1a;https://pan.bai…...

STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换

1、标准库SPI初始化 这是标准库的SPI初始化配置 2、HAL库SPI初始化 这是HAL库函数的SPI初始化配置 可以看出&#xff0c;基本一直&#xff0c;除了 基本的io口配置区别&#xff0c;其他主要的读写函数不用动的。 3、SPI发送函数_替换对比 /* SPI写入一个字节 */ void SP…...