精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

純前端實現圖片偽3D視差效果

開發
本文通過depth-anything獲取圖片的深度圖,同時基于pixi.js,通過著色器編程,實現了通過深度圖驅動的偽3D效果。該方案支持鼠標/手勢與手機陀螺儀雙模式交互,在保證性能的同時,為不同終端用戶提供沉浸式的視覺體驗。

本文提供配套演示代碼,可下載體驗:

Github | vivo-parallax

一、引言

在當今的網頁設計與交互中,3D 效果能極大地提升用戶的視覺體驗和沉浸感。但是3D的物料設計成本依然很高,不僅需要專門的設計師掌握專業的建模工具,而且高精度模型帶來的渲染壓力也使移動端適配變得困難。

在這樣的背景下,利用2D圖片實現偽3D的效果,就展現出獨特的價值。開發者能以極低的資源消耗,在常規圖片素材上構建出具有空間縱深的交互效果。這種技術路徑不僅規避了傳統3D內容生產的復雜性,同時實現了視覺效果與性能消耗的平衡。

二、實現思路

相比二維平面,三維物體多了一個 z 軸作為深度信息。要讓 2D 平面呈現 3D 縱深感,關鍵在于隨著視角偏移時,畫面中的物體產生不同程度的位移,從而營造前后視差,實現偽 3D 效果。

圖片

為此,我們可以通過深度圖來獲取圖片的深度信息,根據這些信息對圖片進行分層。當視角改變時,通過調整不同層的偏移來實現視差效果。

三、獲取深度圖

在前端獲取深度圖可以借助現有的預訓練模型。例如使用 @huggingface/transformers 庫,指定任務類型為 'depth-estimation',并選擇合適的預訓練模型,目前的深度圖推理模型尺寸普遍比較大,綜合效果和模型尺寸最終選擇了 'Xenova/depth-anything-small-hf',量化后的模型尺寸為27.5mb。

import { pipeline } from '@huggingface/transformers';
export async function depthEstimator(url) {
  const depth_estimator = await pipeline('depth-estimation', 'Xenova/depth-anything-small-hf');
  const output = await depth_estimator(url);
  const blob=await output.depth.toBlob()
  return URL.createObjectURL(blob)
}

四、視差效果的實現

若想借助深度圖實現圖片分層,可依據深度區間進行劃分。假設深度圖中純白的色值為 0,純黑色值為 1,若將圖片切分為兩層,那么第一層的色值范圍為 0 - 0.5,第二層則是 0.5 - 1。為使畫面過渡更自然,可適當增加分層的數量。當鏡頭偏移時,層數越小的圖片位移幅度越大,層數越大的圖片位移幅度越小,借此便能實現視差效果。

然而,簡單的分層會引發一個問題:不同層的位移可能導致上層的部分區域遮擋背景圖案,而另一側則會出現空白。

圖片

針對空白部分,可采用光線步進算法進行顏色采樣。

在此,我們選用 Pixi.js 來實現這一效果。作為一款輕量級的 2D 渲染引擎,Pixi.js 在跨平臺 2D 動畫、游戲及圖形界面開發領域表現出色。其精靈支持自定義渲染管線,通過定制圖片片段著色器,能夠輕松實現視差效果。

4.1 光線步進算法(Ray Marching)

首先我們獲取到需要采樣顏色的坐標ray_origin,并根據用戶的交互事件(鼠標,觸摸,陀螺儀)增加鏡頭偏移offset。得到光線發射的起始坐標。

設置采樣步數step,設置光線的偏移向量ray_direction,每一步將光線增加ray_direction/step的坐標。獲取到當前深度圖坐標的深度信息,由于顏色越淺數值越大,要對深度值進行反轉,比對此時光線的z軸是否大于深度的反轉值,如果滿足條件則挑出循環,取此時光線坐標圖片的顏色。

由于每一步增加的偏移值可能跨度比較大,即使滿足z軸大于深度反轉值的條件,但是二者值的差距依然過大,我們還需要做一個二分搜索來優化采樣結果。即偏移值大于深度值,但二者的差值大于閾值的時候,回退一步光線,并將步進值再除以2,可以顯著提升采樣的精度。

圖片

代碼實現

varying vec2 vTextureCoord;
uniform sampler2D depthMap;
uniform sampler2D uSampler;
uniform vec3 offset;
const float enlarge = 1.06;


