主頁 >  其他 > WebGL 與 WebGPU比對[4] - Uniform

WebGL 與 WebGPU比對[4] - Uniform

2022-02-19 07:56:52 其他

目錄
  • 1. WebGL 1.0 Uniform
    • 1.1. 用 WebGLUniformLocation 尋址
    • 1.2. 矩陣賦值用 uniformMatrix[234]fv
    • 1.3. 標量與向量用 uniform[1234][fi][v]
    • 1.4. 傳遞紋理
  • 2. WebGL 2.0 Uniform
    • 2.1. 標量/向量/矩陣傳值方法擴充
    • 2.1. 什么是 UniformBlock 與 UniformBuffer 的創建
    • 2.2. 狀態系結
    • 2.3. 著色器中的 Uniform
    • 2.4. 傳遞紋理
  • 3. WebGPU Uniform
    • 3.1. 三類資源的創建與打組傳遞
    • 3.2. 更新 Uniform 與系結組的意義
    • 3.3. 著色器中的 Uniform
  • 4. 對比總結
  • 5. 參考資料


眾所周知,在 GPU 跑可編程管線的時候,著色器是并行運行的,每個著色器入口函式都會在 GPU 中并行執行,每個著色器對一大片統一格式的資料進行沖鋒,體現 GPU 多核心的優勢,可以小核同時處理資料;不過,有的資料對每個著色器都是一樣的,這種資料的型別是“uniform”,也叫做統一值,

這篇文章羅列了原生 WebGL 1/2 中的 uniform 資料,以及 WebGPU 中的 uniform 資料,有一些例子供參考,以用來比對它們之間的差異,

1. WebGL 1.0 Uniform

1.1. 用 WebGLUniformLocation 尋址

在 WebGL 1.0 中,通常是在 JavaScript 端保存 WebGLUniformLocation 以向著色器程式傳遞 uniform 值的,

使用 gl.getUniformLocation() 方法獲取這個 location,有如下幾種方式

  • 全名:gl.getUniformLocation(program, 'u_someUniformVar')
  • 分量:通常是向量的一部分,譬如 gl.getUniformLocation(program, 'u_someVec3[0]') 是獲取第 0 個元素(元素型別是 vec3)的 location
  • 結構體成員:gl.getUniformLocation(program, 'u_someStruct.someMember')

上面三種情況與之對應的著色器代碼:

// 全名
uniform float u_someUniformVar;

// 分量
uniform vec3 u_someVec3[3]; // 注意,這里是 3 個 vec3

// 結構體成員
struct SomeStruct {
  bool someMember;
};
uniform SomeStruct u_someStruct;  

傳值分三類,標量/向量、矩陣、采樣紋理,見下文,

1.2. 矩陣賦值用 uniformMatrix[234]fv

對于矩陣,使用 gl.uniformMatrix[234]fv() 方法即可傳遞,其中,f 代表 float,v 代表 vector,即傳入引數要是一個向量(即陣列);

以傳遞一個 4×4 的矩陣為例:

// 獲取 location(初始化時)
const matrixLocation = gl.getUniformLocation(program, "u_matrix")

// 創建或更新列主序變換矩陣(渲染時)
const matrix = [/* ... */]

// 傳遞值(渲染時)
gl.uniformMatrix4fv(matrixLocation, false, matrix)

1.3. 標量與向量用 uniform[1234][fi][v]

對于普通標量和向量,使用 gl.uniform[1234][fi][v]() 方法即可傳遞,其中,1、2、3、4 代表標量或向量的維度(1就是標量啦),f/i 代表 float 或 int,v 代表 vector(即你傳遞的資料在著色器中將決議為向量陣列),

舉例:

  • 陳述句1,gl.uniform1fv(someFloatLocation, [4.5, 7.1])
  • 陳述句2,gl.uniform4i(someIVec4Location, 5, 2, 1, 3)
  • 陳述句3,gl.uniform4iv(someIVec4Location, [5, 2, 1, 3, 2, 12, 0, 6])
  • 陳述句4,gl.uniform3f (someVec3Location, 7.1, -0.8, 2.1)

上述 4 個賦值陳述句對應的著色器中的代碼為:

