主頁 >  其他 > 3D網頁小實驗-WebGL2中的TransformFeedback

3D網頁小實驗-WebGL2中的TransformFeedback

2021-08-31 19:52:36 其他

OpenGL4.x中,TransformFeedback用來分流頂點著色器或幾何著色器的輸出,并可以將它回傳計算機的記憶體做一些操作,如此,我們就可以使用顯卡的并行計算能力來進行一些計算加速,比如深度學習或區塊鏈,這里記錄如何使用WebGL2在瀏覽器中使用TransformFeedback,

1、原生TransformFeedback的基本流程:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>原生WebGL例子-反寫記憶體</title>
  6     <style>
  7         html, body {
  8             overflow: hidden;
  9             width: 100%;
 10             height: 100%;
 11             margin: 0;
 12             padding: 0;
 13         }
 14         #renderCanvas {
 15             width: 100%;
 16             height: 100%;
 17             touch-action: none;
 18         }
 19     </style>
 20 </head>
 21 <body>
 22     <canvas id="renderCanvas" touch-action="none"></canvas>
 23 </body>
 24 <script>
 25     window.onload=webGLStart;
 26     var canvas,gl;
 27 
 28     function webGLStart()
 29     {
 30         canvas = document.getElementById("renderCanvas");//canvas是html5下的繪圖示簽,可以支持3D繪圖
 31         gl=initGL(canvas);//初始化“繪制背景關系”,以后的繪制都要通過它進行
 32         var vertexShaderSrc="#version 300 es\n" +//這個版本標志必須有!這里必須有換行符
 33             "precision highp float;" +//如果你要在程式中書寫浮點數,則這個精度設定是必須的,但這里其實不需要
 34             "in float inValue;\n" +//這個換行符不是必須的,輸入值《-注意!瀏覽器端輸入的資料單元可能是一個浮點數或2到4元向量,但glsl只會按這里設定的資料型別處理輸入,比如輸入3元向量型的資料,但這里只取向量的第一個分量處理,
 35             "out float outValue;\n" +//一方面輸出到片元著色器,一方面輸出到TransformFeedback
 36             "void main()\n" +
 37             "{\n" +
 38             "   outValue=https://www.cnblogs.com/ljzc002/p/sqrt(inValue);/n" +//取平方根
 39             "}\n"
 40         var vertexShader=gl.createShader(gl.VERTEX_SHADER);//建立頂點著色器
 41         gl.shaderSource(vertexShader, vertexShaderSrc);
 42         gl.compileShader(vertexShader);
 43         //先不建立片元著色器
 44         var shaderProgram = gl.createProgram();//建立著色器程式物件,
 45         gl.attachShader(shaderProgram, vertexShader);
 46 //注意!對于OpenGL和OpenGL ES來說,允許只建立頂點著色器,然后鏈接即可計算,但WebGL必須有片元著色器才可鏈接
 47 
 48         var fragmentShaderSrc="#version 300 es\n" +
 49             "precision highp float;\n" +
 50             "precision highp int;" +
 51 
 52             "out vec4 outValue2;" +//這個光柵化后輸出到螢屏,和TransformFeedback沒關系
 53             "void main(){" +
 54             "   outValue2=vec4(1.0,0.5,0.5,1.0);" +
 55             "}"
 56         var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);
 57         gl.shaderSource(fragmentShader, fragmentShaderSrc);
 58         gl.compileShader(fragmentShader);
 59         gl.attachShader(shaderProgram, fragmentShader);
 60 
 61         //也先不連接程式
 62         gl.transformFeedbackVaryings(shaderProgram,["outValue"], gl.SEPARATE_ATTRIBS);//gl.SEPARATE_ATTRIBS,//gl.INTERLEAVED_ATTRIBS
 63         //console.log(activeInfo);//上一行設定“變換反饋”與頂點著色器中的哪個out變數關聯,這里只有一個
 64 
 65         gl.linkProgram(shaderProgram);
 66         console.log(gl.getProgramParameter(shaderProgram, gl.LINK_STATUS));
 67         console.log(gl.getShaderInfoLog(vertexShader));
 68         console.log(gl.getShaderInfoLog(fragmentShader));
 69         console.log(gl.getProgramInfoLog(shaderProgram));//The program must contain objects to form both a vertex and fragment shader.
 70 
 71 
 72         var verts = [2,0,0,4,0,0,6,0,0];//準備一點資料
 73         var vertexBuffer=gl.createBuffer();
 74         gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
 75         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW);//準備瀏覽器端的快取
 76         var inputAttrib =gl.getAttribLocation(shaderProgram, "inValue");//找到顯卡中變數的位置(此時尚未傳遞資料到顯卡)
 77 
 78 
 79 
 80         var transformFeedbackBuffer=gl.createBuffer();//用于讀取變換反饋結果的快取
 81         gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER,transformFeedbackBuffer);
 82         gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, 3* Float32Array.BYTES_PER_ELEMENT, gl.STREAM_READ);//STREAM_READ,DYNAMIC_READ,STATIC_READ,靜態則只讀一次?
 83 
 84         var transformFeedback=gl.createTransformFeedback();//建立變換反饋物件
 85         gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback);
 86         gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, transformFeedbackBuffer);//把變換反饋物件和快取關聯起來
 87 
 88         gl.useProgram(shaderProgram);//啟用鏈接好的著色器程式
 89         gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
 90         gl.enableVertexAttribArray(inputAttrib);
 91         gl.vertexAttribPointer(inputAttrib,3,gl.FLOAT,false,0,0);//3是vertSize,這里3個數一組的發送到顯卡
 92 
 93         gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback);
 94         gl.beginTransformFeedback(gl.POINTS);//這兩個必須一樣
 95         gl.drawArrays(gl.POINTS,0,3);//TRIANGLE_STRIP,TRIANGLES
 96         //var activeInfo = gl.getTransformFeedbackVarying(shaderProgram, 0);
 97         //console.log(activeInfo);
 98         gl.endTransformFeedback();
 99 //讀取時控制臺出現警告:performance warning: READ-usage buffer was read back without waiting on a fence. This caused a graphics pipeline stall.
