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

WebGPU 入門:繪制一個三角形

開發 前端
簡單來說,WebGPU 提供一個更現代的 Web 上的圖形渲染標準。WebGPU 的出現就是為了取代 WebGL 的,因為后者的 API 實在有些過時,無法利用好現代 GPU 的一些高級特性,本身的 API 設計也較難使用。相比 WebGL,WebGPU 有更好的性能表現,API 更底層更靈活,并支持更高級的現代特性,比如計算著色器。毫無疑問,WebGPU 是前端圖形渲染的未來,值得去

大家好,我是前端西瓜哥。

今天我們來入門 WebGPU,來寫一個圖形版本的 Hello World,即繪制一個三角形。

WebGPU 是什么?

WebGPU 是一個正在開發中的潛在 Web 標準和 JavaScript API,目標是提供 “現代化的 3D 圖形和計算能力”。

簡單來說,WebGPU 提供一個更現代的 Web 上的圖形渲染標準。

WebGPU 的出現就是為了取代 WebGL 的,因為后者的 API 實在有些過時,無法利用好現代 GPU 的一些高級特性,本身的 API 設計也較難使用。

相比 WebGL,WebGPU 有更好的性能表現,API 更底層更靈活,并支持更高級的現代特性,比如計算著色器。

毫無疑問,WebGPU 是前端圖形渲染的未來,值得去學習一下。

像是以性能著稱的前端圖形庫 PixiJS,也開始進行支持 WebGPU 的工作,并在最近發布了預覽版本,聲稱性能將是 WebGL 的 2.5 倍。

不過目前 WebGPU 還不夠成熟,仍有許多工作要做,且只有少數瀏覽器的最新版本直接支持或通過設置開啟。

即使之后所有瀏覽器都支持了,舊版本瀏覽器還是不支持的,離大范圍使用還有相當長的一段路要走。

只能說未來可期。

但生產中,我們可以做一個回退機制:如果瀏覽器支持 WebGPU,我們用 WebGPU 去渲染,如果不支持就回滾到 WebGL。

只要在底層渲染方案上封裝一層渲染器 renderer,就像 PixiJS 現在做的事情一樣,個人還是比較期待它在性能上的提升的。

繪制三角形

OK,我們開始用 WebGPU 繪制一個三角形。

確保你的瀏覽器支持 WebGPU,建議用 Chrome,并更新到最新版本。

這里我們創建一個寬高各為 300 的 canvas 元素,用于繪制圖形。

<canvas width="300" height="300"></canvas>

初始化 WebGPU 相關的一些對象。

adapter 和 device

創建一個適配器對象 adapter,適配器是一個 GPU 物理硬件設備的抽象。

const adapter = await navigator.gpu.requestAdapter();

requestAdapter() 方法會查看系統上所有可用的 GPU 設備,并選擇其中合適的適配器。該方法可以傳一些參數,去按條件匹配。比如 { powerPreference: 'low-power' } 表示優先使用低能耗的 GPU。

此外,這個方法返回的是一個 Promise,即它是 異步的,需要用 await 的方式去等待異步的結果。

然后基于 adapter,調用 requestDevice 方法拿到設備對象 device。

device 可以理解為 adapter 的一個會話。做個比喻的話 adapter 是一個公司,device 是一個具體干活的人。

const device = await adapter.requestDevice();

requestDevice() 方法也可以傳入配置項,去開啟一些高級特性,或是指定一些硬件限制,比如最大紋理尺寸。

配置 canvas

類似 canvas 2d 和 webgl,我們需要通過 canvas 元素拿到上下文。

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('webgpu');

接著是調用 ctx.configure() 方法配置剛剛聲明的 device 對象和像素格式。

const canvasFormat = navigator.gpu.getPreferredCanvasFormat();
// 給上下文配置 device 對象和
ctx.configure({
  device,
  format: canvasFormat,
});

