主頁 >  其他 > shader編程-三維場景下SDF建模,對模型進行扭曲、彎曲、裁剪、掏空操作(WebGL-Shader開發基礎12)

shader編程-三維場景下SDF建模,對模型進行扭曲、彎曲、裁剪、掏空操作(WebGL-Shader開發基礎12)

2021-12-23 08:36:08 其他

對模型進行扭曲、彎曲、裁剪、掏空操作

  • 1. demo效果
  • 2. 實作要點
    • 2.1 模型扭曲
    • 2.2 模型彎曲
    • 2.3 模型裁剪與掏空
      • 2.3.1 球體裁剪與掏空
      • 2.3.2 圓柱裁剪與掏空
      • 2.3.3 甜圈圈裁剪與掏空
  • 3. demo代碼

1. demo效果

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
如上圖所示,第一張是對方形圓柱進行扭曲操作的效果圖,第二張圖是對扁平立方體面進行彎曲操作的效果圖,第三張圖是從內到外依次是原物體,裁剪后的物體,裁剪后掏空物體的效果,從左到右依次對圓柱、球體、甜圈圈進行同樣變換的效果

2. 實作要點

先回顧一下之前學習的SDF建模相關的一些操作,首先學習了基本變換旋轉、縮放、平移,之后學習了通過布爾運算(交集、并集、差集)組合模型 ,進而拓展了平滑布爾運算組合模型,今天解鎖一點點新的技能,對模型進行扭曲、彎曲、裁剪、掏空操作

2.1 模型扭曲

通過前面的demo效果展示知道,我們首先繪制了一個長條狀的立方體,然后又繪制了一個以同樣立方體扭曲后的物體,實作的核心思想就是變換用來繪制扭曲立方體的坐標,即依據y分量的變化使x分量和z分量轉圈圈,具體代碼如下

vec3 opTwistY( in vec3 p ,float k)
{

  float c = cos(k*p.y);
  float s = sin(k*p.y);
  mat2  m = mat2(c,-s,s,c);
  p.xz *=m;
  return p;
}

如果你想物體繞z軸或x軸扭曲,兩種辦法,一是先按y軸扭曲然后將物體旋轉,二是將上面的函式中的分量替換為對應的坐標軸

扭曲的坐標處理完接著就是像之前一樣繪制圖形,為了方便使用我們將繪制程序封裝成了一個函式,具體如下

vec2 twistBox (vec4 pos){

  //繪制原立方體
  pos.x += 2.5; 
  float box1 = sdBox(pos.xyz,vec3(0.4,1.2,0.4),0.06);//方塊
  vec2 mBox1 = vec2(box1,1.0);

  //繪制扭曲立方體
  pos.x -= 5.0; 
  pos.xyz=opTwistY(pos.xyz,3.0);//扭曲
  float box2 = sdBox(pos.xyz,vec3(0.4,1.2,0.4),0.06);//方塊
  vec2 mBox2 = vec2(box2,1.0);

  vec2 res = opU(mBox1,mBox2);

  return res;
}

呼叫程序如下

vec2 res =  vec2(p.y,0.0);//地面

vec3 pos = p-vec3(0,2,5);//確定模型的中心
vec4 oriPos = vec4(pos,1.0);//轉為其次坐標

//扭曲
vec2 twistBox = twistBox(oriPos);

res = opU(res,twistBox);//扭曲立方體

2.2 模型彎曲

彎曲也是同樣的思想,通過改變繪制彎曲模型的坐標來實作,回傳彎曲坐標的函式如下

vec3 opCheapBend(in vec3 p ,float k)
{
  float c = cos(k*p.x);
  float s = sin(k*p.x);
  mat2  m = mat2(c,-s,s,c);
  vec3  q = vec3(m*p.xy,p.z);
  return q;
}

像上一次一樣,使用處理好的坐標繪制圖形即可,這次也將繪制程序封裝成了一個函式,具體如下