// 陳述句 1 可以適配 1~N 個浮點數
// 只傳單元素陣列時,可直接宣告 uniform float u_someFloat;
uniform float u_someFloat[2];

// 陳述句 2 適配一個 ivec4
uniform ivec4 u_someIVec4;

// 陳述句 3 適配  1~N 個 ivec4
// 只傳單元素陣列時,可直接宣告 uniform float u_someIVec4;
uniform ivec4 u_someIVec4[2];

// 陳述句 4 適配一個 vec3
uniform vec3 u_someVec3;

到了 WebGL 2.0,在組分值型別會有一些擴充,請讀者自行查閱相關檔案,

1.4. 傳遞紋理

在頂點著色器階段,可以使用頂點的紋理坐標對紋理進行采樣:

attribute vec3 a_pos;
attribute vec2 a_uv;
uniform sampler2D u_texture;
varying vec4 v_color;

void main() {
  v_color = texture2D(u_texture, a_uv);
  gl_Position = a_pos; // 假設頂點不需要變換
}

那么,在 JavaScript 端,可以使用 gl.uniform1i() 來告訴著色器我把紋理剛剛傳遞到哪個紋理坑位上了:

const texture = gl.createTexture()
const samplerLocation = gl.getUniformLocation(/* ... */)

// ... 設定紋理資料 ...

gl.activeTexture(gl[`TEXTURE${5}`]) // 告訴 WebGL 使用第 5 個坑上的紋理
gl.bindTexture(gl.TEXTURE_2D, texture)

gl.uniform1i(samplerLocation, 5) // 告訴著色器待會讀紋理的時候去第 5 個坑位讀

2. WebGL 2.0 Uniform

2.1. 標量/向量/矩陣傳值方法擴充

WebGL 2.0 的 Uniform 系統對非方陣型別的矩陣提供了支持,例如

const mat2x3 = [
  1, 2, 3,
  4, 5, 6,
]
gl.uniformMatrix2x3fv(loc, false, mat2x3)

上述方法傳遞的是 4×3 的矩陣,

而對于單值和向量,額外提供了無符號數值的方法,即由 uniform[1234][fi][v] 變成了 uniform[1234][f/ui][v],也就是下面 8 個新增方法:

gl.uniform1ui(/* ... */) // 傳遞資料至 1 個 uint
gl.uniform2ui(/* ... */) // 傳遞資料至 1 個 uvec2
gl.uniform3ui(/* ... */) // 傳遞資料至 1 個 uvec3
gl.uniform4ui(/* ... */) // 傳遞資料至 1 個 uvec4

gl.uniform1uiv(/* ... */) // 傳遞資料至 uint 陣列
gl.uniform2uiv(/* ... */) // 傳遞資料至 uvec2 陣列
gl.uniform3uiv(/* ... */) // 傳遞資料至 uvec3 陣列
gl.uniform4uiv(/* ... */) // 傳遞資料至 uvec4 陣列

對應 GLSL300 中的 uniform 為:

#version 300 es
#define N ? // N 取決于你的需要,JavaScript 傳遞的數量也要匹配
  
uniform uint u_someUint;
uniform uvec2 u_someUVec2;
uniform uvec3 u_someUVec3;
uniform uvec4 u_someUVec4;

uniform uint u_someUintArr[N];
uniform uvec2 u_someUVec2Arr[N];
uniform uvec3 u_someUVec3Arr[N];
uniform uvec4 u_someUVec4Arr[N];

需要額外注意的是,uint/uvec234 這些型別在高版本的 glsl 才能使用,也就是說不向下兼容 WebGL 1.0 及 GLSL100.

然而,WebGL 2.0 帶來的不單單只是這些小修小補,最重要的莫過于 UBO 了,馬上開始,

2.1. 什么是 UniformBlock 與 UniformBuffer 的創建

在 WebGL 1.0 的時候,任意種類的統一值一次只能設定一個,如果一幀內 uniform 有較多更新,對于 WebGL 這個狀態機來說不是什么好事,會帶來額外的 CPU 至 GPU 端的傳遞開銷,

在 WebGL 2.0,允許一次發送一堆 uniform,這一堆 uniform 的聚合體,就叫做 UniformBuffer,具體到代碼中:

先是 GLSL 300