vec3 perspective(vec2 uv) {
  const int step_count = 5;
  
  vec3 ray_origin = vec3(uv - 0.5, 0);
  ray_origin.xy -= offset.xy;
  
  vec3 ray_direction = vec3(0, 0, 1);
  ray_direction.xy += offset.xy;
  ray_direction /= float(step_count);
  
  const float hit_threshold = 0.01;
  vec4 color = vec4(0.0);
  for (int i = 0; i < step_count; i++) {
    ray_origin += ray_direction;
    float scene_z = 1.0 - texture2D(depthMap, ray_origin.xy + 0.5).x;
    if (ray_origin.z > scene_z) {
      if (ray_origin.z - scene_z < hit_threshold) {
        break;
      }
    ray_origin -= ray_direction;
    ray_direction /= 2.0;
    }
  }
  color = texture2D(uSampler, ray_origin.xy + 0.5);
  return color.rgb;
}


void main(void ) {
  vec2 uv = (vTextureCoord - vec2(0.5)) / vec2(enlarge) + vec2(0.5);
  gl_FragColor = vec4(
    perspective(uv),
    1.0
  );
}

五、深度圖膨脹

邊緣膨脹操作主要用于處理深度圖,通過對每個像素鄰域內的深度值進行分析和處理,增強圖像的邊緣,可以使視差圖的邊緣更加平滑。這里使用一個簡單的膨脹函數實現。

圖片

varying vec2 vFilterCoord;
varying vec2 vTextureCoord;
uniform float widthPx;
uniform float heightPx;
uniform float dilation;
uniform sampler2D uSampler;
const int MAX_RADIUS = 10;


float dilate(vec2 uv, vec2 px) {
  float maxValue = 0.0;
  float minValue = 1.0;
  for (int x = -MAX\_RADIUS; x <= +MAX_RADIUS; x++) {
    for (int y = -MAX\_RADIUS; y <= +MAX_RADIUS; y++) {
      vec2 offset = vec2(float(x), float(y));
      if (length(offset) > float(MAX_RADIUS)) continue;
      offset *= px;
      vec2 uv2 = uv + offset;
      float val = texture2D(uSampler, uv2).x;
      maxValue = max(val, maxValue);
      minValue = min(val, minValue);
    }
  }
  
  return dilation < 0.0
  ? minValue
  : maxValue;
}


  


void main(void ) {
  const float dilationScale = 1.26;
  float dilationStep = abs(dilationScale * dilation) / float(MAX_RADIUS);
  float aspect = widthPx / heightPx;
  vec2 px =
    widthPx > heightPx
      ? vec2(dilationStep / aspect, dilationStep)
      : vec2(dilationStep, dilationStep * aspect);
  gl_FragColor = vec4(vec3(dilate(vTextureCoord, px)), 1.0);


}

六、總結

綜上所述,我們先利用預訓練模型生成圖片的深度圖,再借助 Pixi.js 與光線步進算法達成視差效果,最終通過對深度圖進行膨脹處理,實現邊緣的平滑過渡。

通過上面的操作,我們成功實現了圖片的偽 3D 效果,為用戶帶來了更具沉浸感的視覺體驗。

在實際應用過程中,我們觀察到,當視角偏移幅度過大時畫面會出現采樣失真現象。為解決這一問題,后續可考慮采用動態調整光線步進參數的方法,根據視角變化實時優化光線傳播路徑,從而減少采樣誤差;或者引入屏幕空間遮擋關系,通過精準模擬物體間的遮擋效果,增強畫面的真實感與層次感。隨著 WebGPU 技術的逐步普及,這一方案還有極大的優化空間。我們可借助計算著色器強大的并行計算能力,對復雜的 3D 計算任務進行高效處理,進一步提升計算性能,為網頁端 3D 交互開辟更多可能性,打造更加流暢、逼真的 3D 交互場景。

責任編輯:龐桂玉 來源: vivo互聯網技術
相關推薦

2015-09-09 11:05:52

3d視差引導頁

2021-09-16 07:52:18

SwiftUScroll效果

2023-05-26 07:08:05

CSS模糊實現文字

2021-08-30 06:20:39

CSS 技巧3D 效果

2010-06-09 16:21:10

OpenSUSE界面

2012-07-18 20:59:40

jQuery

2009-05-13 08:13:37

SUSELinux 10.3Nvidia

2011-09-07 10:00:53

Ubuntu3D

2010-01-04 15:17:52

Ubuntu啟動

2021-11-08 06:02:17

CSS 技巧代碼重構