navigator.gpu.getPreferredCanvasFormat() 會返回當前環境合適的像素格式的字符串標識,通常是 'bgra8unorm',表示用 8 位無符號整數來表示藍色、綠色、紅色和透明度四個分量。

設置背景色

創建命令編碼器 GPUCommandEncoder 實例,它用于編碼需要提交給 GPU 的命令。

const encoder = device.createCommandEncoder();

開啟一個新的渲染通道(Render Pass),這里清空顏色緩沖區時填充了一個淺藍色背景。

和 WebGL 一樣,使用 RGBA 的格式,每個分量為 0 到 1 的范圍,比如 { r: 1, g: 0, b: 0, a: 1 } 表示紅色,或者你可以用數組的形式 [1, 0, 0, 1]。

const pass = encoder.beginRenderPass({
  // 顏色附件,一個用于存儲渲染輸出顏色數據的紋理
  colorAttachments: [
    {
      // 要渲染到的目標
      view: ctx.getCurrentTexture().createView(),
      // 渲染前清空顏色緩沖區
      loadOp: 'clear',
      // 清除顏色為淺藍色,不設置會默認使用黑色
      clearValue: { r: 0.6, g: 0.8, b: 0.9, a: 1 },
      // 渲染結果會被保留在紋理中,后序好繪制到 canvas 上
      storeOp: 'store',
    },
  ],
});

我們先不繪制三角形,看看背景的渲染效果,為此我們提前執行下面代碼:

// 這里是繪制三角形的代碼,之后會實現

pass.end(); // 完成指令隊列的記錄
const commandBuffer = encoder.finish(); // 結束編碼
device.queue.submit([commandBuffer]); // 提交給 GPU 命令隊列

遠峰藍。

創建緩沖區

先說說 WebGPU 的坐標系,它和 WebGL 一樣,原點在畫布中心,x 軸向右,y 軸向上,取值范圍都是 -1 到 1。

聲明頂點數據。這些頂點為組成三角形的三個坐標。

const vertices = new Float32Array([
  -0.5, -0.5,
  0.5, -0.5,
  0.5, 0.5,
]);

然后創建頂點緩沖區:

const vertexBuffer = device.createBuffer({
  // 標識,字符串隨意寫,報錯時會通過它定位
  label: 'Triangle Vertices',
  // 緩沖區大小,這里是 24 字節。6 個 4 字節(即 32 位)的浮點數
  size: vertices.byteLength,
  // 標識緩沖區用途(1)用于頂點著色器(2)可以從 CPU 復制數據到緩沖區
  usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
});

label 方便我們定位錯誤位置:

接著是將頂點數據復制到緩沖區:

device.queue.writeBuffer(vertexBuffer, /* bufferOffset */ 0, vertices);

參數 bufferOffset 表示緩沖區偏移多少字節數的位置寫入數據。

讀取方式

設置緩沖區的讀取方式。

const vertexBufferLayout = {
  // 每組讀 8 個字節。一個坐標為兩個浮點數(2 * 4字節)
  arrayStride: 2 * 4, 
  attributes: [
    {
      // 指定數據格式,這樣 WebGPU 才知道該如何解析,格式為 2 個 32位浮點數
      format: 'float32x2',
      offset: 0, // 從每組的第一個數字開始
      shaderLocation: 0, // 頂點著色器中的位置
    },
  ],
};

attributes 是一個數組,這里我們只有頂點要讀,所以只有一個數組元素。如果引入了顏色值并和頂點放在一起,我們就要多聲明一個數組元素,并將 offset 指定到顏色的位置。

這個對象此時還沒用到,后面設置渲染流水線時會用到。

著色器

聲明 WebGPU 的著色器,創建著色器模塊(GPUShaderModule)。

WebGPU 使用特有的 WGSL 著色器語言,頂點著色器和片元著色器可以寫在一起的。