uniform Light {
  highp vec3 lightWorldPos;
  mediump vec4 lightColor;
};

然后是 JavaScript

const lightUniformBlockBuffer = gl.createBuffer()
const lightUniformBlockData = https://www.cnblogs.com/onsummer/archive/2022/02/19/new Float32Array([
  0, 10, 30, 0,    // vec3, 光源位置, 為了 8 Byte 對齊填充一個尾 0
  1, 1, 1, 1,     // vec4, 光的顏色
])
gl.bindBuffer(gl.UNIFORM_BUFFER, lightUniformBlockBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, lightUniformBlockData, gl.STATIC_DRAW);

gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, lightUniformBlockBuffer)

先別急著問為什么,一步一步來,

首先你看到了,在 GLSL300 中允許使用類似結構體一樣的塊狀語法宣告多個 Uniform 變數,這里用到了光源的坐標和光源的顏色,分別使用了不同的精度和資料型別(vec3、vec4),

隨后,在 JavaScript 端,你看到了用新增的方法 gl.bindBufferBase() 來系結一個 WebGLBuffer 到 0 號位置,這個 lightUniformBlockBuffer 其實就是集合了兩個 Uniform 變數的 UniformBufferObject (UBO),在著色器中那塊被命名為 Light 的花括號區域,則叫 UniformBlock.

其實,創建一個 UBO 和創建普通的 VBO 是一樣的,系結、賦值操作也幾乎一致(第一個引數有不同),只不過 UBO 可能更需要考慮數值上的設計,例如 8 位元組對齊等,通常會在設計著色器的時候把相同資料型別的 uniform 變數放在一起,達到記憶體使用上的最佳化,

2.2. 狀態系結

在 WebGL 2.0 中,JavaScript 端允許你把著色器程式中的 UniformBlock 位置系結到某個變數中:

const viewUniformBufferIndex = 0;
const materialUniformBufferIndex = 1;
const modelUniformBufferIndex = 2;
const lightUniformBufferIndex = 3;
gl.uniformBlockBinding(prg, gl.getUniformBlockIndex(prg, 'View'), viewUniformBufferIndex);
gl.uniformBlockBinding(prg, gl.getUniformBlockIndex(prg, 'Model'), modelUniformBufferIndex);
gl.uniformBlockBinding(prg, gl.getUniformBlockIndex(prg, 'Material'), materialUniformBufferIndex);
gl.uniformBlockBinding(prg, gl.getUniformBlockIndex(prg, 'Light'), lightUniformBufferIndex);

這里,使用的是 gl.getUniformBlockIndex() 獲取 UniformBlock 在著色器程式中的位置,而把這個位置系結到你喜歡的數字上的是 gl.uniformBlockBinding() 方法,

這樣做有個好處,你可以在你的程式里人為地規定各個 UniformBlock 的順序,然后用這些 index 來更新不同的 UBO.

// 使用不同的 UBO 更新 materialUniformBufferIndex (=1) 指向的 UniformBlock
gl.bindBufferBase(gl.UNIFORM_BUFFER, 1, redMaterialUBO)
gl.bindBufferBase(gl.UNIFORM_BUFFER, 1, greenMaterialUBO)
gl.bindBufferBase(gl.UNIFORM_BUFFER, 1, blueMaterialUBO)

當然,WebGL 2.0 對 Uniform 還有別的擴充,此處不再列舉,

bindBufferBase 的作用類似于 enableVertexAttribArray,告訴 WebGL 我馬上就要用哪個坑了,

2.3. 著色器中的 Uniform

著色器使用 GLSL300 語法才能使用 UniformBlock 和 新的資料型別,除此之外和 GLSL100 沒啥區別,當然,GLSL300 有很多新語法,這里只撿一些關于 Uniform 的來寫,

關于 uint/uvec234 型別,在 2.1 節已經有例子了,這里不贅述,

而關于 UniformBlock,還有一點需要補充的,那就是“命名”問題,

UniformBlock 的語法如下:

uniform <BlockType> {
  <BlockBody>
} ?<blockName>;

// 舉例:具名定義
uniform Model {
  mat4 world;
  mat4 worldInverseTranspose;
} model;