100 //但是添加了延時后仍然有警告,不知是什么原因
101 
102         // requestAnimFrame(
103         //     function(){
104         //         gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER,transformFeedbackBuffer);
105         //         //var arr=new Float32Array(3);
106         //         var arrBuffer = new ArrayBuffer(3 * Float32Array.BYTES_PER_ELEMENT);
107         //         var arr=new Float32Array(arrBuffer);
108         //         gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER,0,arr)
109         //         console.log(arr);
110         //         //console.log(arr.values());
111         //     }
112         // )
113         //gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER,transformFeedbackBuffer);
114         setTimeout(function(){
115 
116             //var arr=new Float32Array(3);
117             var arrBuffer = new ArrayBuffer(3 * Float32Array.BYTES_PER_ELEMENT);
118             var arr=new Float32Array(arrBuffer);
119             gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER,0,arr)//ARRAY_BUFFER,TRANSFORM_FEEDBACK_BUFFER
120             console.log(arr);//讀取到了變換反饋資訊,
121             //console.log(arr.values());
122         },1000)
123 
124         //var activeInfo = gl.getTransformFeedbackVarying(shaderProgram, 0);
125         //console.log(activeInfo);
126     }
127     function initGL(canvas){
128         gl;
129         try
130         {
131             gl = canvas.getContext("webgl2",{antialias:true});//從canvas中獲取webgl背景關系
132             //https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/getContext
133             gl.viewport(0,0,canvas.width,canvas.height);//設定視口
134         }
135         catch(e)
136         {
137             var msg="Error creating WebGL Context!: "+ e.toString();
138             alert(msg);  //彈出錯誤資訊
139         }
140         return gl;
141     }
142     window.requestAnimFrame = (function() {
143         return window.requestAnimationFrame ||
144             window.webkitRequestAnimationFrame ||
145             window.mozRequestAnimationFrame ||
146             window.oRequestAnimationFrame ||
147             window.msRequestAnimationFrame ||
148             function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
149                 window.setTimeout(callback, 1000/60);
150             };
151     })();
152 </script>
153 </html>

在js的語法里,我們就是飛行在天空的上帝,我們可以俯瞰大地上的所有角落,并隨時降臨在任意位置;但在操作顯卡時,我們是軌道上的宇航員,我們要在移動到特定坐標時才能看到相應位置(bind),并且要在做好充足準備后(buffer)才能在有限的區域登陸,

 