// 創建著色器模塊
const vertexShaderModule = device.createShaderModule({
  label: 'Vertex Shader',
  code: `
    @vertex
    fn vertexMain(@location(0) pos: vec2f) -> @builtin(position) vec4f {
      return vec4f(pos, 0, 1);
    }

    @fragment
    fn fragmentMain() -> @location(0) vec4f {
      return vec4f(1, 0, 0, 1);
    }
  `,
});

頂點著色器函數。

@vertex 
fn vertexMain(@location(0) pos: vec2f) -> @builtin(position) vec4f {
  return vec4f(pos, 0, 1);
}
  • @vertex:裝飾器,表示頂點著色器主函數。
  • @location(0):緩沖區讀取方式設置的 shaderLocation,這里拿到了兩個浮點數。
  • vec2f:兩個浮點數的向量,同理,vec4f 為 4 浮點數的向量。
  • -> @builtin(position):表示函數的返回值會被設置為內置的頂點位置變量。WebGPU 是利用函數的返回值配合修飾符的方式進行內部變量賦值的。

片元著色器。

@fragment
fn fragmentMain() -> @location(0) vec4f {
  return vec4f(1, 0, 0, 1); // 紅色
}
  • @fragment 表示片元著色器主函數。
  • -> @location(0) 表示將返回的顏色輸出到位置為 0 的顏色附件上,簡單來說,就是給對應點設置為對應顏色。

渲染流水線

創建渲染流水線,也就是把之前的設置組合起來,用哪個著色器的哪個函數作為入口、如何讀取緩沖區等。

const pipeline = device.createRenderPipeline({
  label: 'pipeline', // 標識,定位錯誤用
  layout: 'auto', // 自動流水線布局
  vertex: {
    module: vertexShaderModule, // 著色器模塊
    entryPoint: 'vertexMain', // 入口函數為 vertexMain
    buffers: [vertexBufferLayout], // 讀取緩沖區的方式
  },
  fragment: {
    module: vertexShaderModule,
    entryPoint: 'fragmentMain',
    targets: [
      {
        format: canvasFormat, // 輸出到 canvas 畫布上
      },
    ],
  },
});

將渲染流水線設置到 pass 上。

pass.setPipeline(pipeline);

將緩沖區綁定到管線的第一個頂點緩沖槽(slot)。

pass.setVertexBuffer(0, vertexBuffer);

繪制圖元,這里要設置繪制幾組,一組是兩個點,所以要處以 2。

pass.draw(vertices.length / 2);

然后就是前面講過的收尾代碼。

pass.end(); // 完成指令隊列的記錄
const commandBuffer = encoder.finish(); // 結束編碼
device.queue.submit([commandBuffer]); // 提交給 GPU 命令隊列

至此,一個三角形就畫好了。

繪制結果

完整代碼

線上 demo 演示:

https://codesandbox.io/s/lg4w27?file=/src/index.mjs。

完整代碼:

const render = async () => {
  const adapter = await navigator.gpu.requestAdapter();
  const device = await adapter.requestDevice();
  const canvas = document.querySelector('canvas');
  const ctx = canvas.getContext('webgpu');
  const canvasFormat = navigator.gpu.getPreferredCanvasFormat();
  ctx.configure({
    device,
    format: canvasFormat,
  });

  const encoder = device.createCommandEncoder();
  const pass = encoder.beginRenderPass({
    colorAttachments: [
      {
        view: ctx.getCurrentTexture().createView(),
        loadOp: 'clear',
        clearValue: { r: 0.6, g: 0.8, b: 0.9, a: 1 },
        storeOp: 'store',
      },
    ],
  });

  // 創建頂點數據
  // prettier-ignore
  const vertices = new Float32Array([
    -0.5, -0.5,
    0.5, -0.5,
    0.5, 0.5,
  ]);

  // 緩沖區
  const vertexBuffer = device.createBuffer({
    // 標識,字符串隨意寫,報錯時會通過它定位,
    label: 'Triangle Vertices',
    // 緩沖區大小,這里是 24 字節。6 個 4 字節(即 32 位)的浮點數
    size: vertices.byteLength,
    // 標識緩沖區用途(1)用于頂點著色器(2)可以從 CPU 復制數據到緩沖區
    // eslint-disable-next-line no-undef
    usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
  });
  // 將頂點數據復制到緩沖區
  device.queue.writeBuffer(vertexBuffer, /* bufferOffset */ 0, vertices);

  // GPU 應該如何讀取緩沖區中的數據
  const vertexBufferLayout = {
    arrayStride: 2 * 4, // 每一組的字節數,每組有兩個數字(2 * 4字節)
    attributes: [
      {
        format: 'float32x2', // 每個數字是32位浮點數
        offset: 0, // 從每組的第一個數字開始
        shaderLocation: 0, // 頂點著色器中的位置
      },
    ],
  };

  // 著色器用的是 WGSL 著色器語言
  const vertexShaderModule = device.createShaderModule({
    label: 'Vertex Shader',
    code: `
      @vertex
      fn vertexMain(@location(0) pos: vec2f) -> @builtin(position) vec4f {
        return vec4f(pos, 0, 1);
      }

      @fragment
      fn fragmentMain() -> @location(0) vec4f {
        return vec4f(1, 0, 0, 1);
      }
    `,
  });

  // 渲染流水線
  const pipeline = device.createRenderPipeline({
    label: 'pipeline',
    layout: 'auto',
    vertex: {
      module: vertexShaderModule,
      entryPoint: 'vertexMain',
      buffers: [vertexBufferLayout],
    },
    fragment: {
      module: vertexShaderModule,
      entryPoint: 'fragmentMain',
      targets: [
        {
          format: canvasFormat,
        },
      ],
    },
  });

  pass.setPipeline(pipeline);
  pass.setVertexBuffer(0, vertexBuffer);
  pass.draw(vertices.length / 2);

  pass.end();
  const commandBuffer = encoder.finish();
  device.queue.submit([commandBuffer]);
};

render();

結尾

本文講解了如何用 WebGPU 繪制一個三角形。可以看到它和 WebGL 的邏輯有很多共同之處的,都要創建緩沖區、著色器、定義讀取方式。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-04-17 09:01:01

WebGL繪制三角形

2020-12-09 08:34:24

css生成器設計師

2016-10-20 13:36:28

WebRTC瀏覽器服務器

2021-10-19 10:09:21

三角形個數數組

2013-09-26 13:43:13

iOS開發OpenGL ES教程圖元

2022-09-14 15:17:26

ArkUI鴻蒙

2022-03-16 14:27:49

CSS三角形前端

2023-05-06 07:23:57

2021-08-29 18:32:18

CSS

2012-12-24 09:55:15

iOSUnity3D

2024-02-20 18:30:53

CSS屬性邊框

2018-03-02 15:54:37

三角形主機比特幣

2021-07-16 05:59:27

CSS 技巧帶圓角的三角形

2021-04-15 06:02:50

CSS 三角形技巧

2013-09-26 14:09:31

iOS開發OpenGL ES教程繪制矩形

2025-03-11 12:07:10

2021-09-24 09:22:26

AI 數據人工智能

2020-04-22 11:19:07

貪心算法動態規劃

2023-05-31 20:10:03

WebGL繪制立方體

2022-06-06 10:44:10

C++語言鴻蒙
點贊
收藏

51CTO技術棧公眾號