// 舉例:不具名定義
uniform Light {
  highp vec3 lightWorldPos;
  mediump vec4 lightColor;
};

如果使用具名定義,那么訪問 Block 內的成員就需要使用它的 name 了,例如 model.worldmodel.worldInverseTranspose 等,

舉完整的例子如下:

#version 300 es
precision highp float;
precision highp int;

// uniform 塊的布局控制
layout(std140, column_major) uniform;

// 宣告 uniform 塊:Transform,命名為 transform 供主程式使用
// 也可以不命名,就直接用 mvpMatrix 即可
uniform Transform
{
  mat4 mvpMatrix;
} transform;

layout(location = 0) in vec2 pos;

void main() {
  gl_Position = transform.mvpMatrix * vec4(pos, 0.0, 1.0);
}

注意,即使給 UniformBlock 命名為 transform,但是立面的 mvpMatrix 是不能與其它 Block 里面的成員共名的,transform 沒有命名空間的作用,

再看 JavaScript:

//#region 獲取著色器程式中的 uniform 位置并系結
const uniformTransformLocation = gl.getUniformBlockIndex(program, 'Transform')
gl.uniformBlockBinding(program, uniformTransformLocation, 0)
//endregion

//#region 創建 ubo
const uniformTransformBuffer = gl.createBuffer()
//#endregion

//#region 創建矩陣所需的 ArrayBufferView,列主序
const transformsMatrix = new Float32Array([
  1.0, 0.0, 0.0, 0.0,
  0.0, 1.0, 0.0, 0.0,
  0.0, 0.0, 1.0, 0.0,
  0.0, 0.0, 0.0, 1.0
])
//#endregion

//#region 傳遞資料給 WebGLBuffer
gl.bindBuffer(gl.UNIFORM_BUFFER, uniformTransformBuffer)
gl.bufferData(gl.UNIFORM_BUFFER, transformsMatrix, gl.DYNAMIC_DRAW);
gl.bindBuffer(gl.UNIFORM_BUFFER, null)
//#endregion

// ---------- 在你需要繪制時 ----------
//#region 系結 ubo 到 0 號索引上的 uniformLocation 以供著色器使用
gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, uniformTransformBuffer)
// ... 渲染
// -------------

2.4. 傳遞紋理

紋理與 WebGL 1.0 一致,但是 GLSL300 的紋理函式有變,讀者請自行查找資料比對,

3. WebGPU Uniform

WebGPU 有三個型別的 Uniform 資源:標量/向量/矩陣、紋理、采樣器,

各自有各自的容器,第一種統一使用 GPUBuffer,也就是所謂的 UBO;第二和第三種使用 GPUTextureGPUSampler.

3.1. 三類資源的創建與打組傳遞

上述三類資源,把它們通過打成一組,也就是 GPUBindGroup,我叫它資源系結組,進而傳遞給組織了著色器模塊(GPUShaderModule)的各種管線(GPURenderPipelineGPUComputePipeline),

統一起來好辦事,這里為節約篇幅,資料傳遞就不再細說,著重看看它們的打組成系結組的代碼:

const someUbo = device.createBuffer({ /* 注意 usage 要有 UNIFORM */ })
const texture = device.createTexture({ /* 創建常規紋理 */ })
const sampler = device.createSampler({ /* 創建常規采樣器 */ })

// 布局物件聯系管線布局和系結組本身
const bindGroupLayout = device.createBindGroupLayout({
  entries: [
    {
      binding: 0, // <- 系結在 0 號資源
      visibility: GPUShaderStage.FRAGMENT,
      sampler: {
        type: 'filtering'
      }
    },
    {
      binding: 1, // <- 系結在 1 號資源
      visibility: GPUShaderStage.FRAGMENT,
      texture: {
        sampleType: 'float'
      }
    },
    {
      binding: 2,
      visibility: GPUShaderStage.FRAGMENT,
      buffer: {
        type: 'uniform'
      }
    }
  ]
})
const bindGroup = device.createBindGroup({
  layout: bindGroupLayout,
  entries: [
    {
      binding: 0,
      resource: sampler, // <- 傳入采樣器物件
    },
    {
      binding: 1,
      resource: texture.createView() // <- 傳入紋理物件的視圖
    },
    {
      binding: 2,
      resource: {
        buffer: someUbo // <- 傳入 UBO
      }
    }
  ]
})