2、Babylon.js訓練場中的一個略微復雜一些的例子:

  1 <!DOCTYPE html>
  2 <html xmlns="http://www.w3.org/1999/xhtml">
  3 <head>
  4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5     <title>01Babylon里的的原生例子</title>
  6     <style>
  7         html, body {
  8             overflow: hidden;
  9             width: 100%;
 10             height: 100%;
 11             margin: 0;
 12             padding: 0;
 13         }
 14         #renderCanvas {
 15             width: 100%;
 16             height: 100%;
 17             touch-action: none;
 18         }
 19     </style>
 20     <script src="../../JS/LIB/babylon50.min.js"></script>
 21     <!--<script src="https://www.cnblogs.com/JS/LIB/recast.js"></script>&lt;!&ndash;基于wasm編譯而來的導航庫&ndash;&gt;-->
 22     <!--<script src="https://www.cnblogs.com/JS/LIB/dat.gui.min.js"></script>-->
 23 </head>
 24 <body>
 25 <canvas id="renderCanvas" touch-action="none"></canvas> <!-- touch-action="none" for best results from PEP -->
 26 <script>
 27     const canvas = document.getElementById("renderCanvas"); // Get the canvas element 獲取畫布標簽
 28     const engine = new BABYLON.Engine(canvas, true,
 29         { preserveDrawingBuffer: true, stencil: true,  disableWebGL2Support: false}); // Generate the BABYLON 3D engine 建立BABYLON 3D引擎
 30     //var navmeshdebug;
 31 
 32     const createScene =  () => {
 33         // This creates a basic Babylon Scene object (non-mesh)
 34         var scene = new BABYLON.Scene(engine);
 35         var babylonE = scene.getEngine();//未使用
 36 
 37         // This creates and positions a free camera (non-mesh)
 38         var camera = new BABYLON.ArcRotateCamera("camera", BABYLON.Tools.ToRadians(90), BABYLON.Tools.ToRadians(65), 2000, BABYLON.Vector3.Zero(), scene);
 39         //var camera = new BABYLON.FreeCamera("camera", BABYLON.Vector3.Zero(), scene);
 40         // This targets the camera to scene origin
 41         camera.setTarget(BABYLON.Vector3.Zero());
 42         camera.maxZ = 1000000;//因為操作的是同一個gl,所以這個相機也能生效!
 43 
 44         // This attaches the camera to the canvas
 45         camera.attachControl(canvas, true);
 46 
 47         // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
 48         var light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
 49 
 50         // Default intensity is 1. Let's dim the light a small amount
 51         light.intensity = 0.7;//光照也生效
 52 
 53 
 54         var time = 0;
 55 
 56         // Our built-in 'ground' shape.
 57         var ground = BABYLON.MeshBuilder.CreateGround("ground", {
 58                 width: 1000,
 59                 height: 1000,
 60                 subdivisions: 500
 61             }, scene
 62         );//建立了一個“地面網格”,它有很多個頂點
 63         let data = ground.getVertexBuffer(BABYLON.VertexBuffer.PositionKind).getData();//取出頂點資料
 64 
 65         var newData = new Float32Array(data.length);//把頂點資料放在一個快取物件里
 66 
 67         const gl = canvas.getContext('webgl2') || canvas.getContext('experimental-webgl2');
 68         console.log(gl);//取原生gl物件
 69         setupCustomGLProgram(gl, new Float32Array(data), newData);//使用顯卡并行處理大量頂點,應該會比cpu更快
 70 
 71         console.log(newData);
 72 
 73         ground.setVerticesData(BABYLON.VertexBuffer.PositionKind, newData);//把處理完的頂點放回地面網格里
 74         ground.createNormals(false);
 75 
 76 
 77 
 78         scene.registerBeforeRender(function(){
 79             time += 0.1;//也可以讓頂點們隨時間變化!!
 80         });
 81 
 82         return scene;
 83     }
 84 
 85 
 86 
 87     function setupCustomGLProgram(gl, dataIn, dataOut)//自定義gpu計算
 88     {
 89         const VERTEX_COUNT = dataIn.length;
 90 
 91         gl.enable(gl.RASTERIZER_DISCARD);//這個有什么用?《-讓這個gpu計算中的draw不生效!只用Babylon.js的!
 92 //使用GL_RASTERIZER_DISCARD標志作為引數呼叫glEnable()函式,告訴渲染管線在transform feedback可選階段之后和到達光柵器前拋棄所有的圖元,
 93         const program = gl.createProgram();//和上個例子類似的操作
 94         gl.attachShader(program, getShader(gl, voronoiVertex, gl.VERTEX_SHADER));
 95         gl.attachShader(program, getShader(gl, voronoiFragment, gl.FRAGMENT_SHADER));
 96         gl.transformFeedbackVaryings(program, ['outPosition'], gl.SEPARATE_ATTRIBS);
 97 
 98         gl.linkProgram(program);
 99         console.log('program:', gl.getProgramInfoLog(program));
100         gl.useProgram(program);
101 
102 
103         //buffers
104         //input
105         let inputBuffer = gl.createBuffer();
106         gl.bindBuffer(gl.ARRAY_BUFFER, inputBuffer);
107         gl.bufferData(gl.ARRAY_BUFFER, dataIn, gl.STATIC_DRAW);
108 
109         //output
110         let resultBuffer = gl.createBuffer();
111 
112         // Create a TransformFeedback object
113         var transformFeedback = gl.createTransformFeedback();
114         gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback);
115 
116         gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, resultBuffer);
117         gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, VERTEX_COUNT * Float32Array.BYTES_PER_ELEMENT, gl.STATIC_DRAW);
118 
119 
120         // Attribute position
121         const inputAttribLocation = gl.getAttribLocation(program, 'position');
122 
123         gl.enableVertexAttribArray(inputAttribLocation);
124         gl.bindBuffer(gl.ARRAY_BUFFER, inputBuffer);
125         gl.vertexAttribPointer(
126             inputAttribLocation, // index
127             3, // size
128             gl.FLOAT, // type
129             gl.FALSE, // normalized?
130             0, // stride
131             0 // offset
132         );
133 
134 
135         // Activate the transform feedback
136         gl.beginTransformFeedback(gl.POINTS);
137         gl.drawArrays(gl.POINTS, 0, Math.floor(VERTEX_COUNT/3));
138         gl.endTransformFeedback();
139 
140 
141         // Read back
142         gl.getBufferSubData(
143             gl.TRANSFORM_FEEDBACK_BUFFER, // target
144             0, // srcByteOffset
145             dataOut, // dstData
146         );
147 
148         gl.disable(gl.RASTERIZER_DISCARD);
149     }
150 
151 
152 
153     function getShader(gl, source, type){
154         let sh = gl.createShader(type);
155         gl.shaderSource(sh, source);
156         gl.compileShader(sh);
157         console.log('Shader:', gl.getShaderInfoLog(sh));
158         return sh;
159     }
160 
161 
162 
163 
164 
165 
166 
167 //用模板字串,更好換行
168     const voronoiVertex =
169         `#version 300 es
170 precision highp float;
171 
172 
173 
174 
175 in vec3 position;
176 out vec3 outPosition;
177 
178 void main(void) {
179     vec3 finalPos = position;
180 
181 
182 
183     outPosition = finalPos;
184     if(finalPos[0]<0.0)
185     {
186         outPosition[1]=10.0;
187     }
188 }
189 `;
190 
191 
192     const voronoiFragment =
193         `#version 300 es
194 precision highp float;//這一句可省
195 
196 void main(void) {
197 
198 }
199 `
200 
201 
202 
203 
204     BABYLON.Effect.ShadersStore["customVertexShader"] = voronoiVertex
205 
206     BABYLON.Effect.ShadersStore["customFragmentShader"] = voronoiFragment;
207 
208     // Add your code here matching the playground format 按照訓練場的格式添加你自己的代碼
209     const scene = createScene(); //Call the createScene function 呼叫createScene方法
210 
211     scene.debugLayer.show();
212     // Register a render loop to repeatedly render the scene 注冊一個渲染回圈,來重復地渲染場景
213     engine.runRenderLoop(function () {
214         scene.render();
215     });
216     // Watch for browser/canvas resize events 監聽瀏覽器或畫布的尺寸改變事件
217     window.addEventListener("resize", function () {
218         engine.resize();
219     });
220 
221 </script>
222 </body>
223 </html>

以上就是一個通過并行計算提高計算效率的例子,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296163.html

標籤:其他

上一篇:[譯] 如何使用 WebGL 技術進行風力地圖可視化

下一篇:OpenCV 之 自定義濾波

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more