vec2 cheapBendBox (vec4 pos){

  //繪制原立方體面
  pos.x += 2.5; 
  float box1 = sdBox(pos.xyz,vec3(1.0,0.2,0.6),0.06);//方塊
  vec2 mBox1 = vec2(box1,1.0);

  //繪制彎曲立方體面
  pos.x -= 5.0; 
  pos.xyz=opCheapBend(pos.xyz,0.5);//彎曲
  float box2 = sdBox(pos.xyz,vec3(1.0,0.2,0.6),0.06);//方塊
  vec2 mBox2 = vec2(box2,1.0);

  vec2 res = opU(mBox1,mBox2);

  return res;
}

呼叫程序如下

vec2 res =  vec2(p.y,0.0);//地面

vec3 pos = p-vec3(0,2,5);//確定模型的中心
vec4 oriPos = vec4(pos,1.0);//轉為其次坐標

//扭曲
vec2 twistBox = twistBox(oriPos);

//彎曲
vec2 cheapBendBox = cheapBendBox(oriPos);
//res = opU(res,twistBox);//扭曲立方體
res = opU(res,cheapBendBox); //彎曲立方體

2.3 模型裁剪與掏空

2.3.1 球體裁剪與掏空

掏空函式

//掏空
float opOnion(float sdf, in float thickness )
{
  return abs(sdf)-thickness;
}

繪制程序是,我們首先繪制了一個完整的球體,然后繪制了一個裁剪的球體,最后繪制一個掏空且裁剪的球體,之所以也裁剪是因為不裁剪的畫我們看不到內部結構,具體如下

vec2 onionSphere (vec4 pos){

  //繪制球體
  vec4 pos1 = pos;
  pos1.z -= 6.0; 
  float sphere1 = sdSphere(pos1.xyz,0.6);
  vec2 mSphere1 = vec2(sphere1,2.0);

  //繪制裁剪球體
  vec4 pos2 = pos;
  pos2.z -= 2.5; 
  float sphere2 = sdSphere(pos2.xyz,0.6);
  sphere2 = max( sphere2, pos2.y );//裁剪

  vec2 mSphere2 = vec2(sphere2,2.0);

  //繪制裁剪掏空球體
  vec4 pos3 = pos;
 
  float sphere3 = sdSphere(pos3.xyz,0.6);

  sphere3 = opOnion(sphere3,0.01);//掏空
  sphere3 = max( sphere3, pos3.y );//裁剪
  vec2 mSphere3 = vec2(sphere3,2.0);

  vec2 res = opU(mSphere1,mSphere2);
  res = opU(res,mSphere3);

  return res;
}

關于裁剪,不知你有沒有聯想到,這里的裁剪效果是裁掉了y軸大于0 的部分,如果想裁掉x軸或z上的大于0的部分,只需把max( sphere3, pos3.y );//裁剪此處的分量y替換,如果你想要留下y軸上部分,即demo中裁掉和留下的部分互換,那么在y分量前添加負號即可,max( sphere3, -pos3.y );//裁剪,其他軸中的裁剪同理

2.3.2 圓柱裁剪與掏空

圓柱的實作與球體的思路一樣,只不過把球體換成圓柱,如下

vec2 onionCylinder (vec4 pos){

  //繪制圓柱
  vec4 pos1 = pos;
  pos1.z -= 6.0; 
  float cylinder1 = sdCylinder(pos1.xyz,0.4,0.6);
  vec2 mCylinder1 = vec2(cylinder1,1.0);

  //繪制裁剪圓柱
  vec4 pos2 = pos;
  pos2.z -= 2.5; 
  float cylinder2 = sdCylinder(pos2.xyz,0.4,0.6);
  cylinder2 = max( cylinder2, pos2.y );//裁剪

  vec2 mCylinder2 = vec2(cylinder2,1.0);

  //繪制裁剪掏空圓柱
  vec4 pos3 = pos;

  float cylinder3 = sdCylinder(pos3.xyz,0.4,0.6);

  cylinder3 = opOnion(cylinder3,0.01);//掏空
  cylinder3 = max( cylinder3, pos3.y );//裁剪
  vec2 mCylinder3 = vec2(cylinder3,1.0);

  vec2 res = opU(mCylinder1,mCylinder2);
  res = opU(res,mCylinder3);

  return res;
}

2.3.3 甜圈圈裁剪與掏空