// 管線
const pipelineLayout = device.createPipelineLayout({
  bindGroupLayouts: [bindGroupLayout]
})
const renderingPipeline = device.createRenderPipeline({
  layout: pipelineLayout
  // ... 其它配置
})

// ... renderPass 切換 pipeline 和 bindGroup 進行繪制 ...

3.2. 更新 Uniform 與系結組的意義

更新 Uniform 資源其實很簡單,

如果是 UBO,一般會更新前端修改的燈光、材質、時間幀引數以及單幀變化的矩陣等,使用 device.queue.writeBuffer 即可:

device.queue.writeBuffer(
  someUbo, // 傳給誰
  0, 
  buffer, // 傳遞 ArrayBuffer,即當前幀中的新資料
  byteOffset, // 從哪里開始
  byteLength // 取多長
)

使用 writeBuffer 就可以保證用的還是原來創建那個 GPUBuffer,它與系結組、管線的系結關系還在;不用映射、解映射的方式傳值是減少 CPU/GPU 雙端通信成本

如果是紋理,那就用 影像拷貝操作 中的幾個方法進行紋理物件更新;

一般不直接對采樣器和紋理的更新,而是在編碼器上切換不同的系結組來切換管線所需的資源,尤其是紋理,若頻繁更新資料,CPU/GPU 雙端通信成本會增加的,

延遲渲染、離屏繪制等需要更新顏色附件的,其實只需要創建新的 colorAttachments 物件即可實作“上一幀繪制的下一幀我能用”,不需要直接從 CPU 記憶體再刷入資料到 GPU 中,

更新 Uniform 需要對每一幀幾乎都要改的、幾乎不變的資源進行合理分組,分到不同的系結組中,這樣就可以有針對性地更新,而無需把管線、系結組重設一次,僅僅在通道編碼器上進行切換即可,

3.3. 著色器中的 Uniform

此處不涉及太多 WGSL 語法,

與 UniformBlock 類似,需要指定“一塊東西”,WGSL 直接使用的結構體,

首先,是 UBO:

// -- 頂點著色器 --

// 宣告一個結構體型別
struct Uniforms {
  modelViewProjectionMatrix: mat4x4<f32>;
};

// 宣告指定其系結ID是0,系結組序號是0
@binding(2)
@group(0)
var<uniform> myUniforms: Uniforms;

// —— 然后這個 myUniforms 變數就可以在函式中呼叫了 ——

然后是紋理和采樣器:

@group(0)
@binding(1)
var mySampler: sampler;

@group(0)
@binding(2)
var myTexture: texture_2d<f32>;

// ... 片元著色器主函式中進行紋理采樣
textureSample(myTexture, mySampler, fragUV);

4. 對比總結

WebGL 以 2 為比對基準,它與 WebGPU 相比,沒有資源系結組,沒有采樣器物件(采樣引數通過另外的方法設定),

比起 WebGPU 的傳 descriptor 式的寫法,使用一條條方法切換 UniformBlock、紋理等資源可能會有所遺漏,這是全域狀態寫法的特點之一,當然,上層封裝庫會幫我們屏蔽這些問題的,

與語法風格相比,其實 WebGPU 改進的更多的是這些 uniform 在每一幀更新時 CPU 到GPU 的負載問題,它是事先由編碼器編碼成指令緩沖最后一次性發送的,比起 WebGL 一條一條發送是更優的,在圖形渲染、GPU運算這種地方,積少成多,性能就高了起來,

關于 WebGL 2.0 的 Uniform 和 GLSL300 我學識不精,若有錯誤請指出,

5. 參考資料

  • WebGL2Fundamentals - StateDiagram - UniformBuffers

  • Gist - A simple WebGL2 UniformBuffer Tutorial

  • CSDN - WebGL2 UniformBlock

  • Austin - WebGPUSamples

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

標籤:其他

上一篇:【RSS醬】rsschan 全云端托管運行集合通知訂閱一體的rss訂閱器 使用新手教程

下一篇:我,32歲,動力機械專業研究生,轉行到演算法工程師,完成薪資翻倍

標籤雲
其他(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