学习threejs,使用ShaderMaterial自定义着色器材质
👨⚕️ 主页: gis分享者
👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨⚕️ 收录于专栏:threejs gis工程师
文章目录
- 一、🍀前言
- 1.1 ☘️THREE.ShaderMaterial
- 1.1.1 ☘️注意事项
- 1.1.2 ☘️构造函数
- 1.1.3 ☘️属性
- 1.1.4 ☘️方法
- 二、🍀使用ShaderMaterial自定义着色器材质
- 1. ☘️实现思路
- 2. ☘️代码样例
一、🍀前言
本文详细介绍如何基于threejs在三维场景中使用ShaderMaterial自定义着色器材质,亲测可用。希望能帮助到您。一起学习,加油!加油!
1.1 ☘️THREE.ShaderMaterial
THREE.ShaderMaterial使用自定义shader渲染的材质。 shader是一个用GLSL编写的小程序 ,在GPU上运行。
1.1.1 ☘️注意事项
- ShaderMaterial 只有使用 WebGLRenderer 才可以绘制正常, 因为 vertexShader 和
fragmentShader 属性中GLSL代码必须使用WebGL来编译并运行在GPU中。 - 从 THREE r72开始,不再支持在ShaderMaterial中直接分配属性。 必须使用
BufferGeometry实例,使用BufferAttribute实例来定义自定义属性。 - 从 THREE r77开始,WebGLRenderTarget 或 WebGLCubeRenderTarget
实例不再被用作uniforms。 必须使用它们的texture 属性。 - 内置attributes和uniforms与代码一起传递到shaders。
如果您不希望WebGLProgram向shader代码添加任何内容,则可以使用RawShaderMaterial而不是此类。 - 您可以使用指令#pragma unroll_loop_start,#pragma unroll_loop_end
以便通过shader预处理器在GLSL中展开for循环。 该指令必须放在循环的正上方。循环格式必须与定义的标准相对应。 - 循环必须标准化normalized。
- 循环变量必须是i。
- 对于给定的迭代,值 UNROLLED_LOOP_INDEX 将替换为 i 的显式值,并且可以在预处理器语句中使用。
#pragma unroll_loop_start
for ( int i = 0; i < 10; i ++ ) {// ...}
#pragma unroll_loop_end
代码示例
const material = new THREE.ShaderMaterial( {uniforms: {time: { value: 1.0 },resolution: { value: new THREE.Vector2() }},vertexShader: document.getElementById( 'vertexShader' ).textContent,fragmentShader: document.getElementById( 'fragmentShader' ).textContent
} );
1.1.2 ☘️构造函数
ShaderMaterial( parameters : Object )
parameters - (可选)用于定义材质外观的对象,具有一个或多个属性。 材质的任何属性都可以从此处传入(包括从Material继承的任何属性)。
1.1.3 ☘️属性
共有属性请参见其基类Material。
.clipping : Boolean
定义此材质是否支持剪裁; 如果渲染器传递clippingPlanes uniform,则为true。默认值为false。
.defaultAttributeValues : Object
当渲染的几何体不包含这些属性但材质包含这些属性时,这些默认值将传递给shaders。这可以避免在缓冲区数据丢失时出错。
this.defaultAttributeValues = {'color': [ 1, 1, 1 ],'uv': [ 0, 0 ],'uv2': [ 0, 0 ]
};
.defines : Object
使用 #define 指令在GLSL代码为顶点着色器和片段着色器定义自定义常量;每个键/值对产生一行定义语句:
defines: {FOO: 15,BAR: true
}
这将在GLSL代码中产生如下定义语句:
#define FOO 15
#define BAR true
.extensions : Object
一个有如下属性的对象:
this.extensions = {derivatives: false, // set to use derivativesfragDepth: false, // set to use fragment depth valuesdrawBuffers: false, // set to use draw buffersshaderTextureLOD: false // set to use shader texture LOD
};
.fog : Boolean
定义材质颜色是否受全局雾设置的影响; 如果将fog uniforms传递给shader,则为true。默认值为false。
.fragmentShader : String
片元着色器的GLSL代码。这是shader程序的实际代码。在上面的例子中, vertexShader 和 fragmentShader 代码是从DOM(HTML文档)中获取的; 它也可以作为一个字符串直接传递或者通过AJAX加载。
.glslVersion : String
定义自定义着色器代码的 GLSL 版本。仅与 WebGL 2 相关,以便定义是否指定 GLSL 3.0。有效值为 THREE.GLSL1 或 THREE.GLSL3。默认为空。
.index0AttributeName : String
如果设置,则调用gl.bindAttribLocation 将通用顶点索引绑定到属性变量。默认值未定义。
.isShaderMaterial : Boolean
只读标志,用于检查给定对象是否属于 ShaderMaterial 类型。
.lights : Boolean
材质是否受到光照的影响。默认值为 false。如果传递与光照相关的uniform数据到这个材质,则为true。默认是false。
.linewidth : Float
控制线框宽度。默认值为1。
由于OpenGL Core Profile与大多数平台上WebGL渲染器的限制,无论如何设置该值,线宽始终为1。
.flatShading : Boolean
定义材质是否使用平面着色进行渲染。默认值为false。
.uniforms : Object
如下形式的对象:
{ "uniform1": { value: 1.0 }, "uniform2": { value: 2 } }
指定要传递给shader代码的uniforms;键为uniform的名称,值(value)是如下形式:
{ value: 1.0 }
这里 value 是uniform的值。名称必须匹配 uniform 的name,和GLSL代码中的定义一样。 注意,uniforms逐帧被刷新,所以更新uniform值将立即更新GLSL代码中的相应值。
.uniformsNeedUpdate : Boolean
可用于在 Object3D.onBeforeRender() 中更改制服时强制进行制服更新。默认为假。
.vertexColors : Boolean
定义是否使用顶点着色。默认为假。
.vertexShader : String
顶点着色器的GLSL代码。这是shader程序的实际代码。 在上面的例子中,vertexShader 和 fragmentShader 代码是从DOM(HTML文档)中获取的; 它也可以作为一个字符串直接传递或者通过AJAX加载。
.wireframe : Boolean
将几何体渲染为线框(通过GL_LINES而不是GL_TRIANGLES)。默认值为false(即渲染为平面多边形)。
.wireframeLinewidth : Float
控制线框宽度。默认值为1。
由于OpenGL Core Profile与大多数平台上WebGL渲染器的限制,无论如何设置该值,线宽始终为1。
1.1.4 ☘️方法
共有方法请参见其基类Material。
.clone () : ShaderMaterial this : ShaderMaterial
创建该材质的一个浅拷贝。需要注意的是,vertexShader和fragmentShader使用引用拷贝; attributes的定义也是如此; 这意味着,克隆的材质将共享相同的编译WebGLProgram; 但是,uniforms 是 值拷贝,这样对不同的材质我们可以有不同的uniforms变量。
二、🍀使用ShaderMaterial自定义着色器材质
1. ☘️实现思路
首先创建6个面着色器fragment-shader-1到fragment-shader-6。
- 1、初始化renderer渲染器。
- 2、初始化Scene三维场景scene。
- 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt。
- 4、创建THREE.AmbientLight环境光源ambientLight,设置环境光ambientLight颜色,scene场景加入环境光源ambientLight。创建THREE.SpotLight聚光灯光源spotLight,设置聚光灯光源位置和投影,scene场景加入spotLight。
- 5、加载几何模型:定义createMaterial方法用于创建ShaderMaterial自定义着色器材质,创建立方体集合对象cubeGeometry,调用createMaterial方法创建6个ShaderMaterial自定义着色器材质对象从meshMaterial1到meshMaterial6,传入创建的6个ShaderMaterial自定义着色器材质对象,创建MeshFaceMaterial几何体面材质对象material。传入cubeGeometry和material创建立方体网格对象cube,scene场景加入cube。定义render方法,实现立方体对象cube的旋转动画。具体代码参考下面代码样例。
- 6、加入stats监控器,监控帧数信息。
2. ☘️代码样例
<!DOCTYPE html>
<html>
<head><title>学习threejs,使用ShaderMaterial自定义着色器材质</title><script type="text/javascript" src="../libs/three.js"></script><script type="text/javascript" src="../libs/stats.js"></script><script type="text/javascript" src="../libs/dat.gui.js"></script><style>body {/* set margin to 0 and overflow to hidden, to go fullscreen */margin: 0;overflow: hidden;}</style>
</head>
<body><script id="vertex-shader" type="x-shader/x-vertex">uniform float time;varying vec2 vUv;void main(){vec3 posChanged = position;posChanged.x = posChanged.x*(abs(sin(time*1.0)));posChanged.y = posChanged.y*(abs(cos(time*1.0)));posChanged.z = posChanged.z*(abs(sin(time*1.0)));//gl_Position = projectionMatrix * modelViewMatrix * vec4(position*(abs(sin(time)/2.0)+0.5),1.0);gl_Position = projectionMatrix * modelViewMatrix * vec4(posChanged,1.0);}</script><script id="fragment-shader-1" type="x-shader/x-fragment">precision highp float;uniform float time;uniform float alpha;uniform vec2 resolution;varying vec2 vUv;void main2(void){vec2 position = vUv;float red = 1.0;float green = 0.25 + sin(time) * 0.25;float blue = 0.0;vec3 rgb = vec3(red, green, blue);vec4 color = vec4(rgb, alpha);gl_FragColor = color;}#define PI 3.14159#define TWO_PI (PI*2.0)#define N 68.5void main(void){vec2 center = (gl_FragCoord.xy);center.x=-10.12*sin(time/200.0);center.y=-10.12*cos(time/200.0);vec2 v = (gl_FragCoord.xy - resolution/20.0) / min(resolution.y,resolution.x) * 15.0;v.x=v.x-10.0;v.y=v.y-200.0;float col = 0.0;for(float i = 0.0; i < N; i++){float a = i * (TWO_PI/N) * 61.95;col += cos(TWO_PI*(v.y * cos(a) + v.x * sin(a) + sin(time*0.004)*100.0 ));}col /= 5.0;gl_FragColor = vec4(col*1.0, -col*1.0,-col*4.0, 1.0);}</script><script id="fragment-shader-2" type="x-shader/x-fragment">uniform float time;uniform vec2 resolution;#define CGFloat float#define M_PI 3.14159265359vec3 hsvtorgb(float h, float s, float v){float c = v * s;h = mod((h * 6.0), 6.0);float x = c * (1.0 - abs(mod(h, 2.0) - 1.0));vec3 color;if (0.0 <= h && h < 1.0){color = vec3(c, x, 0.0);}else if (1.0 <= h && h < 2.0){color = vec3(x, c, 0.0);}else if (2.0 <= h && h < 3.0){color = vec3(0.0, c, x);}else if (3.0 <= h && h < 4.0){color = vec3(0.0, x, c);}else if (4.0 <= h && h < 5.0){color = vec3(x, 0.0, c);}else if (5.0 <= h && h < 6.0){color = vec3(c, 0.0, x);}else{color = vec3(0.0);}color += v - c;return color;}void main(void){vec2 position = (gl_FragCoord.xy - 0.5 * resolution) / resolution.y;float x = position.x;float y = position.y;CGFloat a = atan(x, y);CGFloat d = sqrt(x*x+y*y);CGFloat d0 = 0.5*(sin(d-time)+1.5)*d;CGFloat d1 = 5.0;CGFloat u = mod(a*d1+sin(d*10.0+time), M_PI*2.0)/M_PI*0.5 - 0.5;CGFloat v = mod(pow(d0*4.0, 0.75),1.0) - 0.5;CGFloat dd = sqrt(u*u+v*v);CGFloat aa = atan(u, v);CGFloat uu = mod(aa*3.0+3.0*cos(dd*30.0-time), M_PI*2.0)/M_PI*0.5 - 0.5;// CGFloat vv = mod(dd*4.0,1.0) - 0.5;CGFloat d2 = sqrt(uu*uu+v*v)*1.5;gl_FragColor = vec4( hsvtorgb(dd+time*0.5/d1, sin(dd*time), d2), 1.0 );}</script><script id="fragment-shader-3" type="x-shader/x-fragment">uniform vec2 resolution;uniform float time;vec2 rand(vec2 pos){return fract( 0.00005 * (pow(pos+2.0, pos.yx + 1.0) * 22222.0));}vec2 rand2(vec2 pos){return rand(rand(pos));}float softnoise(vec2 pos, float scale){vec2 smplpos = pos * scale;float c0 = rand2((floor(smplpos) + vec2(0.0, 0.0)) / scale).x;float c1 = rand2((floor(smplpos) + vec2(1.0, 0.0)) / scale).x;float c2 = rand2((floor(smplpos) + vec2(0.0, 1.0)) / scale).x;float c3 = rand2((floor(smplpos) + vec2(1.0, 1.0)) / scale).x;vec2 a = fract(smplpos);return mix(mix(c0, c1, smoothstep(0.0, 1.0, a.x)),mix(c2, c3, smoothstep(0.0, 1.0, a.x)),smoothstep(0.0, 1.0, a.y));}void main(void){vec2 pos = gl_FragCoord.xy / resolution.y;pos.x += time * 0.1;float color = 0.0;float s = 1.0;for(int i = 0; i < 8; i++){color += softnoise(pos+vec2(i)*0.02, s * 4.0) / s / 2.0;s *= 2.0;}gl_FragColor = vec4(color);}</script><script id="fragment-shader-4" type="x-shader/x-fragment">uniform float time;uniform vec2 resolution;vec2 rand(vec2 pos){returnfract((pow(pos+2.0,pos.yx+2.0)*555555.0));}vec2 rand2(vec2 pos){return rand(rand(pos));}float softnoise(vec2 pos, float scale) {vec2 smplpos = pos * scale;float c0 = rand2((floor(smplpos) + vec2(0.0, 0.0)) / scale).x;float c1 = rand2((floor(smplpos) + vec2(1.0, 0.0)) / scale).x;float c2 = rand2((floor(smplpos) + vec2(0.0, 1.0)) / scale).x;float c3 = rand2((floor(smplpos) + vec2(1.0, 1.0)) / scale).x;vec2 a = fract(smplpos);return mix(mix(c0, c1, smoothstep(0.0, 1.0, a.x)),mix(c2, c3, smoothstep(0.0, 1.0, a.x)),smoothstep(0.0, 1.0, a.x));}void main( void ) {vec2 pos = gl_FragCoord.xy / resolution.y - time * 0.4;float color = 0.0;float s = 1.0;for (int i = 0; i < 6; ++i) {color += softnoise(pos + vec2(0.01 * float(i)), s * 4.0) / s / 2.0;s *= 2.0;}gl_FragColor = vec4(color,mix(color,cos(color),sin(color)),color,1);}</script><script id="fragment-shader-5" type="x-shader/x-fragment">uniform float time;uniform vec2 resolution;// tie nd die by Snoep Games.void main( void ) {vec3 color = vec3(1.0, 0., 0.);vec2 pos = (( 1.4 * gl_FragCoord.xy - resolution.xy) / resolution.xx)*1.5;float r=sqrt(pos.x*pos.x+pos.y*pos.y)/15.0;float size1=2.0*cos(time/60.0);float size2=2.5*sin(time/12.1);float rot1=13.00; //82.0+16.0*sin(time/4.0);float rot2=-50.00; //82.0+16.0*sin(time/8.0);float t=sin(time);float a = (60.0)*sin(rot1*atan(pos.x-size1*pos.y/r,pos.y+size1*pos.x/r)+time);a += 200.0*acos(pos.x*2.0+cos(time/2.0))+asin(pos.y*5.0+sin(time/2.0));a=a*(r/50.0);a=200.0*sin(a*5.0)*(r/30.0);if(a>5.0) a=a/200.0;if(a<0.5) a=a*22.5;gl_FragColor = vec4( cos(a/20.0),a*cos(a/200.0),sin(a/8.0), 1.0 );}</script><script id="fragment-shader-6" type="x-shader/x-fragment">uniform float time;uniform vec2 resolution;void main( void ){vec2 uPos = ( gl_FragCoord.xy / resolution.xy );//normalize wrt y axis//suPos -= vec2((resolution.x/resolution.y)/2.0, 0.0);//shift origin to centeruPos.x -= 1.0;uPos.y -= 0.5;vec3 color = vec3(0.0);float vertColor = 2.0;for( float i = 0.0; i < 15.0; ++i ){float t = time * (0.9);uPos.y += sin( uPos.x*i + t+i/2.0 ) * 0.1;float fTemp = abs(1.0 / uPos.y / 100.0);vertColor += fTemp;color += vec3( fTemp*(10.0-i)/10.0, fTemp*i/10.0, pow(fTemp,1.5)*1.5 );}vec4 color_final = vec4(color, 1.0);gl_FragColor = color_final;}</script><div id="Stats-output">
</div>
<!-- Div which will hold the Output -->
<div id="WebGL-output">
</div><!-- Js 代码块-->
<script type="text/javascript">// 初始化function init() {var stats = initStats();// 创建三维场景scenevar scene = new THREE.Scene();// 创建相机var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);// 创建渲染器并设置大小var renderer = new THREE.WebGLRenderer();renderer.setClearColor(new THREE.Color(0x000000, 1.0));renderer.setSize(window.innerWidth, window.innerHeight);renderer.shadowMapEnabled = true;var cubeGeometry = new THREE.BoxGeometry(20, 20, 20);var meshMaterial1 = createMaterial("vertex-shader", "fragment-shader-1");var meshMaterial2 = createMaterial("vertex-shader", "fragment-shader-2");var meshMaterial3 = createMaterial("vertex-shader", "fragment-shader-3");var meshMaterial4 = createMaterial("vertex-shader", "fragment-shader-4");var meshMaterial5 = createMaterial("vertex-shader", "fragment-shader-5");var meshMaterial6 = createMaterial("vertex-shader", "fragment-shader-6");var material = new THREE.MeshFaceMaterial([meshMaterial1,meshMaterial2,meshMaterial3,meshMaterial4,meshMaterial5,meshMaterial6]);
// var material = new THREE.MeshFaceMaterial([meshMaterial2, meshMaterial2, meshMaterial1, meshMaterial1, meshMaterial1, meshMaterial1]);var cube = new THREE.Mesh(cubeGeometry, material);// 场景中添加立方体网格对象scene.add(cube);// 设置相机位置和方向camera.position.x = 30;camera.position.y = 30;camera.position.z = 30;camera.lookAt(new THREE.Vector3(0, 0, 0));// 添加环境光源var ambientLight = new THREE.AmbientLight(0x0c0c0c);scene.add(ambientLight);// 添加聚光灯光源,设置位置和投影var spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(-40, 60, -10);spotLight.castShadow = true;scene.add(spotLight);document.getElementById("WebGL-output").appendChild(renderer.domElement);var step = 0;render();function render() {stats.update();// 立方体旋转动画cube.rotation.y = step += 0.01;cube.rotation.x = step;cube.rotation.z = step;// 着色器更新cube.material.materials.forEach(function (e) {e.uniforms.time.value += 0.01;});requestAnimationFrame(render);renderer.render(scene, camera);}function initStats() {var stats = new Stats();stats.setMode(0);stats.domElement.style.position = 'absolute';stats.domElement.style.left = '0px';stats.domElement.style.top = '0px';document.getElementById("Stats-output").appendChild(stats.domElement);return stats;}function createMaterial(vertexShader, fragmentShader) {var vertShader = document.getElementById(vertexShader).innerHTML;var fragShader = document.getElementById(fragmentShader).innerHTML;var attributes = {};var uniforms = {time: {type: 'f', value: 0.2},scale: {type: 'f', value: 0.2},alpha: {type: 'f', value: 0.6},resolution: {type: "v2", value: new THREE.Vector2()}};uniforms.resolution.value.x = window.innerWidth;uniforms.resolution.value.y = window.innerHeight;var meshMaterial = new THREE.ShaderMaterial({uniforms: uniforms,attributes: attributes,vertexShader: vertShader,fragmentShader: fragShader,transparent: true});return meshMaterial;}}window.onload = init;
</script>
</body>
</html>
效果如下:
相关文章:
学习threejs,使用ShaderMaterial自定义着色器材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ShaderMaterial1.1.1…...
使用 Selenium 和 Requests 自动化获取动态 Referer 和 Sign 的完整指南
在现代网络爬虫和自动化任务中,动态生成的参数(如 Referer 和 Sign)常常是绕过反爬虫机制的关键。本文将详细介绍如何使用 Python 的 Selenium 和 Requests 库,从目标网页中提取动态 Referer 和 Sign,并完成后续的请求…...
1.2.3 使用Spring Initializr方式构建Spring Boot项目
本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着…...
Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替
如题,笔者在Cursor中使用pycharm写python程序,试用期到了Tab自动补全功能就不能用了,安装Codeuim插件可以代替这个功能。步骤如下: 1. 在应用商店中搜索扩展Codeuim,下载安装 2. 安装完成后左下角会弹出提示框&#x…...
Ruby基础
一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串,并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串,()内可以是任何数,自动转义双引号%Q("aaaaa"…...
wzl-django学习
####################################################总的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…...
《AI强化学习:元应用中用户行为引导的智能引擎》
在科技飞速发展的当下,元应用正以前所未有的速度融入我们的生活,从沉浸式的虚拟社交到高度仿真的工作模拟,元应用构建出一个个丰富多彩的虚拟世界。而在这背后,人工智能的强化学习技术宛如一位无形却强大的幕后推手,深…...
Django基础环境准备
Django基础环境准备 文章目录 Django基础环境准备1.准备的环境 win11系统(运用虚拟环境搭建)1.1详见我的资源win11环境搭建 2.准备python环境2.1 winr 打开命令提示符 输入cmd 进入控制台2.2 输入python --version 查看是否有python环境2.3在pyhton官网下…...
机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型
在机器视觉系统中,线阵相机的分时频闪技术通过单次扫描切换不同光源或亮度,实现在一幅图像中捕捉多角度光照效果,从而提升缺陷检测效率并降低成本。以下是分时频闪线阵相机的选型要点及关键考量因素: 一、分时频闪技术的核心需求 多光源同步控制 分时频闪需相机支持多路光源…...
【企业场景】上线的项目如何进行限流
一、常见的四种速率限流算法 对于限流,最为直接的就是速率限流了 固定窗口算法 比如 10r/s 就是把时间线分为 1s 一段,也就是周期为 1s,对一个时间段的请求进行计数,超过 10 则舍弃,未超过则直接处理经过 1s 后&…...
【FL0090】基于SSM和微信小程序的球馆预约系统
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...
用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
Redis和MongoDB是什么? Redis:像你家的“小冰箱”,专门存高频使用的食物(数据)。它是基于内存的键值数据库,读写速度极快(每秒超10万次操作)。比如你每次打开手机App,用…...
软件测试需求分析如何实施?专业软件测试服务公司分享
在现代软件开发中,软件测试需求分析被认为是确保软件质量的关键环节之一。软件测试需求分析是指在软件开发过程中,对测试需求进行系统性分析的过程。它旨在确定软件系统功能、性能及其他非功能性需求的具体细节,从而为后续的测试活动提供指导…...
pg pg_prewarm用法
按照插件 > create extension pg_prewarm ;缓存表 > test# select pg_prewarm(weather,buffer ) ; pg_prewarm > ------------ > 1缓存表部分内容 test# select pg_prewarm(weather,buffer,main,0,0) ;pg_prewarm ------------1 (1 row)表大小只有0号…...
2025年光电科学与智能传感国际学术会议(ICOIS 2025)
重要信息 官网:www.ic-icois.org 时间:2025年3月14-16日 地点:中国-长春 简介 2025年光电科学与智能传感国际学术会议(ICOIS 2025)将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…...
uni小程序wx.switchTab有时候跳转错误tab问题,解决办法
在一个子页面里面使用uni.switchTab或者wx.switchTab跳转到tab菜单的时候,先发送了一个请求,然后执行跳转到tab菜单,但是这个时候,出错了........也是非常的奇怪,不加请求就没问题......但是业务逻辑就是要先执行某个请…...
python-leetcode-下一个排列
31. 下一个排列 - 力扣(LeetCode) class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# Step 1: Find the first decreasing element …...
如何获取mac os 安装盘
发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。 第一种方法 在mac环境下,使用softwareupdate命令来获取mac安装,能获得当前设备支持的系统。 使用这个命令:/usr/sbin/soft…...
常见AI写作工具介绍(ChatGPT 4o、DeepClaude、Claude 3.5 Sonnet 、DeepSeek R1等)
AI写作工具介绍 1. ChatGPT-4o ChatGPT-4o是OpenAI于2024年5月发布的最新旗舰模型,相比之前的版本,它在多模态支持和实时推理能力上有了显著提升。它能够处理和理解音频、图像和文本数据,适用于复杂的图像分析、语音识别等应用场景[1]。 2…...
环境会影响你的决策:K近邻算法(KNN)
环境会影响你的决策:K近邻算法(KNN) 1. 核心思想与流程 KNN是一种基于局部相似性的分类算法,核心思想是“近朱者赤”:待测样本的类别由其最近的k个邻居的多数类别决定。 关键步骤: 定义空间与距离:通常采…...
JMeter 中实现 100 个用户在 3 秒内并发登录
在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...
2-3文件的属性信息
文章目录 1 file命令2 stat命令 1 file命令 用来识别文件类型 # 参数的位置是任意的 file 文件名 [参数]-b 只显示文件类型和文件编码,不显示文件名-i 显示文件的MIME类型-F 设置输出字符串的分隔符-L 查看软链接文件自身文件属性liyblyb:/tmp$ file xxxtmp.log …...
【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)
【【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置) 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前…...
(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议
重点:IDE接入DeepSeek是否收费 收费! 本文章主要是为了给小白避雷,目前很多文章告诉大家怎么接入DeepSeek,但是并未告知大家是否收费。如果是想白嫖的,就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…...
TCP的三次握手与四次挥手:建立与终止连接的关键步骤
引言 TCP(传输控制协议)工作在OSI模型的传输层。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...
CMU15445(2023fall) Project #3 - Query Execution(上)详细分析
晚日寒鸦一片愁 柳塘新绿却温柔 若教眼底无离恨 不信人间有白头 ——鹧鸪天 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determination, we pre…...
.sql文件怎么打开
.sql 文件是一个 SQL 脚本文件,通常包含了数据库的 SQL 查询语句,可以是创建数据库、创建表、插入数据、查询数据等操作。要打开并查看 .sql 文件,你可以使用以下几种方法: 1. 使用文本编辑器打开 .sql 文件是一个文本文件&…...
【Swift 算法实战】城市天际线问题解法
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Linux的软件安装
Linux命令行内的“应用商店” yum命令安装软件。 yum命令: yum:RPM软件管理器,用于自动化安装配置Linux软件,可以自动解决依赖问题。 语法:yum [-y] [install | remove | search] 软件名称 选项:-y。自动确…...
需求和开发模型
文章目录 什么是需求?用户需求软件需求用户需求和软件需求的不同 开发模型什么是“模型”?软件的生命周期常见的开发模型瀑布模型(Waterfall Model)螺旋模型增量模型、迭代模型敏捷模型 测试模型V 模型W 模型(双 V 模型…...
unity学习61:UI布局layout
目录 1 布局 layout 1.1 先准备测试UI,新增这样一组 panel 和 image 1.2 新增 vertical layout 1.3 现在移动任意一个image 都会影响其他 1.3.1 对比 如果没有这个,就会是覆盖效果了 1.3.2 对比 如果没有这个,就会是覆盖效果了 1.4 总结…...
腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析
腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析 腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)作为当前文生图领域的两大代表模型,各自…...
Flume
Flume安装配置 使用的三台主机名称分别为bigdata1,bigdata2,bigdata3。所使用的安装包名称按自己的修改,安装包可去各大官网上下载 1.解压 将Master节点Flume安装包解压到/opt/module目录下 tar -zxvf /opt/software/apache-flume-1.9.0-bi…...
【Python LeetCode】面试经典 150 题
数组 / 字符串快慢指针(双指针)总结88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II Boyer-Moore 投票算法169. 多数元素扩展:寻找 n/3 多数元素 翻转法189. 轮转数组 贪心121. 买卖股票的最佳时机…...
营养助力:进行性核上性麻痹患者的饮食管理
进行性核上性麻痹是一种复杂的神经系统退行性疾病,科学的饮食管理不仅能够改善患者的营养状况,还能为神经系统提供必要的支持,延缓病情进展。 这种疾病会导致吞咽困难、营养吸收障碍等问题,增加营养不良的风险。针对性的饮食调理能…...
spineNET模型详解及代码复现
模型背景 在SpineNet模型诞生之前,多尺度特征融合已成为计算机视觉领域的研究热点。研究者们提出了各种方法来处理不同尺度的特征,如 特征金字塔网络(FPN) 和 深度可分离卷积 。然而,这些方法在跨尺度特征融合方面仍存在局限性。 FPN通过自上而下的路径融合不同尺度的特…...
【Mybatis】如何简单使用mybatis-plus,以及MybatisGenerator自动生成或者实现SQL语句
前言 🌟🌟本期讲解关于mybatis中SQL自动生成的相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆…...
ds-国内主要显卡
国产显卡 寒武纪思元系列 思元 370:采用 7nm 制程工艺及 chiplet 技术,集成 390 亿个晶体管,最大算力高达 256TOPS(INT8)。是国内第一款公开发布支持 LPDDR5 内存的云端 AI 芯片,内存带宽是上一代产品的 3 …...
类和对象——const修饰的类的对象和函数
const修饰的类的对象和函数 const成员函数和const对象1 const成员函数2 调用关系3 const在成员函数中的位置4 取地址&及const取地址操作符重载 const成员函数和const对象 1 const成员函数 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数&…...
防火墙的智能选路与NAT实验
实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问,采取vlan的方式来进行隔离。 在配置vlan之后 ,两个部门将不会通信。 以上是基础配置,只是演示在各个部门不通的情况下,使用什么技术来进行隔离网络,…...
ARM学习(43)armcc HardFault函数链接不到的问题理解
armcc HardFault函数链接不到的问题理解 1、问题背景: 笔者汇编语言编写了一个HardFault异常处理函数,HardFault函数属于芯片架构异常处理函数,没有显著的调用(中断向量表中有该函数地址),且启动函数里面也…...
php序列化与反序列化
文章目录 基础知识魔术方法:在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法?何时触发 __destruct() 方法?用途:语法示例: 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...
【STL】7.STL常用算法(2)
STL常用算法(2) 前言简介四.常用拷贝和替换算法1.copy2.replace3.replace_if4.swap 五.算术生成算法1.accumulate2.fill 六.常用集合算法1.set_intersection2.set_union3.set_difference 总结 前言 stl系列主要讲述有关stl的文章,使用STL可以…...
怎么获取免费的 GPU 资源完成大语言模型(LLM)实验
怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…...
xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研
目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时: 对传入的视频有如下要求: 对传入的视频建议: 识别物体规范 为提高Marker质量,保证算法识别效果,可参考Marker规范文档 Marker规…...
盛京开源社区加入 GitCode,书写东北开源生态新篇章
在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...
【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL
SQL备忘录 from to : 点击访问源地址...
几个api
几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...
(转)Java单例模式(1)
l单例模式的好多:节约了内存,提高了代码的执行效率。...
return和print
目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数,用于将信息输出到控制台(终端)。它主要用于显示程序运行的结果,方便用户查看。print 的作用是输出内容,而不…...