甜圈圈裁剪與掏空也是同樣的思路,繪制程序如下

vec2 onionTorus (vec4 pos){

  //繪制甜圈圈
  vec4 pos1 = pos;
  pos1.z -= 6.0; 
  float torus1 = sdTorus(pos1.xyz,vec2(0.6,0.2));
  vec2 mTorus1 = vec2(torus1,3.0);

  //繪制裁剪甜圈圈
  vec4 pos2 = pos;
  pos2.z -= 2.5; 
  float torus2 = sdTorus(pos2.xyz,vec2(0.6,0.2));
  torus2 = max( torus2, pos2.y );//裁剪

  vec2 mTorus2 = vec2(torus2,3.0);

  //繪制裁剪掏空甜圈圈
  vec4 pos3 = pos;

  float torus3 = sdTorus(pos3.xyz,vec2(0.6,0.2));

  torus3 = opOnion(torus3,0.01);//掏空
  torus3 = max( torus3, pos3.y );//裁剪
  vec2 mTorus3 = vec2(torus3,3.0);

  vec2 res = opU(mTorus1,mTorus2);
  res = opU(res,mTorus3);

  return res;
}

3. demo代碼

繼續,可直接跑起來的代碼

<body>
  <div id="container"></div>
  <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
  <script>
    var container;
    var camera, scene, renderer;
    var uniforms;
    var vertexShader = `
      void main() {
        gl_Position = vec4( position, 1.0 );
      } 
    `
    var fragmentShader = `
    #ifdef GL_ES
    precision mediump float;
    #endif
    uniform float u_time;
    uniform vec2 u_mouse;
    uniform vec2 u_resolution;

    const int MAX_STEPS = 100;//最大步進步數
    const float MAX_DIST = 100.0;//最大步進距離
    const float SURF_DIST = 0.01;//相交檢測臨近表面距離

    //繞z軸旋轉矩陣
    mat4 rotZ(float a) {
      return mat4(cos(a),-sin(a),0.0,0.0,
                  sin(a),cos(a),0.0,0.0,
                  0.0,0.0,1.0,0.0,
                  0.0,0.0,0.0,1.0
                  );
    }
    
    //繞x軸旋轉矩陣
    mat4 rotX(float a) {
      return mat4(1.0,0.0,0.0,0.0,
                  0.0,cos(a),-sin(a),0.0,
                  0.0,sin(a),cos(a),0.0,
                  0.0,0.0,0.0,1.0
                );
    }
    
    //繞y軸旋轉矩陣
    mat4 rotY(float a) {
      return mat4(cos(a),0.0,sin(a),0.0,
                  0.0,1.0,0.0,0.0,
                  -sin(a),0.0,cos(a),0.0,
                  0.0,0.0,0.0,1.0
                );
    } 

    //平滑交集
    float opSmoothI( float d1, float d2, float k )
    {
      float h = max(k-abs(d1-d2),0.0);
      return max(d1, d2) + h*h*0.25/k;
    }

    //平滑并集
    float opSmoothU( float d1, float d2, float k )
    {
      float h = max(k-abs(d1-d2),0.0);
      return min(d1, d2) - h*h*0.25/k;
    }

    //平滑差集
    float opSmoothS( float d1, float d2, float k )
    {
      float h = max(k-abs(-d1-d2),0.0);
      return max(-d1, d2) + h*h*0.25/k;
    }

    //掏空
    float opOnion(float sdf, in float thickness )
    {
      return abs(sdf)-thickness;
    }

    //并集
    vec2 opU( vec2 d1, vec2 d2 )
    {
      return (d1.x<d2.x) ? d1 : d2;
    }


    //球體
    float sdSphere( vec3 p, float s )
    {
      return length(p)-s;
    }

    //立方體
    float sdBox( vec3 p, vec3 b,float rad )
    {
      vec3 d = abs(p) - b;
      return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0)) - rad;
    }

    //圓柱
    float sdCylinder( vec3 p, float h, float r )
    {
      vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(r,h);
      return min(max(d.x,d.y),0.0) + length(max(d,0.0));
    }

    //甜圈圈
    float sdTorus( vec3 p, vec2 t )
    {
      vec2 q = vec2(length(p.xz)-t.x,p.y);
      return length(q)-t.y;
    }

    vec3 opTwistY( in vec3 p ,float k)
    {

      float c = cos(k*p.y);
      float s = sin(k*p.y);
      mat2  m = mat2(c,-s,s,c);
      p.xz *=m;
      return p;
    }

    vec3 opCheapBend(in vec3 p ,float k)
    {

      float c = cos(k*p.x);
      float s = sin(k*p.x);
      mat2  m = mat2(c,-s,s,c);
      vec3  q = vec3(m*p.xy,p.z);
      return q;
    }


    vec2 twistBox (vec4 pos){

      //繪制原立方體
      pos.x += 2.5; 
      float box1 = sdBox(pos.xyz,vec3(0.4,1.2,0.4),0.06);//方塊
      vec2 mBox1 = vec2(box1,1.0);

      //繪制扭曲立方體
      pos.x -= 5.0; 
      pos.xyz=opTwistY(pos.xyz,3.0);//扭曲
      float box2 = sdBox(pos.xyz,vec3(0.4,1.2,0.4),0.06);//方塊
      vec2 mBox2 = vec2(box2,1.0);

      vec2 res = opU(mBox1,mBox2);

      return res;
    }

    vec2 onionCylinder (vec4 pos){

      //繪制圓柱
      vec4 pos1 = pos;
      pos1.z -= 6.0; 
      float cylinder1 = sdCylinder(pos1.xyz,0.4,0.6);
      vec2 mCylinder1 = vec2(cylinder1,1.0);

      //繪制裁剪圓柱
      vec4 pos2 = pos;
      pos2.z -= 2.5; 
      float cylinder2 = sdCylinder(pos2.xyz,0.4,0.6);
      cylinder2 = max( cylinder2, pos2.y );//裁剪

      vec2 mCylinder2 = vec2(cylinder2,1.0);

      //繪制裁剪掏空圓柱
      vec4 pos3 = pos;

      float cylinder3 = sdCylinder(pos3.xyz,0.4,0.6);

      cylinder3 = opOnion(cylinder3,0.01);//掏空
      cylinder3 = max( cylinder3, pos3.y );//裁剪
      vec2 mCylinder3 = vec2(cylinder3,1.0);

      vec2 res = opU(mCylinder1,mCylinder2);
      res = opU(res,mCylinder3);

      return res;
    }
    vec2 onionSphere (vec4 pos){

      //繪制球體
      vec4 pos1 = pos;
      pos1.z -= 6.0; 
      float sphere1 = sdSphere(pos1.xyz,0.6);
      vec2 mSphere1 = vec2(sphere1,2.0);

      //繪制裁剪球體
      vec4 pos2 = pos;
      pos2.z -= 2.5; 
      float sphere2 = sdSphere(pos2.xyz,0.6);
      sphere2 = max( sphere2, pos2.y );//裁剪

      vec2 mSphere2 = vec2(sphere2,2.0);

      //繪制裁剪掏空球體
      vec4 pos3 = pos;
     
      float sphere3 = sdSphere(pos3.xyz,0.6);
 
      sphere3 = opOnion(sphere3,0.01);//掏空
      sphere3 = max( sphere3, pos3.y );//裁剪
      vec2 mSphere3 = vec2(sphere3,2.0);

      vec2 res = opU(mSphere1,mSphere2);
      res = opU(res,mSphere3);

      return res;
    }

    vec2 onionTorus (vec4 pos){

      //繪制甜圈圈
      vec4 pos1 = pos;
      pos1.z -= 6.0; 
      float torus1 = sdTorus(pos1.xyz,vec2(0.6,0.2));
      vec2 mTorus1 = vec2(torus1,3.0);

      //繪制裁剪甜圈圈
      vec4 pos2 = pos;
      pos2.z -= 2.5; 
      float torus2 = sdTorus(pos2.xyz,vec2(0.6,0.2));
      torus2 = max( torus2, pos2.y );//裁剪

      vec2 mTorus2 = vec2(torus2,3.0);

      //繪制裁剪掏空甜圈圈
      vec4 pos3 = pos;

      float torus3 = sdTorus(pos3.xyz,vec2(0.6,0.2));

      torus3 = opOnion(torus3,0.01);//掏空
      torus3 = max( torus3, pos3.y );//裁剪
      vec2 mTorus3 = vec2(torus3,3.0);

      vec2 res = opU(mTorus1,mTorus2);
      res = opU(res,mTorus3);

      return res;
    }

    vec2 cheapBendBox (vec4 pos){

      //繪制原立方體面
      pos.x += 2.5; 
      float box1 = sdBox(pos.xyz,vec3(1.0,0.2,0.6),0.06);//方塊
      vec2 mBox1 = vec2(box1,1.0);

      //繪制彎曲立方體面
      pos.x -= 5.0; 
      pos.xyz=opCheapBend(pos.xyz,0.5);//彎曲
      float box2 = sdBox(pos.xyz,vec3(1.0,0.2,0.6),0.06);//方塊
      vec2 mBox2 = vec2(box2,1.0);

      vec2 res = opU(mBox1,mBox2);

      return res;
    }

    vec2 getDistandMaterial(vec3 p){

      vec2 res =  vec2(p.y,0.0);//地面
 
      vec3 pos = p-vec3(0,2,5);//確定模型的中心
      vec4 oriPos = vec4(pos,1.0);//轉為其次坐標
 
      //扭曲
      vec2 twistBox = twistBox(oriPos);

      //彎曲
      vec2 cheapBendBox = cheapBendBox(oriPos);


      //裁剪掏空
      vec2 onionSphere = onionSphere(oriPos);

      vec2 onionCylinder = onionCylinder(oriPos+vec4(2.0,0.0,0.0,1.0));

      vec2 onionTorus = onionTorus(oriPos-vec4(2.0,0.0,0.0,1.0));

   
      //res = opU(res,twistBox);//扭曲立方體
      //res = opU(res,cheapBendBox); //彎曲立方體
      res = opU(res,onionSphere);//裁剪掏空球體
      res = opU(res,onionCylinder);//裁剪掏空圓柱
      res = opU(res,onionTorus);//裁剪掏空甜圈圈

      return res;
    }

    vec2 rayMarch(vec3 rayStart, vec3 rayDirection) {
      float depth=0.;
      float material=0.;
      for(int i=0; i<MAX_STEPS; i++) {
        vec3 p = rayStart + rayDirection*depth;//上一次步進結束后的坐標也就是這一次步進出發點

        vec2 dm = getDistandMaterial(p);
        float dist = dm.x;//獲取當前步進出發點與物體相交時距離
        material = dm.y;
        depth += dist; //步進長度累加

        if(depth>MAX_DIST || dist<SURF_DIST) break;//步進距離大于最大步進距離或與物體表面距離小于最小表面距離(光線進入物體)停止前進
      }
      return vec2(depth,material);
    }

    vec3 getNormal(vec3 p){
      return normalize(vec3(
        getDistandMaterial(vec3(p.x + SURF_DIST, p.y, p.z)).x - getDistandMaterial(vec3(p.x - SURF_DIST, p.y, p.z)).x,
        getDistandMaterial(vec3(p.x, p.y + SURF_DIST, p.z)).x - getDistandMaterial(vec3(p.x, p.y - SURF_DIST, p.z)).x,
        getDistandMaterial(vec3(p.x, p.y, p.z  + SURF_DIST)).x - getDistandMaterial(vec3(p.x, p.y, p.z - SURF_DIST)).x
      ));
    }


    //Blinn-Phong模型光照計算
    vec3 calcBlinnPhongLight( vec3 materialColor, vec3 p, vec3 ro) {

      vec3 lightPos = vec3(5.0 * sin(u_time), 20.0, 10.0*cos(u_time)-18.);//光源坐標

      //計算環境光
      float k_a = 0.3;//環境光反射系數
      vec3 ambientLight = 0.6 * vec3(1.0, 1.0, 1.0);
      vec3 ambient = k_a*ambientLight;
      
      vec3 N = getNormal(p); //法線
      vec3 L = normalize(lightPos - p); //光照方向
      vec3 V = normalize(ro - p); //視線
      vec3 H = normalize(V+L); //半程向量

      float r = length(lightPos - p);


      //計算漫反射光
      float k_d = 0.6;//漫反射系數
      float dotLN = clamp(dot(L, N),0.0,1.0);//點乘,并將結果限定在0~1
      vec3 diffuse = k_d * (materialColor/r*r) * dotLN;


      //計算高光反射光
      float k_s = 0.8;//鏡面反射系數
      float shininess = 160.0;
      vec3 specularColor = vec3(1.0, 1.0, 1.0);
      vec3 specular = k_s * (specularColor/r*r)* pow(clamp(dot(N, H), 0.0, 1.0), shininess);//計算高光
  
      
      //計算陰影
      vec2 res = rayMarch(p + N*SURF_DIST*2.0,L); 
      if(res.x<length(lightPos-p)-0.001){
        diffuse*=0.1;
      }
        
      //顏色 =  環境光 + 漫反射光 + 鏡面反射光
      return ambient +diffuse + specular;
    }

    void main( void ) {

      //視窗坐標調整為[-1,1],坐標原點在螢屏中心
      vec2 st = (gl_FragCoord.xy * 2. - u_resolution) / u_resolution.y;


      vec3 ro = vec3(0.0,4.0,0.0);//視點
      vec3 rd = normalize(vec3(st.x,st.y,1.0));//視線方向

      vec2 res = rayMarch(ro,rd);//反向光線追蹤求交點距離與材質ID

      float d = res.x;//物體與視點的距離
      float m = res.y;//材質ID
  
      vec3 p = ro + rd * d;

      vec3 materialColor = vec3(1.0, 0.0, 1.0);//默認材質色,使用差集計算出來的內壁會使用該色填充
      
      
      //為不同物體設定不同的材質顏色
      if(m==0.0){
        materialColor = vec3(.2, 0.0, 0.0);
      }
      if(m==1.0){
        materialColor = vec3(.2, 0.0, 1.0);
      }
      if(m==2.0){
        materialColor = vec3(.7, 0.2, 0.0);
      }
      if(m==3.0){
        materialColor = vec3(.8, .9, 0.0);
      }

      vec3 color = vec3(1.0,1.0,1.0);

      //使用Blinn-Phong模型計算光照
      color *= calcBlinnPhongLight( materialColor, p, ro);

      gl_FragColor = vec4(color, 1.0);

    }
    `

    init();
    animate();

    function init() {
      container = document.getElementById('container');

      camera = new THREE.Camera();
      camera.position.z = 1;

      scene = new THREE.Scene();

      var geometry = new THREE.PlaneBufferGeometry(2, 2);

      uniforms = {
        u_time: {
          type: "f",
          value: 1.0
        },
        u_resolution: {
          type: "v2",
          value: new THREE.Vector2()
        },
        u_mouse: {
          type: "v2",
          value: new THREE.Vector2()
        }
      };

      var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: vertexShader,
        fragmentShader: fragmentShader
      });

      var mesh = new THREE.Mesh(geometry, material);
      scene.add(mesh);

      renderer = new THREE.WebGLRenderer();
      //renderer.setPixelRatio(window.devicePixelRatio);

      container.appendChild(renderer.domElement);

      onWindowResize();
      window.addEventListener('resize', onWindowResize, false);

      document.onmousemove = function (e) {
        uniforms.u_mouse.value.x = e.pageX
        uniforms.u_mouse.value.y = e.pageY
      }
    }

    function onWindowResize(event) {
      renderer.setSize(800, 800);
      uniforms.u_resolution.value.x = renderer.domElement.width;
      uniforms.u_resolution.value.y = renderer.domElement.height;
    }

    function animate() {
      requestAnimationFrame(animate);
      render();
    }

    function render() {
      uniforms.u_time.value += 0.02;
      renderer.render(scene, camera);
    }
  </script>
</body>

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

標籤:其他

上一篇:Python文章合集 | (入門到實戰、游戲、Turtle、案例等)

下一篇:關于網路游戲的影響(騰訊游戲)

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