精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美剧在线观看| 欧美一区二区三区四区久久| 欧美日韩在线一区二区三区| 一级片视频免费| 国产精品麻豆久久| 亚洲第一免费网站| 男女爽爽爽视频| 丝袜在线观看| 国产三级一区二区| 97人人模人人爽视频一区二区 | 综合色中文字幕| 国产午夜精品一区| 亚洲天堂自拍偷拍| 99精品视频网| 麻豆国产精品va在线观看不卡| 国产精品成人99一区无码 | 欧美性猛交xxxx富婆| 一区高清视频| 全部免费毛片在线播放网站| 国产成人综合亚洲91猫咪| 日韩免费在线观看视频| 久久激情免费视频| 首页国产精品| 国产亚洲精品一区二区| 大尺度做爰床戏呻吟舒畅| 欧美jizz18| 色猫猫国产区一区二在线视频| 精品一区二区三区无码视频| 国产黄网站在线观看| 国产亚洲制服色| 国产亚洲一区二区三区在线播放| 国产伦精品一区二区三区免.费| 久久精品亚洲一区二区| 韩国日本不卡在线| 青青草激情视频| 日韩成人精品一区| 亚洲久久久久久久久久| 亚洲天堂美女视频| eeuss国产一区二区三区四区| 8v天堂国产在线一区二区| 美女一区二区三区视频| 亚洲综合电影| 精品毛片网大全| 久久国产精品视频在线观看| av影片在线| 亚洲国产欧美日韩另类综合 | 国产欧美日韩伦理| 亚洲欧美另类综合| 成人性视频免费网站| 99精品在线直播| 成人av无码一区二区三区| 九色综合国产一区二区三区| 国产日本欧美在线观看| 一级特黄aa大片| 看片网站欧美日韩| 国产日韩专区在线| 一本色道久久综合熟妇| 精品在线免费视频| 91免费版网站入口| 国产福利资源在线| 国产99一区视频免费| 国产v亚洲v天堂无码| 蜜臀av午夜精品| av成人免费在线| 精品视频一区在线| 亚洲欧美日韩动漫| 久久久欧美精品sm网站| 先锋影音一区二区三区| 麻豆tv入口在线看| 亚洲一区二区精品视频| 人妻av中文系列| 姬川优奈av一区二区在线电影| 在线日韩国产精品| www.这里只有精品| 视频欧美一区| 亚洲精品国产精品久久清纯直播| 少妇饥渴放荡91麻豆| 欧美美女在线观看| 日韩一区二区av| 国产极品美女高潮无套嗷嗷叫酒店 | 日韩电影在线观看中文字幕| 中文字幕在线观看免费高清| 一区二区三区在线观看免费| 欧美激情视频在线免费观看 欧美视频免费一 | 国产啪精品视频网站| 国产成人精品毛片| www国产成人免费观看视频 深夜成人网| 日本视频一区二区不卡| 精品自拍一区| 天天亚洲美女在线视频| mm131国产精品| а√中文在线天堂精品| 亚洲人成电影网站色| 国产麻豆视频在线观看| 亚洲国产午夜| 国产精品视频在线播放| 免费看黄网站在线观看| 国产精品视频观看| avav在线播放| 国产精品美女午夜爽爽| 亚洲精品电影网站| 国产精品视频看看| 亚洲欧美日韩国产| 91在线视频一区| 六十路在线观看| 亚洲欧美日韩在线| 久久久久国产精品熟女影院| aaa国产精品视频| 色偷偷偷亚洲综合网另类| 在线观看国产亚洲| 国产一区二区不卡老阿姨| 欧美日韩另类丝袜其他| 亚洲区欧洲区| 欧美性猛交xxxx黑人交| 性囗交免费视频观看| 亚洲无中文字幕| 国产精品久久77777| 水莓100在线视频| 亚洲欧美日韩在线播放| 日韩av片网站| 久久av综合| 欧美黑人国产人伦爽爽爽| 最新中文字幕在线观看视频| 91一区一区三区| 国产内射老熟女aaaa| 国外成人福利视频| 亚洲无线码在线一区观看| 日韩免费一级片| 丁香婷婷综合激情五月色| 中国成人在线视频| 日韩经典一区| 亚洲视屏在线播放| 亚洲黄色小说图片| 99精品欧美一区二区三区小说| 青青青青在线视频| 一区二区视频| 九九热这里只有精品免费看| 国产女人18毛片18精品| 国产精品久久二区二区| 日本在线播放一区二区| 成人精品影视| 国产精品一区电影| chinese偷拍一区二区三区| 色悠悠久久综合| 毛片网站免费观看| 日韩一区二区免费看| 国产精品午夜av在线| 搞黄网站在线看| 欧美不卡视频一区| 久久国产精品二区| 成人一区二区三区中文字幕| 欧美国产综合在线| 波多野结衣欧美| 国产69精品久久久| 五月婷婷免费视频| 色婷婷综合在线| 日本少妇xxxxx| 美国十次了思思久久精品导航| 亚洲日本japanese丝袜| 亚洲狼人综合| 久久999免费视频| 日本美女一级视频| 欧美性感美女h网站在线观看免费| 日韩乱码人妻无码中文字幕久久| 日韩精品一二三四| 亚洲自拍三区| 亚洲精品a区| 26uuu久久噜噜噜噜| 黄色网址在线播放| 欧美日韩精品一区二区三区四区| 无码人妻精品一区二区三区夜夜嗨| 国产成人福利片| 国产在线精品91| 欧美亚洲国产精品久久| 成人网中文字幕| free性护士videos欧美| 亚洲品质视频自拍网| 91麻豆国产视频| 亚洲国产精品一区二区www| 中文字幕人妻一区二区| 蜜臀久久99精品久久久久久9| 300部国产真实乱| 羞羞答答一区二区| 国产精品专区一| h片在线观看| 中文字幕精品久久久久| 午夜精品无码一区二区三区| 欧美性黄网官网| 校园春色 亚洲| 久久天天做天天爱综合色| 午夜久久福利视频| 国产精品美女| www亚洲国产| 亚洲国产国产| 亚洲一区二区三区四区在线播放| 悠悠资源网亚洲青| 久久久电影免费观看完整版| 天堂在线一二区| 欧美一区二区视频网站| 国产免费一区二区三区四区五区 | 精品亚洲一区二区三区在线观看| 伊人网免费视频| 图片区小说区区亚洲影院| 欧美肥妇bbwbbw| 久久精品一区二区三区四区| 精品人妻一区二区免费| 久久99深爱久久99精品| 日本欧美黄色片| 婷婷久久综合| 日本一区二区三区在线视频| 红杏成人性视频免费看| 成人激情春色网| 婷婷六月国产精品久久不卡| 色综合色综合久久综合频道88| 波多野结衣一区二区| 日韩精品黄色网| 亚洲免费一级片| 4438成人网| 中文字幕在线播放av| 色菇凉天天综合网| 香蕉免费毛片视频| 一区二区三区色| 国产又粗又硬又长又爽| 欧美激情一区在线观看| 魔女鞋交玉足榨精调教| kk眼镜猥琐国模调教系列一区二区 | 影音欧美亚洲| 精品国产91乱码一区二区三区四区| 九九九九久久久久| 超碰成人在线免费| 成人做爰66片免费看网站| 麻豆国产一区| 国产综合视频在线观看| 国产成人精品一区二区三区在线 | 成年人午夜免费视频| 欧美有码视频| 亚洲天堂av免费在线观看| 欧美日韩亚洲在线观看| 日本一区二区三区视频在线观看 | 少妇久久久久久久| 日韩欧美在线免费| 免费观看成人毛片| 精品国产鲁一鲁一区二区张丽| 国产成人在线观看网站| 欧美日韩美女视频| 日产精品久久久| 欧美午夜精品在线| 欧美a视频在线观看| 欧美视频在线观看 亚洲欧| 91精品国产乱码久久久张津瑜| 午夜视频一区在线观看| 国产午夜精品一区二区理论影院| 五月综合激情网| 免费av网站在线| 色婷婷综合久色| 曰批又黄又爽免费视频| 欧美高清性hdvideosex| 精品国产无码AV| 亚洲第一色中文字幕| 亚洲av成人无码久久精品老人 | 国产一区二区三区精品视频| 制服丝袜中文字幕第一页| 国产精品99久久久| www.四虎精品| 久久亚洲春色中文字幕久久久| 天堂久久精品忘忧草| 最新国产成人在线观看| 欧美三级免费看| 欧美日韩加勒比精品一区| 免费一级a毛片| 欧美一区二区三区视频在线| 好吊视频一区二区三区| 亚洲视频在线观看免费| 免费的黄网站在线观看| 久久久久久亚洲| 日日av拍夜夜添久久免费| 国产原创欧美精品| 成人午夜大片| 亚洲亚洲精品三区日韩精品在线视频| 艳女tv在线观看国产一区| 日韩av新片网| 琪琪一区二区三区| 国产人妖在线观看| 国产三级欧美三级日产三级99| 午夜激情福利网| 日韩欧美精品网址| 国产又粗又猛视频| 亚洲精品国精品久久99热| 777电影在线观看| 国内精品400部情侣激情| 亚州一区二区三区| 成人激情av| 色琪琪久久se色| 欧美成人一区二区在线观看| 捆绑调教美女网站视频一区| 精品国产一区在线| 最近中文字幕一区二区三区| 天堂在线免费观看视频| 日韩一区二区高清| 国产中文字幕在线播放| 欧美激情视频给我| 欧美一级做a| 欧美美乳视频网站在线观看| 亚洲一区二区三区| av在线无限看| 91视频.com| 国产一级做a爱免费视频| 欧美影院午夜播放| 香蕉av一区二区三区| 久久国产色av| 巨大黑人极品videos精品| 美国av一区二区三区| 欧美激情无毛| 91精产国品一二三产区别沈先生| 2020国产成人综合网| 日本天堂在线视频| 欧美一区二区三区视频免费播放| 成人高清免费观看mv| 26uuu亚洲国产精品| 一区二区三区在线资源| 亚洲小视频在线播放| 美女网站在线免费欧美精品| 男人舔女人下部高潮全视频| 五月天亚洲精品| www.av日韩| 欧美成人小视频| 91视频亚洲| 中文字幕中文字幕一区三区| 日本不卡123| 亚洲色图第四色| 91福利精品视频| 你懂的免费在线观看视频网站| 7m精品福利视频导航| 国产厕拍一区| 国产91xxx| 成人v精品蜜桃久久一区| 国产一级片免费观看| 日韩欧美国产系列| 99热国产在线中文| 亚洲xxxxx电影| 一本一道久久综合狠狠老| www.污污视频| 亚洲欧美一区二区三区久本道91| 99国产精品久久久久99打野战| 久久精品视频一| 精品国产亚洲日本| 日本一道在线观看| 国产成人免费在线观看| 久久免费在线观看视频| 日韩西西人体444www| 国产99re66在线视频| 久久久国产精品一区二区三区| 国产欧美日本| 美女被到爽高潮视频| 欧美午夜精品电影| 视频一区二区三区不卡| 91色精品视频在线| 欧美特黄一级| 51调教丨国产调教视频| 在线日韩国产精品| 免费黄色在线网站| 99久久综合狠狠综合久久止| 国产情侣一区| 精品无码人妻一区二区免费蜜桃 | 亚洲AV无码成人片在线观看| 国模吧一区二区| 国产探花在线精品| www午夜视频| 亚洲国产日韩综合久久精品| 日韩国产福利| 成人黄色免费看| 国产精品mm| 成人午夜剧场视频网站| 欧美剧情电影在线观看完整版免费励志电影| 国内外激情在线| 精品国产区在线| 蜜臀av一区二区| 久久一二三四区| 亚洲欧美国内爽妇网| 久久免费影院| 农民人伦一区二区三区| 久久你懂得1024| 国产精品特级毛片一区二区三区| 久久久久成人精品| 神马电影久久| 涩视频在线观看| 在线观看免费亚洲| 性欧美高清come| 欧洲亚洲一区二区| 国产一区二区三区免费播放| 少妇太紧太爽又黄又硬又爽| 久久不射热爱视频精品| 色综合www| 日本xxxx免费| 欧美三级日韩三级| 女厕盗摄一区二区三区| 国产三级中文字幕| 久久一留热品黄| 亚洲美女性生活| 成人激情免费在线|