2009-04-03 08:33:59

Symbian諾基亞Photo Brows

2010-06-09 10:13:40

OpenSUSE 3D

2011-05-04 14:10:03

日立3D投影

2013-07-23 07:03:51

Android開發學習Gallery實現3DAndroid源碼下載

2021-01-05 08:10:00

Css前端3D旋轉透視

2013-01-30 16:15:40

adobeHTML5css3

2012-06-16 16:57:52

WebGL

2012-02-27 10:00:50

HTML 5

2022-09-14 09:23:51

Java3D引擎

2011-05-26 10:55:39

點贊
收藏

51CTO技術棧公眾號

www.av网站| 性欧美一区二区| 欧美aaaxxxx做受视频| 成人在线综合网站| 日韩美女毛茸茸| 91免费在线看片| 国产劲爆久久| 欧美视频一区在线观看| 青青草视频在线视频| 黄网在线免费| 国产精品自在欧美一区| 日本亚洲欧美成人| 国产黄在线免费观看| 午夜欧洲一区| 欧美一级午夜免费电影| 亚洲乱码中文字幕久久孕妇黑人| 香蕉视频网站在线观看| caoporn国产精品| 91精品综合久久久久久五月天| 日韩和一区二区| 小说区亚洲自拍另类图片专区| 亚洲国产免费av| 一级黄色片国产| 欧美xxxxxx| 亚洲一级二级在线| 亚洲在线视频一区二区| 亚洲三区在线播放| 国产成人免费视频精品含羞草妖精| 日本一欧美一欧美一亚洲视频| 一区视频免费观看| 奇米影视亚洲| 日韩精品中文字幕有码专区| 4438x全国最大成人| 国产精品久久乐| 色综合久久六月婷婷中文字幕| 欧美国产视频一区| 成人video亚洲精品| 欧美国产精品专区| 免费国产一区二区| 人人妻人人澡人人爽精品日本 | 欧美老少配视频| 精品亚洲aⅴ无码一区二区三区| 露出调教综合另类| 精品国产乱码久久久久久影片| 欧美wwwwwww| 成人国产精选| 精品视频全国免费看| 人妻熟女一二三区夜夜爱| av毛片午夜不卡高**水| 亚洲一区二区三区四区在线观看 | 黄色免费在线观看网站| 中文字幕免费在线观看视频一区| 精品在线一区| 神马午夜精品95| av在线播放不卡| 国产一区免费| 天堂在线视频免费观看| 成人激情小说乱人伦| 国产欧美日韩在线播放| 免费国产羞羞网站视频| 大胆亚洲人体视频| 国产精品亚洲综合| 无码精品人妻一区二区三区影院| av一区二区三区| 久久国产精品免费一区| 青青草娱乐在线| 国产日韩欧美综合一区| 亚洲国产欧洲综合997久久| 91精品专区| 亚洲欧洲无码一区二区三区| 福利网在线观看| 在线观看操人| 亚洲国产日韩精品| 欧美精品一区免费| 精品欧美一区二区三区在线观看 | 91tv亚洲精品香蕉国产一区7ujn| 欧美bbbbbbbbbbbb精品| 久久精品1区| 国产精品嫩草影院久久久| 国产熟女一区二区三区五月婷 | 少妇饥渴放荡91麻豆| 亚洲+小说+欧美+激情+另类 | 免费黄色片网站| 99热国内精品| 久久久久国产一区二区三区| 探花视频在线观看| 毛片一区二区三区| 91在线高清免费观看| 四虎永久在线精品免费网址| 久久久99久久精品欧美| 99re99热| 在线女人免费视频| 欧美日韩国产综合久久| www.美色吧.com| 国产aⅴ精品一区二区三区久久| 色妞一区二区三区| 国产一卡二卡在线| 日本不卡一区二区三区高清视频| 亚洲淫片在线视频| 欧美91精品久久久久国产性生爱| 国产精品毛片久久久久久| 中文字幕の友人北条麻妃| 91av亚洲| 欧美一区二区三区免费视频 | 国产人妻精品一区二区三区| 99精品偷自拍| 一区二区三区四区欧美| 三级中文字幕在线观看| 91精品啪在线观看国产60岁| 粉嫩av懂色av蜜臀av分享| 欧美电影《睫毛膏》| 69久久夜色精品国产69乱青草| 一区二区视频网站| 99re这里只有精品6| 久久av喷吹av高潮av| 自拍网站在线观看| 精品国产一区二区三区四区四| 黄免费在线观看| 亚洲视频中文| 亚洲va欧美va国产综合剧情 | 国产亚洲人成网站| 久久久久免费看黄a片app| 久久影院一区二区三区| 在线成人免费网站| 久久中文字幕免费| k8久久久一区二区三区| 亚洲激情免费视频| 在线观看欧美| 尤物yw午夜国产精品视频明星| 日韩黄色三级视频| 成人午夜在线免费| 91视频 - 88av| 91精品福利观看| 中文字幕久久久av一区| 久久久久在线视频| 99re热这里只有精品免费视频| bt天堂新版中文在线地址| 在线视频成人| 日日噜噜噜夜夜爽亚洲精品| 中文字幕在线日本| 久久蜜桃av一区二区天堂 | 蜜臀av午夜精品久久| 美腿丝袜在线亚洲一区| 日韩一区二区电影在线观看| 一区二区三区电影大全| 亚洲精品天天看| 国产成人自拍视频在线| 不卡av免费在线观看| 18禁网站免费无遮挡无码中文 | 日韩一区二区三区四区五区六区| 免费黄色激情视频| 久久精品国产久精国产爱| 亚洲欧美精品| 男人亚洲天堂| 日韩在线精品一区| 国产一区二区在线不卡| ●精品国产综合乱码久久久久| 一级黄色特级片| 99视频精品全国免费| 成人亚洲欧美一区二区三区| 中文字幕有码在线观看| 欧美va亚洲va在线观看蝴蝶网| 九九热精品免费视频| 懂色av中文一区二区三区| 免费网站在线观看视频| 国产一级成人av| 日本不卡高字幕在线2019| 国产一级网站视频在线| 欧美色图免费看| 国产中文av在线| 国产激情一区二区三区四区| 欧美人成在线观看| 亚洲免费福利一区| 国产日产欧美a一级在线| 岛国成人毛片| 亚洲国产精品久久久| 中文字幕在线播| 国产精品理论在线观看| 亚洲综合中文网| 久久精品首页| 99精品一级欧美片免费播放| 国产精品白浆| 日本欧美爱爱爱| 国产精品va在线观看视色| 亚洲精品在线免费观看视频| 销魂美女一区二区| 亚洲免费观看高清完整版在线观看熊| 野战少妇38p| 丝袜美腿亚洲色图| 黄色一级片网址| 偷拍亚洲色图| 国产一区二区在线播放| a国产在线视频| 少妇高潮久久77777| 国产成人三级在线观看视频| 在线观看日韩毛片| 九九热国产在线| 国产欧美日韩另类视频免费观看| aaa一级黄色片| 欧美专区在线| 久久久成人精品一区二区三区| 日韩av网站在线免费观看| 国产女人18毛片水18精品| 福利成人导航| 久久精品视频一| 欧美美女色图| 欧美本精品男人aⅴ天堂| 天天综合久久综合| 黄色成人在线免费| 亚洲国产精品久| 亚洲国产精品av| 少妇被狂c下部羞羞漫画| 麻豆精品视频在线观看免费| 5月婷婷6月丁香| 欧美日韩国产欧| 久久av秘一区二区三区| 国产成人av| 九九99久久| 99精品国产一区二区三区2021| 国产国语videosex另类| 国产一二三在线| 欧美人在线观看| 免费av不卡| 亚洲欧美精品一区| 空姐吹箫视频大全| 欧美一级欧美三级| 中文字幕精品一区二区精| 色屁屁一区二区| 欧美成人精品欧美一级乱黄| 一区二区三区日韩欧美| 亚洲 欧美 变态 另类 综合| 国产精品视频在线看| 伊人网在线视频观看| av色综合久久天堂av综合| 中文字幕一区二区三区人妻在线视频| 久久国内精品自在自线400部| 国内外免费激情视频| 亚洲欧美久久| 无码播放一区二区三区| 国产欧美成人| 成人毛片视频网站| 国产日韩精品视频一区二区三区 | 肉肉av福利一精品导航| 欧美成人精品欧美一级乱| 亚洲欧美日韩国产| 极品美女扒开粉嫩小泬| 亚洲三级毛片| 91成人在线观看喷潮教学| 在线播放亚洲| 日本a在线免费观看| 欧美午夜在线视频| 人人妻人人澡人人爽欧美一区双| 欧美日韩免费| av在线播放天堂| 亚洲一区自拍| 久久久久免费精品| 日韩电影免费一区| 亚洲欧美国产日韩综合| 久久国产精品99久久久久久老狼| 日本在线观看免费视频| 久久99九九99精品| 在线成人免费av| 成人午夜视频在线| v8888av| 国产蜜臀97一区二区三区 | 亚洲一区在线观看网站| 日韩欧美亚洲国产| 狠狠操狠狠色综合网| 精品成人无码久久久久久| 精品视频999| av手机免费看| 亚洲第一区在线观看| 久久精品国产亚洲a∨麻豆| 色视频www在线播放国产成人 | 97超级碰碰人国产在线观看| 奇米777日韩| 成人黄色av免费在线观看| 一区二区在线视频观看| 久久超碰亚洲| 性欧美69xoxoxoxo| 欧美一级片免费播放| 久久综合网络一区二区| 中文字幕视频三区| 9l国产精品久久久久麻豆| 一二三四国产精品| 亚洲黄色在线视频| 国产日产精品一区二区三区| 欧美美女bb生活片| 丰满熟妇人妻中文字幕| 亚洲人成在线观看| 69成人在线| 国产mv久久久| 亚洲精品a区| 日韩久久久久久久久久久久久| 一区二区三区网站| 男女av免费观看| 国产福利一区在线观看| 亚洲熟妇一区二区三区| 亚洲精品视频在线观看网站| 国产高潮久久久| 欧美一区二区三区在线电影| 日本免费一区二区三区最新| 久久综合电影一区| 三级成人黄色影院| 高清一区二区三区视频| 清纯唯美亚洲综合一区| 欧美久久久久久久久久久久久 | 国产美女91呻吟求| 天堂俺去俺来也www久久婷婷| 在线观看福利一区| 亚洲综合精品四区| 一区二区在线免费观看视频| 国产视频不卡一区| 日韩欧美高清在线观看| 欧美一区二区精品| yw在线观看| 国产69久久精品成人| 亚洲国产中文在线二区三区免| 亚洲日本精品| 日韩在线观看一区二区| 国产精品久久久久久亚洲av| 中文字幕字幕中文在线中不卡视频| 国产成人综合欧美精品久久| 亚洲第一免费播放区| 91网址在线观看| 91精品美女在线| 精品国产一区二区三区| 成年人观看网站| 成人av网站在线观看| 国产性生活网站| 欧美一区二区三区性视频| 98在线视频| 国产精品白丝jk喷水视频一区| 奇米777国产一区国产二区| 日韩国产成人无码av毛片| 国产乱人伦偷精品视频不卡| 97在线观看免费高| 欧美日韩日本视频| 91网在线播放| 国产精品日韩久久久久| 欧美日韩一二三四| 国内自拍视频网| 中国av一区二区三区| 丰满人妻一区二区三区四区| 亚洲天堂av电影| 欧美影视资讯| 亚洲高清不卡一区| 久久国产精品72免费观看| 后入内射无码人妻一区| 欧美日本一道本在线视频| 日本福利专区在线观看| 国产综合久久久久| 在线国产一区| 欧美一级大片免费看| 亚洲一二三四在线| 午夜影院在线视频| 欧美壮男野外gaytube| 精品美女久久| 9久久婷婷国产综合精品性色| 国产精品午夜春色av| 一起草av在线| 欧美日韩国产第一页| 欧美xxxx在线| 99热手机在线| 亚洲欧洲三级电影| 黄色av小说在线观看| 欧美亚洲在线观看| 欧美一二区在线观看| 91视频这里只有精品| 亚洲精品国产精华液| 无码精品人妻一区二区三区影院 | 亚洲一区二区av| 成人在线观看毛片| av不卡在线观看| 波多野结衣视频网址| 精品国内亚洲在观看18黄| 日本少妇精品亚洲第一区| 免费欧美一级视频| 国产精品美女久久久久av爽李琼 | 日韩精品在线私人| 久久99久久久精品欧美| 国产xxxx振车| 国产片一区二区| av中文字幕播放| 热久久这里只有| 91精品99| 女同毛片一区二区三区| 欧美久久久影院| 成人一级福利| 中文字幕中文字幕在线中心一区| 成人18视频在线播放| 中文字幕在线日亚洲9| 久久久久久成人| 成人综合久久| 亚洲久久久久久| 欧美欧美午夜aⅴ在线观看| 国产在线xxx| 手机成人av在线| 久久久国产精品午夜一区ai换脸| 国产日产亚洲系列最新|