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

【Javascript】在canvas中加载shader着色器的方法(开箱即用)

功能简介

可以播放,暂停shader代码,可以在js中配置shader参数(下面案例列举了所有可用参数形式)

缺点

这个是固定机位,没有自定义顶点着色器部分的功能,有需要可直接在class中改,或者修改后调用更新片元着色器的方法。

工具

class WebGLShaderToy {constructor(canvas, fragmentShaderSource, customUniforms) {// 获取 Canvas 元素this.canvas = canvas;// 获取 WebGL 上下文this.gl = this.canvas.getContext('webgl');// 顶点着色器代码this.vertexShaderSource = `attribute vec2 a_position;void main() {gl_Position = vec4(a_position, 0, 1);}`;this.customUniforms = []// 片段着色器代码this.fragmentShaderSource = this.createHeader(customUniforms) + fragmentShaderSource;console.log("fragmentShaderSource", this.fragmentShaderSource);// 编译着色器this.vertexShader = this.compileShader(this.gl, this.vertexShaderSource, this.gl.VERTEX_SHADER);this.fragmentShader = this.compileShader(this.gl, this.fragmentShaderSource, this.gl.FRAGMENT_SHADER);// 创建着色器程序this.program = this.createProgram(this.gl, this.vertexShader, this.fragmentShader);// 获取属性和制服的位置this.positionAttributeLocation = this.gl.getAttribLocation(this.program, 'a_position');this.resolutionUniformLocation = this.gl.getUniformLocation(this.program, 'iResolution');this.timeUniformLocation = this.gl.getUniformLocation(this.program, 'iTime');// 获取颜色制服的位置this.colorUniformLocations = [];for (let i = 1; i <= 10; i++) {this.colorUniformLocations.push(this.gl.getUniformLocation(this.program, `iColor${i}`));}// 创建缓冲区并绑定顶点数据this.positionBuffer = this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionBuffer);const positions = [-1, -1,1, -1,-1, 1,-1, 1,1, -1,1, 1];this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(positions), this.gl.STATIC_DRAW);// 启用属性this.gl.enableVertexAttribArray(this.positionAttributeLocation);this.gl.vertexAttribPointer(this.positionAttributeLocation, 2, this.gl.FLOAT, false, 0, 0);// 设置视口this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);// 清除画布this.gl.clearColor(0, 0, 0, 1);this.gl.clear(this.gl.COLOR_BUFFER_BIT);// 使用着色器程序this.gl.useProgram(this.program);// 设置分辨率制服this.gl.uniform2f(this.resolutionUniformLocation, this.gl.canvas.width, this.gl.canvas.height);// 初始化颜色制服this.setColors([[1.0, 0.0, 0.0], // 红色[0.0, 1.0, 0.0], // 绿色[0.0, 0.0, 1.0], // 蓝色[1.0, 1.0, 0.0], // 黄色[1.0, 0.0, 1.0], // 紫色[0.0, 1.0, 1.0], // 青色[1.0, 0.5, 0.0], // 橙色[0.5, 0.0, 1.0], // 紫罗兰色[0.5, 1.0, 0.0], // 黄绿色[0.0, 0.5, 1.0]  // 天蓝色]);this.loadTexture(this.gl,"./texture1.jpg")this.isAnimating = false;}// 创建着色器开头createHeader(customUniforms) {let header = `precision mediump float;uniform vec2 iResolution;uniform float iTime;uniform vec3 iColor1;uniform vec3 iColor2;uniform vec3 iColor3;uniform vec3 iColor4;uniform vec3 iColor5;uniform vec3 iColor6;uniform vec3 iColor7;uniform vec3 iColor8;uniform vec3 iColor9;uniform vec3 iColor10;`for (let i = 0; i < customUniforms.length; i++) {let { name, type, value } = customUniforms[i]let str = `uniform ${type} ${name};`header += str}console.log('header', header, customUniforms);return header}// 编译着色器的函数compileShader(gl, shaderSource, shaderType) {try {const shader = gl.createShader(shaderType);gl.shaderSource(shader, shaderSource);gl.compileShader(shader);const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);if (!success) {console.log(gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null;}return shader;} catch (error) {console.error("片元着色器编码异常,请检查着色器代码", error)}}// 创建着色器程序的函数createProgram(gl, vertexShader, fragmentShader) {const program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);const success = gl.getProgramParameter(program, gl.LINK_STATUS);if (!success) {console.log(gl.getProgramInfoLog(program));gl.deleteProgram(program);return null;}return program;}// 赋值customUniformssetCustomUniforms(customUniforms) {for (let i = 1; i <= 10; i++) {this.colorUniformLocations.push(this.gl.getUniformLocation(this.program, `iColor${i}`));}let unifromBuffer = []let textureLoadingArray = []for (let i = 0; i < customUniforms.length; i++) {let { name, type, value } = customUniforms[i]let uniform = this.gl.getUniformLocation(this.program, `${name}`)switch (type) {// 标量类型case "float":this.gl.uniform1f(uniform, value);break;case "int":this.gl.uniform1i(uniform, value);break;case "bool":this.gl.uniform1i(uniform, value ? 1 : 0);break;// 向量类型case "vec2":this.gl.uniform2fv(uniform, value);break;case "vec3":this.gl.uniform3fv(uniform, value);break;case "vec4":this.gl.uniform4fv(uniform, value);break;case "ivec2":this.gl.uniform2iv(uniform, value);break;case "ivec3":this.gl.uniform3iv(uniform, value);break;case "ivec4":this.gl.uniform4iv(uniform, value);break;case "bvec2":this.gl.uniform2iv(uniform, value.map(v => v ? 1 : 0));break;case "bvec3":this.gl.uniform3iv(uniform, value.map(v => v ? 1 : 0));break;case "bvec4":this.gl.uniform4iv(uniform, value.map(v => v ? 1 : 0));break;// 矩阵类型case "mat2":this.gl.uniformMatrix2fv(uniform, false, value);break;case "mat3":this.gl.uniformMatrix3fv(uniform, false, value);break;case "mat4":this.gl.uniformMatrix4fv(uniform, false, value);break;// 采样器类型case "sampler2D":case "samplerCube":this.gl.uniform1i(uniform, textureLoadingArray.length);textureLoadingArray.push({ type, value })break;default:console.error(`Unsupported uniform type: ${type}`);}unifromBuffer.push(uniform)//    // 清除gl的全部贴图缓存// this.clearTextureCache()//     // 使用textureLoadingArray加载所有贴图//     textureLoadingArray.forEach(({ type, value }) => {//         if (type == "sampler2D") {//             this.loadTexture(this.gl, value)//         } else {//             // this.loadCubeTexture(this.gl, value)//         }//     })}}// 动画循环draw(time) {if (!this.isAnimating) return;// 设置时间制服this.gl.uniform1f(this.timeUniformLocation, time * 0.001);// 绘制三角形this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);// 请求下一帧动画requestAnimationFrame(this.draw.bind(this));}// 开始动画startAnimation() {this.isAnimating = true;requestAnimationFrame(this.draw.bind(this));}// 暂停动画pauseAnimation() {this.isAnimating = false;}// 恢复动画resumeAnimation() {if (!this.isAnimating) {this.isAnimating = true;requestAnimationFrame(this.draw.bind(this));}}// 修改片段着色器源代码changeFragmentShader(fragmentShaderSource, config) {this.fragmentShaderSource = this.createHeader(config.customUniforms) + fragmentShaderSource;;console.log("will compileShader", this.fragmentShaderSource);this.fragmentShader = this.compileShader(this.gl, this.fragmentShaderSource, this.gl.FRAGMENT_SHADER);if (this.fragmentShader) {// 删除旧的着色器程序this.gl.deleteProgram(this.program);// 创建新的着色器程序this.program = this.createProgram(this.gl, this.vertexShader, this.fragmentShader);if (this.program) {// 获取新的属性和制服的位置this.positionAttributeLocation = this.gl.getAttribLocation(this.program, 'a_position');this.resolutionUniformLocation = this.gl.getUniformLocation(this.program, 'iResolution');this.timeUniformLocation = this.gl.getUniformLocation(this.program, 'iTime');// 获取新的颜色制服的位置this.colorUniformLocations = [];for (let i = 1; i <= 10; i++) {this.colorUniformLocations.push(this.gl.getUniformLocation(this.program, `iColor${i}`));}// 启用属性this.gl.enableVertexAttribArray(this.positionAttributeLocation);this.gl.vertexAttribPointer(this.positionAttributeLocation, 2, this.gl.FLOAT, false, 0, 0);// 使用新的着色器程序this.gl.useProgram(this.program);// 设置分辨率制服this.gl.uniform2f(this.resolutionUniformLocation, this.gl.canvas.width, this.gl.canvas.height);this.setCustomUniforms(config.customUniforms)if (config && config.colors) {this.setColors(colors)} else {this.setColors([[1.0, 0.0, 0.0], // 红色[0.0, 1.0, 0.0], // 绿色[0.0, 0.0, 1.0], // 蓝色[1.0, 1.0, 0.0], // 黄色[1.0, 0.0, 1.0], // 紫色[0.0, 1.0, 1.0], // 青色[1.0, 0.5, 0.0], // 橙色[0.5, 0.0, 1.0], // 紫罗兰色[0.5, 1.0, 0.0], // 黄绿色[0.0, 0.5, 1.0]  // 天蓝色])}}}}// 清除纹理缓存的辅助方法clearTextureCache() {const gl = this.gl;// 解绑所有纹理单元for (let i = 0; i < gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); i++) {gl.activeTexture(gl.TEXTURE0 + i);gl.bindTexture(gl.TEXTURE_2D, null);gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);}// 这里可以扩展为记录所有创建的纹理对象并删除它们// 例如,如果有一个 this.textureObjects 数组存储了所有纹理对象// this.textureObjects.forEach(texture => gl.deleteTexture(texture));// this.textureObjects = [];}// 加载二维纹理loadTexture(gl, url) {console.log("加载二维纹理", gl, url);const texture = gl.createTexture();gl.bindTexture(gl.TEXTURE_2D, texture);// 设置默认纹理数据,避免在图像加载完成前使用未初始化的纹理const level = 0;const internalFormat = gl.RGBA;const width = 1;const height = 1;const border = 0;const srcFormat = gl.RGBA;const srcType = gl.UNSIGNED_BYTE;const pixel = new Uint8Array([0, 0, 255, 255]);  // 蓝色像素gl.texImage2D(gl.TEXTURE_2D, level, internalFormat,width, height, border, srcFormat, srcType,pixel);const image = new Image();image.onload = function () {gl.bindTexture(gl.TEXTURE_2D, texture);// 设置纹理参数以支持非 2 的幂次方纹理gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);// 非 2 的幂次方纹理不支持生成 mipmap,所以这里不调用 gl.generateMipmap// gl.generateMipmap(gl.TEXTURE_2D); };image.src = url;return texture;}// 加载立方体纹理loadCubeTexture(gl, urls) {const texture = gl.createTexture();gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);const faceTargets = [gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z];urls.forEach((url, i) => {const image = new Image();image.onload = function () {gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);gl.texImage2D(faceTargets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);gl.generateMipmap(gl.TEXTURE_CUBE_MAP);};image.src = url;});return texture;}// 更新画布大小updateCanvasSize(width, height) {this.canvas.width = width;this.canvas.height = height;this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);this.gl.uniform2f(this.resolutionUniformLocation, this.gl.canvas.width, this.gl.canvas.height);}// 设置颜色制服setColors(colors) {console.log('setColors', colors);for (let i = 0; i < colors.length; i++) {this.gl.uniform3fv(this.colorUniformLocations[i], colors[i]);}}// 销毁dispose() {this.pauseAnimation()// 清理WebGL资源if (this.gl) {// 删除缓冲区const buffers = this.gl.getParameter(this.gl.ARRAY_BUFFER_BINDING);if (buffers) {this.gl.deleteBuffer(buffers);}// 删除纹理const textures = this.gl.getParameter(this.gl.TEXTURE_BINDING_2D);if (textures) {this.gl.deleteTexture(textures);}// 删除着色器程序if (this.program) {this.gl.deleteProgram(this.program);}// 删除帧缓冲区const framebuffers = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);if (framebuffers) {this.gl.deleteFramebuffer(framebuffers);}}}

使用


const canvasDom = document.getElementById('glCanvas');
const fragmentShaderSource = `void main() {vec2 st = gl_FragCoord.xy/iResolution.xy;// 简单示例:根据时间和坐标生成颜色vec3 color = mix(iColor1, iColor2, st.x);gl_FragColor = vec4(iColor7, 1.0);}
`;// {
//     inputmat22: [1, 2, 3, 4],
//     inputmat33: [1, 2, 3, 4, 5, 6, 7, 8, 9],
//     inputmat44: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
// }
const customUniforms = [// 标量类型{ name: "inputFloat", type: "float", value: 3.14 },{ name: "inputInt", type: "int", value: 42 },{ name: "inputBool", type: "bool", value: true },// 向量类型{ name: "inputVec2", type: "vec2", value: [1.0, 2.0] },{ name: "inputVec3", type: "vec3", value: [1.0, 0.0, 0.0] },{ name: "inputVec4", type: "vec4", value: [1.0, 2.0, 3.0, 4.0] },{ name: "inputIVec2", type: "ivec2", value: [1, 2] },{ name: "inputIVec3", type: "ivec3", value: [1, 2, 3] },{ name: "inputIVec4", type: "ivec4", value: [1, 2, 3, 4] },{ name: "inputBVec2", type: "bvec2", value: [true, false] },{ name: "inputBVec3", type: "bvec3", value: [true, false, true] },{ name: "inputBVec4", type: "bvec4", value: [true, false, true, false] },// 矩阵类型{ name: "inputMat2", type: "mat2", value: [1, 2, 3, 4] },{ name: "inputMat3", type: "mat3", value: [1, 2, 3, 4, 5, 6, 7, 8, 9] },{name: "inputMat4", type: "mat4", value: [1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,0, 0, 0, 1]},// 采样器类型{ name: "inputSampler2D", type: "sampler2D", value: "./texture1.png" }, // 这里的 0 是纹理单元编号{ name: "inputSampler2D2", type: "sampler2D", value: "./texture2.png" }, // 这里的 0 是纹理单元编号{ name: "inputSamplerCube", type: "samplerCube", value: ["./texture2.png", "./texture2.png", "./texture2.png", "./texture2.png", "./texture2.png", "./texture2.png"] } // 这里的 1 是纹理单元编号
];
const webGLShaderToy = new WebGLShaderToy(canvasDom, fragmentShaderSource, customUniforms);
webGLShaderToy.startAnimation();// 示例:修改片段着色器
setTimeout(() => {const newFragmentShaderSource = `// precision mediump float;// uniform vec2 iResolution;// uniform float iTime;// uniform vec3 iColor1;// uniform vec3 iColor2;// uniform vec3 iColor3;// uniform vec3 iColor4;// uniform vec3 iColor5;// uniform vec3 iColor6;// uniform vec3 iColor7;// uniform vec3 iColor8;// uniform vec3 iColor9;// uniform vec3 iColor10;void main() {vec2 st = gl_FragCoord.xy / iResolution.xy;  // 归一化纹理坐标vec3 color = mix(iColor7, iColor10, st.y);// 对纹理进行采样,使用归一化的纹理坐标vec4 texColor = texture2D(inputSampler2D, st);// 使用采样得到的颜色作为输出gl_FragColor = vec4(texColor);}`;webGLShaderToy.changeFragmentShader(newFragmentShaderSource, { customUniforms });
}, 5000);// // 示例:更新画布大小
// // setTimeout(() => {
// //     webGLShaderToy.updateCanvasSize(800, 600);
// // }, 10000);
// 示例:更新画布大小
setTimeout(() => {webGLShaderToy.updateCanvasSize(1920, 1080);
}, 10000);// 示例:暂停动画
setTimeout(() => {console.log("pauseAnimation");webGLShaderToy.pauseAnimation();
}, 15000);// 示例:恢复动画
setTimeout(() => {console.log("resumeAnimation");webGLShaderToy.resumeAnimation();
}, 20000);

相关文章:

【Javascript】在canvas中加载shader着色器的方法(开箱即用)

功能简介 可以播放&#xff0c;暂停shader代码&#xff0c;可以在js中配置shader参数&#xff08;下面案例列举了所有可用参数形式&#xff09;缺点 这个是固定机位&#xff0c;没有自定义顶点着色器部分的功能&#xff0c;有需要可直接在class中改&#xff0c;或者修改后调用…...

华为华三模拟器解决兼容问题Win11 24H2 现在使用ENSP的问题解决了

一、Win11 24H2 现在使用ENSP的问题解决了 这个Win11 的 24H2不能使用ENSP的问题已经困扰我们很久了&#xff0c;在之前的文章中&#xff0c;我们也有说明这个问题 之前ENSP肯定启动会报错40 当时还建议大家先不要更新到win11的24H2版本&#xff0c;现在终于迎来了更新&#…...

五、用例篇

Bug等级&#xff1a;崩溃、严重、一般、次要 bug的生命周期 面试高频考题&#xff1a;跟开发产生争执怎么办&#xff1f; (1)反思自己&#xff0c;是不是bug描述写的不清楚 (2)站在用户思考问题&#xff0c;反问开发人员&#xff1a;“如果你是用户&#xff0c;你能接受这样…...

Mysql中的数据类型和语句概述

Mysql中的数据类型 数值类 整数&#xff1a;int&#xff0c;四个字节构成 浮点型&#xff1a;float单精度浮点数&#xff0c;四个字节&#xff0c;double双精度浮点数&#xff0c;八个字节&#xff0c;decimal用于高精度计算&#xff0c;尤其是在金融领域。decimal&#xff…...

Vue3连接MQTT作为客户端

先下载依赖 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api创建 mes.js // 导入axios import axios from axios;// 定义一个变量,记录公共的前缀, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…...

VLC快速制作rtsp流媒体服务器

1.安装vlc media player工具 2.打开后点击菜单 媒体->流 3.添加mp4视频&#xff0c;选择串流 4.选择 下一个 5.新目标选择 RTSP&#xff0c;点击添加按钮 6.端口和路径随便填写&#xff0c;如果推流失败就换个端口。一路操作下去 7.点击 流 按钮后&#xff0c;就可以看到下图…...

24FIC

一&#xff0c;赛前准备 检材密码&#xff1a;2024Fic杭州Powered~by~HL! 案情简介&#xff1a; 2024年4月&#xff0c;卢某报案至警方&#xff0c;声称自己疑似遭受了“杀猪盘”诈骗&#xff0c;大量钱财被骗走。卢某透露&#xff0c;在与某公司交流过程中结识了员工李某。李某…...

P3367 【模板】并查集

题目链接&#xff1a;点击进入 题目 思路 代码&#xff08;路径压缩&#xff09; #include <bits/stdc.h> using namespace std; const int maxn 1e6 10;int n,m,fa[maxn];int find(int x) {if(xfa[x]) return x;else return fa[x]find(fa[x]); }int unions(int x,…...

【leetcode hot 100 300】最长递增子序列

错误解法&#xff1a;在每次更新db[i]时&#xff0c;如果当前nums[i]>nums[i-1]就db[i-1]1&#xff0c;否则db[i-1] class Solution {public int lengthOfLIS(int[] nums) {int n nums.length;int[] db new int[n]; // db[i]表示到i的最长严格递增子序列的长度db[0] 1;f…...

jwt.io学习

jwt.io 是一个专门用于 JSON Web Token&#xff08;JWT&#xff09;相关操作和学习的网站&#xff0c;地址是&#xff1a;JSON Web Tokens - jwt.io具有以下主要功能&#xff1a; JWT 解码&#xff1a;能够将 JWT 令牌进行解码&#xff0c;展示出令牌中包含的各个部分&#xf…...

MySQL 优化方案大全

一、数据库设计优化 1. 表结构设计 合理选择字段类型&#xff1a; 使用最小满足需求的类型&#xff08;如TINYINT代替INT&#xff09;字符串类型优先VARCHAR&#xff0c;固定长度用CHAR 时间类型用TIMESTAMP&#xff08;4字节&#xff09;或DATETIME&#xff08;8字节&#xf…...

题目 2701: 蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组)

题目 2701: 蓝桥杯2022年第十三届决赛真题-取模&#xff08;C/C/Java组&#xff09; 时间限制: 3s 内存限制: 512MB 提交: 6633 解决: 1263 题目描述 给定 n, m &#xff0c;问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x n mod y 。 输入格式 输入包含多…...

【LeetCode 题解】算法:36.有效的数独

一、问题剖析 在算法领域中&#xff0c;数独问题是一个经典且有趣的逻辑验证题目。本题的核心任务是判断一个给定的 9x9 数独是否有效。判断的依据是数独的基本规则&#xff1a;数字 1-9 在每一行、每一列以及每一个 3x3 的宫内都只能出现一次。同时&#xff0c;题目中明确指出…...

C++学习之MYSQL数据库

目录 1.mysql数据库介绍 2.mysql数据库安装 3.mysql数据库启动和登录 4.mysql数据库CURD 5.mysql数据库表CURD 6.mysql数据库数据CURD 7.mysql基础综合练习 8.mysql数据库总日期和时间函数 9.mysql中函数 10.PLSQL工具使用介绍 11.ORACLE实例别名和ORACLE客户端 12.…...

Node.js 开发的简单 Web 服务器代码

步骤 1&#xff1a;创建项目文件 新建名为 app.js 的文件&#xff0c;添加以下代码&#xff1a; // 1. 导入内置 http 模块 const http require(http);// 2. 创建服务器实例 const server http.createServer((req, res) > {// 设置响应头res.writeHead(200, { Content-T…...

Postgresql安装mysql_fdw并映射MySQL数据库

关于Postgresql映射Mysql数据库数据 领导&#xff1a;小汪啊&#xff0c;他们的数据库是不是能连接上了。 我&#xff1a;对啊&#xff0c;我已经读数据了。 领导&#xff1a;那改一下吧&#xff0c;直接把他们的数据映射过来&#xff0c;体现一下我们功能的多样性。 我&#…...

flutter 获取通话记录和通讯录

Dart SDK version is 3.7.01 dependencies:flutter:sdk: flutterpermission_handler: ^11.0.1 # 权限管理flutter_contacts: ^1.1.92call_log: ^5.0.5cupertino_icons: ^1.0.8dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0 2 contact_and_calls_page.da…...

AICon 2024年全球人工智能与大模型开发与应用大会(脱敏)PPT汇总(36份).zip

AICon 2024年全球人工智能与大模型开发与应用大会&#xff08;脱敏&#xff09;PPT汇总&#xff08;36份&#xff09;.zip 1、面向开放域的大模型智能体.pdf 2、企业一站式 AI 智能体构建平台演进实践.pdf 3、PPIO 模型平台出海实战&#xff0c;跨地域业务扩展中的技术优化之道…...

swift菜鸟教程6-10(运算符,条件,循环,字符串,字符)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 运算符算术运算符比较运算符逻辑运算符位运算符赋值运算区间运算符其他运算符 2.Swift 条件语句3.Swift 循环4.Swift 字符串字符串属性 isEmpty字符串常量let 变量var字符串中插入值字符串连接字符串长度 String.count使用…...

【14】RUST高级特性

文章目录 不安全操作裸指针应用 不安全函数or方法extern调用外部函数调用C语言函数创建供C调用的接口 全局变量&#xff08;静态变量&#xff09;不安全的trait访问联合体中的字段 不安全操作 裸指针 需要程序员保证有效性 从引用创建 let mut num 5; let r1 &num as …...

Linux 系统中 `echo`、`cat`、`tail`、`grep` 四个常用命令介绍

以下是 Linux 系统中 echo、cat、tail、grep 四个常用命令的详细介绍&#xff0c;涵盖其功能、常用选项及实际示例&#xff1a; 1. echo - 输出文本 作用&#xff1a;将文本或变量的值输出到终端或文件。常用于脚本中的信息提示或日志记录。 常用选项&#xff1a; 选项说明-…...

Python 根据多个下标向列表中插入对应的值的巧妙方法:逆序插入

例如根据多个下标&#xff08;比如2, 5, 8&#xff09;向列表中插入对应的值&#xff0c;即&#xff1a; 在位置2插入一个值A&#xff0c;在位置5插入一个值B&#xff0c;在位置8插入一个值C&#xff0c; 而且每次插入都会改变列表长度&#xff0c;所以后续位置也会发生偏移。…...

“实时滚动”插件:一个简单的基于vue.js的无缝滚动

1、参考连接&#xff1a; 安装 | vue-seamless-scroll 2、使用步骤&#xff1a; 第一步&#xff1a;安装 yarn add vue-seamless-scroll 第二步&#xff1a;引入 import vueSeamlessScroll from vue-seamless-scroll/src 第三步&#xff1a;注册 components: { vueSeamless…...

【Vue3 + Element-Plus】TreeTransfer树形穿梭框组件

基于 Element Plus 实现高效树形穿梭框组件 组件概述 本组件实现了一个基于 Element Plus 的双树形结构穿梭框&#xff0c;支持以下核心功能&#xff1a; 树形结构数据展示节点多选与批量转移展开状态记忆双向数据同步节点禁用与过滤全选/全不选功能&#xff08;待完善&#…...

014_多线程

多线程 多线程创建线程方式一&#xff1a;继承Thread类方式二&#xff1a;实现Runable接口方式三&#xff1a;实现Callbale接口 Thread的常用方法线程安全线程同步方式一&#xff1a;同步代码块同步方法方式三&#xff1a;Lock锁 线性池创建线程池处理Runnable任务处理Callable…...

vue自定义颜色选择器

vue自定义颜色选择器 效果图&#xff1a; step0: 默认写法 调用系统自带的颜色选择器 <input type"color">step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"container"><!-- 颜…...

(十五)安卓开发中不同类型的view之间继承关系详解

在安卓开发中&#xff0c;View 是所有 UI 组件的基类&#xff0c;不同类别的 View 通过继承关系扩展和特化功能&#xff0c;以满足多样化的界面需求。以下将详细讲解常见 View 类别的继承关系&#xff0c;并结合代码示例和使用场景进行说明。 1. View 继承关系: java.lang.Obj…...

Linux 入门七:从基础到进阶的文件操作

一、Linux 文件系统基础&#xff1a;一切皆文件的哲学 在 Linux 的世界里&#xff0c;“一切皆文件” 是核心设计哲学。无论是普通文件、目录、设备&#xff08;如硬盘、串口&#xff09;&#xff0c;还是网络套接字&#xff0c;都被抽象为文件模型&#xff0c;通过统一的接口…...

DeepSeek的神经元革命:穿透搜索引擎算法的下一代内容基建

DeepSeek的神经元革命&#xff1a;穿透搜索引擎算法的下一代内容基建 ——从语义网络到价值共识的范式重构 一、搜索引擎的“内容饥渴症”与AI的基建使命 2024年Q1数据显示&#xff0c;百度索引网页总数突破3500亿&#xff0c;但用户点击集中在0.78%的高价值页面。这种“数据…...

【时时三省】(C语言基础)用switch语句实现多分支选择结构 例题

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 例题&#xff1a; 用switch语句处理菜单命令。在许多应用程序中&#xff0c;用菜单对流程进行控制&#xff0c;例如从键盘输入一个 A 或 a 字符&#xff0c;就会执行A操作&#xff0c;输入一…...

CMake macro

CMake中的macro主要用于在调用处直接展开代码&#xff0c;类似于文本替换&#xff0c;其作用类似于C语言的#define宏&#xff0c;但具备更复杂的结构。以下是详细分析&#xff1a; 1. macro的作用 代码展开&#xff1a;调用宏时&#xff0c;其内容会原地展开&#xff0c;如同…...

高防服务器防御DDoS全解析——从架构设计到实战对抗

本文系统阐述高防服务器对抗DDoS攻击的技术原理与实施路径&#xff0c;深度剖析BGP线路、流量清洗、协议栈优化等关键技术&#xff0c;结合2024年最新攻击案例与Gartner防御框架&#xff0c;提供企业级防御体系构建指南&#xff0c;涵盖硬件选型、策略配置、合规审计等全生命周…...

高防IP如何构筑DDoS防线?_解析抗攻击核心技术体系

本文深度解析高防IP防御DDoS攻击的技术实现路径&#xff0c;涵盖流量清洗机制、智能调度策略、混合防护架构三大核心技术体系。通过2023年某金融平台800Gbps混合攻击实战案例&#xff0c;结合Gartner最新防护成熟度模型&#xff0c;给出高防IP部署的六步实施框架与成本优化方案…...

RDD行动算子和累加器

RDD行动算子&#xff1a; 是能触发真正计算数据的算子 reduce:聚集RDD元素 collect:返回数据集所有元素 foreach:分布式遍历元素 count:返回元素个数: first:返回首个元素 take:返回前n个元素 takeOrdered:返回排序后的前n个元素 aggregate:分区和分区间数据聚合 fol…...

【计算机网络】同步操作 vs 异步操作:核心区别与实战场景解析

&#x1f4cc; 引言 在网络通信和分布式系统中&#xff0c;**同步&#xff08;Synchronous&#xff09;和异步&#xff08;Asynchronous&#xff09;**是两种基础却易混淆的操作模式。本文将通过代码示例、生活类比和对比表格&#xff0c;帮你彻底理解它们的区别与应用场景。 1…...

iframe学习与应用场景指南

一、iframe核心原理与学习路径 1. 嵌套网站的本质原理 技术特性&#xff1a; • 浏览器为每个iframe创建独立的window对象和DOM环境 • 资源独立加载&#xff1a;子页面拥有自己的CSS/JS/Cookie作用域 • 跨域限制&#xff1a;同源策略下无法直接访问DOM&#xff08;需CORS或…...

基于SSM的线上花店鲜花销售商城网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【大模型理论篇】Search-R1: 通过强化学习训练LLM推理与利⽤搜索引擎

最近基于强化学习框架来实现大模型在推理和检索能力增强的项目很多&#xff0c;也是Deep Research技术持续演进的缩影。之前我们讨论过《R1-Searcher:通过强化学习激励llm的搜索能⼒》&#xff0c;今天我们分析下Search-R1【1】。 1. 研究背景与问题 ⼤模型&#xff08;LLM&a…...

错误码code:9568282 error: install releaseType target not same怎么处理?

目录 1.背景 2.解决方案 1.背景 当前是由于应用从4.1版本升级到5.0版本,然后安装应用会报错9568282 ,如果签名是一致的&#...

qt联动其他库实现一个客户端(本章主要是概述如何实现)

一.服务器功能 1.能连接多个客户端通信 2.负责统计与手机客户端的数据 3.遇到客户端请求数据时能检索数据库并发送对应数据 4.服务器需要能连接到公网 5.服务器需要有账号密码登录功能 6.服务器要有日志与管理员系统能统计信息 二.客户端 1.客户端需要有登录界面 2.客户端需要…...

爱普生FC1610AN5G手机中替代传统晶振的理想之选

在 5G 技术引领的通信新时代&#xff0c;手机性能面临前所未有的挑战与机遇。从高速数据传输到多任务高效处理&#xff0c;从长时间续航到紧凑轻薄设计&#xff0c;每一项提升都离不开内部精密组件的协同优化。晶振&#xff0c;作为为手机各系统提供稳定时钟信号的关键元件&…...

SpringMVC基础二(RestFul、接收数据、视图跳转)

ReauestMapping ReauestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上&#xff0c;用于类上&#xff0c;表示类中的所有响应请求的方法都是以该地址作为父路径。 创建一个新项目&#xff1a;设置为web项目 编写web.xml&#xff08;此配置也几…...

BERT - 段嵌入(Segment Embedding)

1. 段嵌入&#xff08;Segment Embedding&#xff09;的作用 在BERT模型中&#xff0c;段嵌入的主要作用是区分不同的句子。具体来说&#xff1a; 单句任务&#xff1a;所有位置的段嵌入都是0。 句子对任务&#xff1a;第一个句子的所有位置使用段嵌入0&#xff0c;第二个句子…...

Kaggle-Disaster Tweets-(二分类+NLP+模型融合)

Disaster Tweets 题意&#xff1a; 就是给出一个dataframe包含text这一列代表着文本&#xff0c;文本会有一些词&#xff0c;问对于每条记录中的text是真关于灾难的还是假关于灾难的。 比如我们说今天作业真多&#xff0c;这真是一场灾难。实际上这个灾难只是我们调侃而言的。…...

关于哈希冲突的讨论

文章目录 1. 什么是哈希冲突&#xff1f;2. 为什么会产生哈希冲突&#xff1f;3. 如何解决哈希冲突&#xff1f;4. 为什么哈希算法一定会产生冲突&#xff1f;5. 存在不发生冲突的哈希算法吗&#xff1f;6. 为什么不用无冲突的哈希算法&#xff08;如完美哈希&#xff09;&…...

傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻

2025年4月11日&#xff0c;上海——通用机器人公司傅利叶正式发布首款开源人形机器人 Fourier N1&#xff0c;并同步开放涵盖物料清单、设计图纸、装配指南、基础操作软件在内的完整本体资源包。作为傅利叶 “Nexus 开源生态矩阵” 的首个落地项目&#xff08;“N1” 即 “Nexu…...

2020年INS SCI1区TOP:平衡复合运动优化算法BCMO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 元启发式算法因其强大的鲁棒性和简便的编程方式&#xff0c;在优化领域中发挥着重要作用。本文提出了一种基于平衡复合运动优化算法BCMO&#xff0c;其核心思想是在解空间中平衡个体的复合运动特性。通过概率选择…...

2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(3卷)任务书

2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷&#xff08;3卷&#xff09;任务书 背景描述&#xff1a;模块A&#xff1a;大数据平台搭建&#xff08;容器环境&#xff09;&#xff08;15分&#xff09;任务一&#xff1a;Hadoop HA安装部署任务二&#x…...

Express中间件(Middleware)详解:从零开始掌握(4)

下面我将为你提供四个实战项目的完整实现代码&#xff0c;每个项目都展示了Express中间件的实际应用场景。 1. API网关实现 const express require(express); const rateLimit require(express-rate-limit); const helmet require(helmet); const morgan require(morgan)…...

Ubuntu22环境下,Docker部署阿里FunASR的gpu版本

番外: 随着deepseek的爆火,人工智能相关的开发变得异常火爆,相关的大模型开发很常见的agent智能体需要ASR语音识别的功能,阿里开源的FunASR几乎是把一个商业的项目放给我们使用了。那么我们项目中的生产环境怎么部署gpu版本的语音识别服务呢?经过跟deepseek的一上午的极限…...