97久久天天综合色天天综合色hd| 亚洲视频一区二区三区| 黄色片免费在线观看视频| 亚洲a视频在线| 麻豆九一精品爱看视频在线观看免费| 一区国产精品视频| 五月六月丁香婷婷| 深夜在线视频| 日韩理论片在线| 国产在线一区二区三区播放| 中文字幕免费高清在线观看| 欧美成人高清| 亚洲一区av在线播放| 99999精品| 中文字幕成在线观看| 国产精品久久久久久久久动漫| 99九九视频| 瑟瑟视频在线免费观看| 黄色成人在线网址| 综合网日日天干夜夜久久| 国产高清成人久久| 国产乱码精品一区二区三区亚洲人 | 亚洲综合一区二区三区| 神马欧美一区二区| 蜜臀久久久久久999| 久久精品72免费观看| 国产91精品黑色丝袜高跟鞋| 538精品在线视频| 欧美军人男男激情gay| 精品剧情在线观看| 香蕉视频999| 国产电影一区二区三区爱妃记| 亚洲最快最全在线视频| 在线一区高清| 99riav在线| 久久久久国产精品人| 国产成人亚洲欧美| 国产精品伦理一区| 蜜臀av亚洲一区中文字幕| 5566日本婷婷色中文字幕97| 久草网在线观看| 91tv精品福利国产在线观看| 中文字幕国产亚洲| 欧美熟妇激情一区二区三区| 日韩福利视频一区| 亚洲国产精品成人精品| 中文字幕99页| www.久久东京| 精品久久人人做人人爽| 日本少妇一级片| 亚洲高清999| 日韩三级高清在线| 99热这里只有精品2| 在线免费成人| 这里只有精品99re| 福利视频999| 成人黄色91| 欧美一区二区三区小说| 亚洲精品中文字幕乱码无线| 国产精品美女久久久久人| 91精品国产综合久久久久久| www.桃色.com| 97久久综合精品久久久综合| 精品盗摄一区二区三区| 亚洲av无码一区东京热久久| 国内精品偷拍| 亚洲精品中文字| 亚洲图片另类小说| 成人一二三区| 久久最新资源网| 免费人成视频在线| 野花国产精品入口| 国产精品96久久久久久| 亚洲精品一区二区二区| 国产美女在线观看一区| 国产精品久久久久久免费观看| 内射后入在线观看一区| 97se狠狠狠综合亚洲狠狠| 欧美日韩成人一区二区三区| 91大神xh98hx在线播放| 亚洲欧洲www| 丁香六月激情婷婷| 伊人久久在线| 欧美精品一卡两卡| www.com日本| 国产精品入口久久| 久久精品亚洲一区| 国产在线观看免费av| 久久人人精品| 亚洲a区在线视频| 欧美一区二区黄片| 久久精品网站免费观看| 日本美女爱爱视频| 3d欧美精品动漫xxxx无尽| 欧美精品在线观看一区二区| 人妻av一区二区| 精品久久美女| 久久久久亚洲精品国产| 波多野结衣二区三区| 国产麻豆成人精品| 欧美日产一区二区三区在线观看| 国产传媒在线播放| 欧美性色视频在线| 无套内谢丰满少妇中文字幕| 日韩电影在线观看完整免费观看| 久久精品电影网| 国产91精品一区| 国产综合色产在线精品| 欧美视频观看一区| 日本天码aⅴ片在线电影网站| 色视频一区二区| 欧美一级大片免费看| 国产亚洲一区二区三区啪| 欧美成人精品在线视频| 久久精品偷拍视频| www.性欧美| 永久免费看av| 草莓视频成人appios| 日韩禁在线播放| 天天干中文字幕| 麻豆极品一区二区三区| 欧美午夜精品久久久久久蜜| 超碰在线中文字幕| 日韩免费成人网| 糖心vlog免费在线观看| 日韩精品一级二级| 麻豆成人av| а√在线天堂官网| 日韩欧美一级在线播放| 中文字幕乱码av| 奇米777欧美一区二区| 久久综合九色综合久99| 看黄在线观看| 亚洲国产成人精品电影| 欧美毛片在线观看| 国内精品视频666| 亚洲精品一区二区毛豆| 亚洲日本网址| 亚洲天堂免费观看| 99久久精品国产亚洲| av中文字幕亚洲| 2022中文字幕| 亚洲图色一区二区三区| 久久不射电影网| 精品人妻无码一区二区| 亚洲精品免费看| 日本亚洲一区二区三区| 99精品视频精品精品视频| 91精品久久久久久久久久入口 | www欧美成人18+| 北条麻妃在线视频观看| 精品国产影院| 91干在线观看| 黄色毛片在线看| 在线看日本不卡| 欧美黄色激情视频| 全国精品久久少妇| 亚洲一区三区电影在线观看| 电影亚洲一区| 日韩在线中文字幕| 国产免费久久久| 一区二区三区中文在线观看| 亚洲精品久久久久久| 精品动漫3d一区二区三区免费| 国产精品久久久对白| av电影在线地址| 亚洲精品国产精品自产a区红杏吧| 性无码专区无码| 久久久激情视频| 手机看片一级片| 91精品国产麻豆国产在线观看| 98国产高清一区| 国产99在线| 亚洲色图偷窥自拍| 国产精品福利电影| 亚洲一区二区三区四区在线| 疯狂揉花蒂控制高潮h| 青青草国产精品亚洲专区无| 中文字幕在线亚洲三区| www.成人网| 国产精品99久久久久久白浆小说| 欧美三级理伦电影| 精品成人一区二区| 中文字幕在线观看视频免费| 成人欧美一区二区三区视频网页 | **爰片久久毛片| 91干在线观看| 免费高清在线观看| 日韩av在线免费播放| 伊人成人在线观看| 亚洲一区二区三区在线播放| 强伦人妻一区二区三区| 国产综合久久久久久鬼色| 免费观看国产精品视频| 国产精品videosex性欧美| 精品毛片久久久久久| 欧美黄页免费| 97久久久免费福利网址| 亚洲视频tv| 日韩成人在线观看| 国产片高清在线观看| 色噜噜狠狠一区二区三区果冻| 亚洲精品卡一卡二| 久久久久亚洲蜜桃| 亚洲一区和二区| 免费日本视频一区| 3d动漫一区二区三区| 99九九热只有国产精品| 久久青青草综合| 日韩精品一区二区三区中文| 国产精品精品一区二区三区午夜版 | 中文字幕一区二区免费| 亚洲一区在线视频| 手机av在线看| 国产欧美一区二区三区沐欲| 国产女人18毛片水真多18| 国产在线播放一区二区三区| 午夜dv内射一区二区| 亚洲黄色高清| 超碰10000| 97偷自拍亚洲综合二区| 色综合电影网| 婷婷精品在线| 国产美女在线精品免费观看| 欧美影院视频| 成人性生交大片免费看视频直播| 亚洲电影有码| 国产成人97精品免费看片| 国产一二三在线| 久久久久久久久久国产| 制服丝袜在线播放| 久久久久www| 香蕉视频免费在线播放| 亚洲午夜性刺激影院| 亚洲av成人无码网天堂| 亚洲电影成人av99爱色| 日本黄色一区二区三区| 日韩美女一区二区三区| av天堂一区二区三区| 91精品国产日韩91久久久久久| 中文字幕精品一区二区精| 在线亚洲一区二区| 国产在线观看第一页| 91精品办公室少妇高潮对白| 中文字幕在线看人| 色综合网色综合| 国产suv精品一区二区33| 欧美午夜精品伦理| 国产成人一级片| 黑人精品xxx一区| 天堂а√在线中文在线新版| 日韩欧美黄色动漫| 秋霞av一区二区三区| 色天天综合色天天久久| 亚洲视屏在线观看| 欧美美女一区二区在线观看| 国产乱子伦精品无码码专区| 日韩一区二区视频在线观看| 亚洲国产视频一区二区三区| 日韩久久免费av| 婷婷丁香一区二区三区| 亚洲免费中文字幕| 日本午夜在线视频| 在线观看日韩欧美| caoporm免费视频在线| 欧美激情奇米色| 日韩伦理福利| 国产精品吹潮在线观看| 91麻豆精品一二三区在线| 97超碰人人看人人| 精品资源在线| 日韩激情视频| 天天综合网网欲色| 日韩网站在线免费观看| 久久三级福利| 中文字幕久久av| 国产 欧美在线| 中文字幕一区二区三区人妻不卡| 国产午夜精品久久久久久久 | 精品福利在线看| 无码免费一区二区三区| 欧美一区二区视频免费观看| 五月婷婷免费视频| 色噜噜狠狠狠综合曰曰曰88av| 羞羞视频在线免费国产| 人妖精品videosex性欧美| 欧美视频免费看| 国产视频精品网| 欧美肉体xxxx裸体137大胆| 91麻豆天美传媒在线| 国产精品美女| 思思久久精品视频| 91丨九色丨蝌蚪丨老版| 欧美风情第一页| 一本大道av一区二区在线播放| 91片黄在线观看喷潮| 亚洲精品美女网站| 欧美jizz18hd性欧美| 欧美亚洲第一页| 麻豆精品久久| 欧洲视频一区二区三区| 欧美日韩hd| 91国产精品视频在线观看| 豆国产96在线|亚洲| 大吊一区二区三区| 亚洲成a人v欧美综合天堂下载| 一级爱爱免费视频| 亚洲欧美国内爽妇网| 欧美人与性动交α欧美精品图片| 国产精品wwwwww| aiai久久| 久久av高潮av| 久久精品99国产精品| 久久久久久久久久久久久久久| 亚洲国产毛片aaaaa无费看| 亚洲中文一区二区三区| 亚洲欧洲午夜一线一品| sis001亚洲原创区| 亚洲精品日韩av| 成人网18免费网站| 国产熟女高潮视频| 99精品视频中文字幕| 久久久综合久久久| 91精品麻豆日日躁夜夜躁| 北岛玲日韩精品一区二区三区| 7m精品福利视频导航| av成人综合| 日本精品福利视频| 国产麻豆精品95视频| 青青操在线视频观看| 欧美色爱综合网| 韩国中文字幕2020精品| 欧美在线视频一区| 欧美尿孔扩张虐视频| 国产免费黄色一级片| 国产精品影视在线观看| 永久免费未视频| 欧美日本一区二区在线观看| 国产裸舞福利在线视频合集| 欧洲亚洲女同hd| 偷拍自拍亚洲色图| 欧美日韩国产精品激情在线播放| 99精品视频在线免费观看| 国产在线精品观看| 亚洲国产一区二区三区四区| www欧美xxxx| 国产精品三区四区| 18成人免费观看视频| 中文字幕在线播放一区| 婷婷综合在线观看| 每日更新av在线播放| 国产精品福利在线观看网址| 不卡一区2区| 久久久久久久久久一区二区| 国产精品久久久久一区二区三区| 国产精品久久久久久免费| 精品国产自在精品国产浪潮| 免费精品一区| 免费看黄在线看| 91在线观看污| 香蕉污视频在线观看| 中文字幕亚洲一区二区三区五十路| 岛国精品在线| 992tv成人免费观看| 成人精品国产福利| 国产免费一级视频| 中文字幕日韩有码| 日韩欧美久久| 欧美日韩激情视频在线观看| 久久久精品综合| 国产欧美日韩成人| 韩国精品美女www爽爽爽视频| 中国av一区| 中国黄色片一级| 亚洲v日本v欧美v久久精品| 深夜福利视频一区| 国产日韩欧美电影在线观看| 欧美日本一区二区视频在线观看| 无码一区二区精品| 精品视频一区二区不卡| 青青青草视频在线| 欧美在线播放一区二区| 国产一区二三区| 欧美日韩精品区| 精品国产一区av| 粉嫩av一区二区| 黄色在线视频网| 亚洲午夜精品网| 成人福利在线| 国产精品日韩一区二区| 日韩va亚洲va欧美va久久| 破处女黄色一级片| 亚洲人午夜精品免费| 国产一精品一av一免费爽爽| 99精品人妻少妇一区二区 | 在线不卡日本| av在线不卡观看免费观看| 超碰在线97观看| 午夜精品国产精品大乳美女| 欧美jizz|