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

PixiJS 源碼解讀:繪制矩形的渲染過程講解

開發 前端
PixiJS 繪制圖形使用了 WebGL,為了利用 GPU 的并行能力,需要給著色器一次性提供盡可能多的頂點和顏色信息。PixiJS 提供了一些基礎圖形,比如矩形。繪制時會根據圖形屬性信息進行三角化,最后將所有的信息組合起來,一次性提供給 WebGL。

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

之前寫了一篇 PixiJS 繪制矩形,簡單說了一下 PixiJS 是怎么繪制矩形的。

《PixiJS 源碼解讀:繪制矩形,底層都做了什么?》

它更多的講解上層的東西,沒花太多筆墨描繪底層渲染的流程。所以我寫了這篇文章,對渲染流程進行補充講解。

PixiJS 版本為 7.2.4。

要求讀者熟悉 WebGL 的基礎知識。

本文會 以繪制設置了填充和描邊的矩形為例子,看底層 WebGL 的調用執行。

業務層代碼:

const app = new PIXI.Application({
  width: 500,
  height: 300,
  background: "#cc0", //(土黃色)
});
document.body.appendChild(app.view);

const graph = new PIXI.Graphics();
graph.beginFill(0xff0044); // 紅色填充色
graph.lineStyle({ color: "blue", width: 4 }); // 藍色描邊
graph.drawRect(90, 70, 300, 100);

app.stage.addChild(graph);

繪制結果為:

創建 gl

第一步是創建 gl 對象,上下文類型優先使用 "webgl2"。

如果不支持,會降級為 "webgl"、"experimental-webgl"。

gl = canvas.getContext("webgl2", options);

gl 在 renderer 渲染器初始化的時候構建的,可通過 app.renderer.gl 拿到。

構建著色器代碼片段

定義 頂點著色器 和 片元著色器。

著色器(Shader)是一種類 C 語言 GLSL,用于描述需要繪制的 頂點信息和顏色信息。

著色器模板

首先是 字符串模板,等著根據配置填充成一個完整的著色器代碼片段。

頂點著色器的模板(后面會基于它生成真正可用的著色器)位于 packages/core/src/batch/texture.vert 中。

batch 文件夾都是和 批量繪制 有關的邏輯,批量、減少 draw call 正是 PixiJS 高效繪制的秘訣。

precision highp float;
attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
attribute vec4 aColor;
attribute float aTextureId;

uniform mat3 projectionMatrix;
uniform mat3 translationMatrix;
uniform vec4 tint;

varying vec2 vTextureCoord;
varying vec4 vColor;
varying float vTextureId;

void main(void){
    gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);

    vTextureCoord = aTextureCoord;
    vTextureId = aTextureId;
    vColor = aColor * tint;
}

片元著色器和顏色有關。

varying vec2 vTextureCoord;
varying vec4 vColor;
varying float vTextureId;
uniform sampler2D uSamplers[%count%];

void main(void){
    vec4 color;
    %forloop%
    gl_FragColor = color * vColor;
}

這里的 %count% 和%forloop% 是占位符,會在之后進行替換。

最終著色器代碼片段

在 renderer 初始化時,上面的模板會進行一系列的改造,兩個著色器最終轉換為下面的樣子。

頂點著色器(Vertex Shader)和頂點的位置、大小有關。

補充一些簡單注釋說明。

頂點著色器

precision highp float; // 浮點數使用高精度
#define SHADER_NAME pixi-shader-2
precision highp float;
attribute vec2 aVertexPosition; // 頂點位置 x 和 y
attribute vec2 aTextureCoord; // 紋理坐標,會傳給片元著色器
attribute vec4 aColor; // 顏色,rgba,會傳給片元著色器
attribute float aTextureId; // 紋理單元 ID,會傳給片元著色器

uniform mat3 projectionMatrix; // 投影矩陣
uniform mat3 translationMatrix; // 平移變換矩陣
uniform vec4 tint; // 改變顏色,實現濾鏡效果,會和 aColor 相乘傳給片元著色器

varying vec2 vTextureCoord; // varing 都是用來傳遞的
varying vec4 vColor;
varying float vTextureId;

void main(void){
    //  進行一系列矩陣乘法運算,將最后的點傳給內置的著色器變量,設置點的位置
    gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);

   // 下面都是要傳給片元著色器的變量
    vTextureCoord = aTextureCoord;
    vTextureId = aTextureId;
    vColor = aColor * tint;
}

片元著色器

片元著色器(Fragment Shader)用于描述頂點圍成區域的像素顏色。

下面是片元著色器的最終代碼,同樣我會加一些注釋說明

precision mediump float;
#define SHADER_NAME pixi-shader-2
varying vec2 vTextureCoord; // 紋理坐標,
varying vec4 vColor; // 顏色
varying float vTextureId; // 使用哪一個紋理采樣器
uniform sampler2D uSamplers[16]; // 16 個紋理采樣器

void main(void){
  vec4 color;
 
  if(vTextureId < 0.5) {
    // 從紋理采樣器(比如圖片轉換過來的像素點集合)中,提取特定位置的像素點
    color = texture2D(uSamplers[0], vTextureCoord);
  }else if(vTextureId < 1.5) {
    color = texture2D(uSamplers[1], vTextureCoord);
  }
  // ...
  } else {
    color = texture2D(uSamplers[15], vTextureCoord);
  }
  
  // 疊加顏色值,和紋理采樣器取得的顏色值,賦值給片元著色器內置變量
  gl_FragColor = color * vColor;
}

如果沒有設置紋理,PixiJS 會給一個默認的兜底用紋理對象,一個 16x16 的白色方形。

這兩個著色器片段會保存到 Shader 實例中,放到 app.render.shader 下。

編譯著色器程序

第一次調用 renderer 渲染器 render 方法時,PixiJS 會 創建頂點著色器對象和片元著色器對象。

這些邏輯是在 generateProgram 方法中實現的。該方法的核心代碼:

function generateProgram(gl, program) {
  //(1)創建頂點著色器對象、片元著色器對象等
  const glVertShader = compileShader(gl, gl.VERTEX_SHADER, program.vertexSrc);
  const glFragShader = compileShader(
    gl,
    gl.FRAGMENT_SHADER,
    program.fragmentSrc
  );

  // 創建程序對象
  const webGLProgram = gl.createProgram();

  //(2)綁定 attribute
  // keys 為 ['aColor', 'aTextureCoord', 'aTextureId', 'aVertexPosition']
  for (let i = 0; i < keys.length; i++) {
    program.attributeData[keys[i]].location = i;
    // 將屬性綁定到頂點著色器的制定位置
    // 如:gl.bindAttribLocation(gl.program, 0, "aColor");
    gl.bindAttribLocation(webGLProgram, i, keys[i]);
  }

  // 刪除著色器對象,釋放內存
  gl.deleteShader(glVertShader);
  gl.deleteShader(glFragShader);

  //(3)綁定 uniformLocation(準確來說是拿地址,還沒正式綁定)
  // 屬性(對應 i 變量)有:projectionMatrix、tint、translationMatrix、uSamplers
  for (const i in program.uniformData) {
    const data = program.uniformData[i];

    uniformData[i] = {
      location: gl.getUniformLocation(webGLProgram, i),
      value: defaultValue(data.type, data.size),
    };
  }

  const glProgram = new GLProgram(webGLProgram, uniformData);
  return glProgram;
}

分成三個主要步驟。

創建著色器對象、程序對象。

compileShader 實現:

function compileShader(gl, type, src) {
  const shader = gl.createShader(type);

  gl.shaderSource(shader, src);
  gl.compileShader(shader);
  
  gl.attachShader(webGLProgram, glVertShader);
  gl.attachShader(webGLProgram, glFragShader);
  // ...
  gl.linkProgram(webGLProgram);

  return shader;
}

綁定 attribute 類型的變量 (但此時還沒傳入 Buffer 數據,只是設置了如何訪問等操作);

綁定 uniform 類型的變量。

之后在 app.renderer.shader.bind 方法內執行下面代碼,應用剛剛創建的程序對象。

this.gl.useProgram(glProgram.program);

渲染階段

前面做的是準備工作,編譯著色器。

接下來就是渲染階段。

PIXI.Ticker 定時器會在渲染下一幀前調用 renderer.render 方法,進入 WebGL 的渲染流程。

清空畫布填充背景色

首先是清空畫布。

// 入口方法:renderer.renderTexture.clear
class ObjectRendererSystem {
  render(displayObject, options) {
    // ...

    // (1) 清空畫布,并指定顏色
    renderer.renderTexture.clear();

    // ...
  }
}

它會執行 clear 方法

class FramebufferSystem {
  clear(r, g, b, a, mask = BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH) {
    const { gl } = this;
    // 背景色 #cc0 轉換為 rbga 格式:
    // (0.800000011920929, 0.800000011920929, 0, 1)
    gl.clearColor(r, g, b, a);
    // 清空顏色和深度緩存
    gl.clear(mask);
  }
}

遞歸調用 render

遞歸圖形樹(app.stage),調用它們(繼承了 IRenderableObject 接口類型)的 render 方法,它們會拿到 renderer 對象,然后執行自己的渲染邏輯。

// app.stage 是 Container 實例
class Container extends DisplayObject {

  render(renderer) {
    // ...
    this._render(renderer); // 真正的渲染邏輯
    for (let i = 0, j = this.children.length; i < j; ++i) {
      this.children[i].render(renderer);
    }
  }
}

對于前文的示例代碼,會分析矩形屬性,構建頂點和片元數據,然后執行 WebGL 的繪制 API。

對矩形三角化,構建頂點和片元數據

先基于 x、y、width、height 計算出矩形的 4 個頂點放到 points。

然后進行三角化。三角化就是將圖形轉換為對應的三角形的組合。

所謂圖形的渲染,其實就是繪制一個個小的三角形,組成特定的形狀。這些三角形的點,根據不同圖形(比如矩形和圓形),需要用不同算法去計算出來,然后把數據通過 WebGL 命令交給 GPU,讓它幫我們繪制出來。

首先是填充的三角化(對應  buildRectangle.triangulate() )。

基于前面的 4 個點得到填充塊的 4 個點,并設置對應的索引值 indices,之后調用 gl.drawElements() 需要用到。

接著是描邊的三角化(對應 buildLine())。

下面是繪制描邊的代碼片段:

PixiJS 的計算邏輯很復雜,這是因為涉及到連接方式、末端樣式的情況。

同樣,也要計算它的頂點、索引、紋理坐標。

西瓜哥我將最終的填充和描邊產生的點,做了一下可視化。

用的是 desmos 可視化工具,這里給一下這個可視化鏈接:

https://www.desmos.com/calculator/r3dwqeweu2?lang=zh-CN。

最后計算好的三角化數據會保存到 graph 對象的 batches 數組下(batches 表示要批量處理的意思)。

batch 對象包括頂點坐標(vertexData)、顏色(_batchRGB)、索引(indices)和紋理坐標(uvs)。

下面是填充色對應的數據:

批量渲染

這里產生了兩個 batch 對象(對應填充和描邊),然后遍歷傳給 BatchRender 類的 render 方法。說是 render 方法,其實并不立即 render,而是將 batch 對象的數據解讀和保存起來,之后 flush 時才正式將數據加到 WebGL 里。

這些屬性會組合拼裝在一個類型數組里。6 個一組,逐頂點繪制。

傳完后,會調用 BatchRender 類的 flush 方法,將頂點數據和索引數組通過 gl.bufferData() 進行綁定。

綁定 uniform 值

在 ShaderSystem 類的 syncUniforms 中,會依次設置好各個 uniform 變量:tint、translationMatrix、uSamplers、projectionMatrix。

class ShaderSystem {
  
  syncUniforms(group, glProgram, syncData) {
    // 生成同步 uniform 的函數(不同 uniform 的函數不同)
    const syncFunc = 
        group.syncUniforms[this.shader.program.id] || 
        this.createSyncGroups(group);
    // 同步!
    syncFunc(glProgram.uniformData, group.uniforms, this.renderer, syncData);
  }

  createSyncGroups(group) {
    const id = this.getSignature(group, this.shader.program.uniformData, "u");
    if (!this.cache[id]) {
      this.cache[id] = generateUniformsSync(group, this.shader.program.uniformData);
    }
    group.syncUniforms[this.shader.program.id] = this.cache[id];
    return group.syncUniforms[this.shader.program.id];
  }
  
}

下面是設置 tint 的方法:

綁定紋理

綁定紋理。

class TextureSystem {
  bind(texture, location = 0) {
    const { gl } = this;
    // 開啟
    gl.activeTexture(gl.TEXTURE0 + location);
    // ...
    gl.bindTexture(texture.target, glTexture.texture);
    // ...
  }
}

因為示例并不繪制圖片,PixiJS 會提供默認的的白色紋理對象(所有值都是 1),這樣顏色值和其相乘,結果還是原來的顏色值。

渲染

最后調用 drawBatches 進行繪制。

drawBatches() {
  const dcCount = this._dcIndex;
  const { gl, state: stateSystem } = this.renderer;
  const drawCalls = _BatchRenderer._drawCallPool;
  let curTexArray = null;
  for (let i = 0; i < dcCount; i++) {
    const { texArray, type, size, start, blend } = drawCalls[i];
    if (curTexArray !== texArray) {
      curTexArray = texArray;
      // 剛剛提到的紋理綁定邏輯
      this.bindAndClearTexArray(texArray);
    }
    this.state.blendMode = blend;
    stateSystem.set(this.state);
    // 繪制 API
    gl.drawElements(type, size, gl.UNSIGNED_SHORT, start * 2);
  }
}

最后我們就繪制出一個有填充和描邊的矩形了。

之后 Ticker 會不斷地在繪制下一幀時調用 renderer 的 render 方法進行渲染,如果圖形沒改變(比如通過 dirtyId 和 cacheDirty 是否相同判斷),我們會跳過三角化的環節,使用緩存好的數據去繪制渲染。

結尾

PixiJS 繪制圖形使用了 WebGL,為了利用 GPU 的并行能力,需要給著色器一次性提供盡可能多的頂點和顏色信息。

PixiJS 提供了一些基礎圖形,比如矩形。繪制時會根據圖形屬性信息進行三角化,最后將所有的信息組合起來,一次性提供給 WebGL。

這篇文章其實斷斷續續寫了好久,PixiJS 里的彎彎道道挺多的,經常調試了半天就是找不著北了,一度擱置。最后還是硬著頭皮不斷地調試和思考,總算把這篇文章結束掉了。

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

2023-06-07 08:13:46

PixiJSCanvas 庫

2023-06-08 08:16:33

TickerPixiJS

2023-10-13 07:29:23

PixiJSRunner

2023-03-02 07:44:39

pixijsWebGL

2023-02-22 09:27:31

CanvasWebGL

2022-12-12 09:01:13

2025-06-23 00:03:00

2010-08-23 10:17:20

配置DHCP

2011-01-20 10:03:42

PostfixAdmi

2013-09-26 14:09:31

iOS開發OpenGL ES教程繪制矩形

2024-09-06 09:37:45

WebApp類加載器Web 應用

2023-02-23 08:40:09

Pixijs修改圖形屬性

2012-05-31 09:19:22

HTML5

2025-01-24 08:34:29

pixijs圖形設置光標cursor

2022-12-18 22:11:46

2009-09-24 17:11:53

Hibernate處理

2024-10-23 09:05:07

PixijsMatrixTransform

2010-06-09 09:53:44

UML活動圖

2021-07-25 21:13:50

框架Angular開發

2015-06-15 10:32:44

Java核心源碼解讀
點贊
收藏

51CTO技術棧公眾號

欧美国产日韩一区二区| 美女尤物久久精品| 日韩欧美色综合网站| 日韩av电影免费播放| 曰批又黄又爽免费视频| 日韩高清三区| 欧美日韩国产大片| 欧美做暖暖视频| 国产精品欧美激情在线| 激情久久久久久| 精品少妇一区二区三区在线视频| 国产一级片91| 丁香在线视频| 国产99久久久精品| 茄子视频成人在线| 中文字幕精品亚洲| 美女一区2区| 欧美日韩中字一区| 国产资源在线视频| 国产免费av高清在线| 韩日av一区二区| 18久久久久久| 久久久久久久麻豆| 99精品美女视频在线观看热舞| 亚洲欧洲99久久| 免费看国产精品一二区视频| www欧美在线| 在线国产一区二区| 一区二区三区四区在线观看视频| 日韩黄色一区二区| gogo大尺度成人免费视频| 欧美性猛交xxxx久久久| 奇米888一区二区三区| 波多野结衣日韩| 婷婷丁香综合| 国产视频久久久久| 69久久精品无码一区二区| 国产精品传媒麻豆hd| 欧美性jizz18性欧美| 日韩亚洲欧美视频| 在线看女人毛片| 国产精品久久久久一区| 日本婷婷久久久久久久久一区二区 | av自拍一区| 91麻豆精品国产91久久久资源速度 | 91在线免费观看网站| 日韩精品一区二区亚洲av| 红桃视频国产精品| 欧美大片欧美激情性色a∨久久| 看黄色录像一级片| 精品精品99| 欧美一级片在线| 看av免费毛片手机播放| 欧美裸体视频| 婷婷综合另类小说色区| 日韩中字在线观看| 日本aa在线| **性色生活片久久毛片| 日韩精品一区二区三区丰满| 五月天丁香视频| 99精品欧美一区| 成人久久精品视频| 国产乱码久久久久| 国产伦精一区二区三区| 成人黄色免费片| 国产精品毛片一区视频播| 加勒比av一区二区| 亚洲尤物视频网| www.黄色片| 粉嫩一区二区三区在线看| 国产欧美一区二区三区久久| 亚洲天堂手机在线| 蜜臀av在线播放一区二区三区| 日本久久久久亚洲中字幕| 久久综合久久鬼| 一区二区毛片| 久久久久久久色| 欧美特黄aaaaaa| 久久久久国产精品一区三寸| 91成人天堂久久成人| 国产成人无码专区| 久久91精品国产91久久小草| 91精品国产综合久久香蕉的用户体验 | 国产日韩精品入口| 国产av一区二区三区| 国产在线一区观看| 国产91一区二区三区| 日本毛片在线观看| 91丝袜高跟美女视频| 色狠狠久久av五月综合|| 久热国产在线| 亚洲成av人片观看| 999精品视频在线| 国产精品一区二区三区www| 精品久久国产老人久久综合| 毛片网站免费观看| 欧美伦理影院| 欧美精品18videos性欧| 国产一区二区三区影院| 日韩中文字幕一区二区三区| 成人午夜在线影院| 视频一区二区在线播放| 国产精品福利一区二区三区| 黄色a级在线观看| 精精国产xxxx视频在线野外 | caopor在线视频| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 综合久久一区| 茄子视频成人在线| 精品黑人一区二区三区国语馆| 久久女同精品一区二区| 97在线免费视频观看| 欧美日韩五码| 精品国产青草久久久久福利| av资源在线免费观看| 亚洲毛片网站| 成人信息集中地欧美| 你懂的视频在线观看| 亚洲欧美日韩在线| 手机在线看福利| 久久97久久97精品免视看秋霞| 伊人久久大香线蕉av一区二区| 午夜69成人做爰视频| 丝袜亚洲另类欧美| 国内精品久久国产| 午夜视频在线观看网站| 日韩欧美成人免费视频| 丰满少妇一区二区三区专区 | 国产在线不卡视频| 久久综合九九| 丝袜国产在线| 欧美精品色综合| 精品少妇人妻一区二区黑料社区| 亚洲一级二级| 成人春色激情网| 亚洲av成人精品一区二区三区在线播放| 18涩涩午夜精品.www| 亚洲精品无码久久久久久| 国产精品久久久久久久久久白浆| 日韩高清不卡av| 亚洲黄色一区二区| 国产高清精品久久久久| 中文字幕在线中文字幕日亚韩一区| 日韩影片中文字幕| 国产丝袜一区二区三区| 国产乱码久久久久久| 日本不卡在线视频| 欧美不卡福利| 欧美大片1688| 国产亚洲精品久久久| 国产真实夫妇交换视频| 懂色av一区二区三区免费看| 公共露出暴露狂另类av| 欧美国产视频| 久久天天躁狠狠躁夜夜av| 国产一区二区网站| 亚洲视频网在线直播| 亚洲av毛片在线观看| 色97色成人| 国产中文欧美精品| 成人动漫在线免费观看| 在线日韩一区二区| 国产精品综合激情| 精品一区二区三区在线播放| 中文精品视频一区二区在线观看| 四虎在线精品| 欧美成人精品一区二区三区| 手机在线看片1024| 久久午夜电影网| 久久久天堂国产精品| 99热这里只有精品首页 | 国产午夜精品在线| 成人香蕉视频| 搡老女人一区二区三区视频tv| 国产又粗又猛又爽又黄的| 亚洲天天做日日做天天谢日日欢| 91香蕉视频免费看| 在线亚洲观看| 亚洲国产一区二区在线| 高清久久精品| 欧美激情视频网| 欧美色18zzzzxxxxx| 欧美又粗又大又爽| 国产日韩欧美在线观看视频| 成人综合婷婷国产精品久久| 六月激情综合网| 国产精品99久久| 成人在线免费网站| 芒果视频成人app| 久久天天躁狠狠躁夜夜躁 | 久久成人免费网站| 日本黄色播放器| 欧美视频三区| 日本一区二区三区四区视频| 黄色网页在线免费看| 亚洲黄色av女优在线观看| 中文精品久久久久人妻不卡| 亚洲欧美日韩系列| 免费在线观看你懂的| 久久机这里只有精品| 欧美与动交zoz0z| 少妇久久久久| 亚洲一区中文字幕| 日本不卡网站| 免费不卡在线观看av| 男操女在线观看| 欧美日韩大陆一区二区| 国产成人亚洲精品自产在线| 亚洲欧美综合另类在线卡通| 国产ts丝袜人妖系列视频| 国产伦精品一区二区三区视频青涩 | 黄色免费视频网站| 国内精品免费在线观看| 国产精品-区区久久久狼| 欧美成人69av| 视频一区二区在线| 亚洲黄页在线观看| 国产精品免费视频一区二区| 高清欧美日韩| 久久露脸国产精品| 黄色在线免费| 伊人久久五月天| 国产高潮在线观看| 欧美猛男超大videosgay| 亚洲综合久久网| 精品久久久一区二区| 久久久精品一区二区涩爱| √…a在线天堂一区| 日韩一级片在线免费观看| 秋霞av亚洲一区二区三| 亚洲 欧美 日韩 国产综合 在线 | 97国产精东麻豆人妻电影| 最新精品国产| 久久天天东北熟女毛茸茸| 久久成人高清| 国产一区免费| 日韩三级精品| 亚洲精品日韩激情在线电影| 日本综合久久| 国产成人avxxxxx在线看 | 色综合天天狠狠| 日韩三级视频在线| 亚洲成人av在线电影| 欧美色图亚洲视频| 一区二区视频免费在线观看| 成年人二级毛片| 亚洲欧美在线视频| 天堂网avav| 国产精品久久久一本精品| 无码国产69精品久久久久同性| 91欧美激情一区二区三区成人| 精品国产一区在线| 国产成人a级片| 久久久久久国产精品日本| 国产精品一区二区三区网站| 国产成人强伦免费视频网站| 国产成人精品免费在线| 久久久高清视频| av电影天堂一区二区在线| 欧亚乱熟女一区二区在线| 91免费看片在线观看| 右手影院亚洲欧美| 国产亚洲精品免费| 91大神福利视频| 亚洲欧美日韩系列| 日韩精品久久久久久久酒店| 欧美性生活大片免费观看网址| 最新在线中文字幕| 91精品综合久久久久久| 亚洲卡一卡二卡三| 亚洲激情 国产| 青青草免费在线视频| 中日韩美女免费视频网站在线观看 | 美女的奶胸大爽爽大片| 亚洲狠狠爱一区二区三区| 毛片基地在线观看| 欧美无人高清视频在线观看| 国产精品乱码一区二区| 亚洲精品一区二区三区99| 免费a级毛片在线观看| 亚洲欧美日韩区| 男人资源在线播放| 久久露脸国产精品| 78精品国产综合久久香蕉| 91嫩草免费看| 一区二区三区韩国免费中文网站| 精品国产电影| 99久久综合| 欧美精品久久96人妻无码| 日韩欧美一区二区三区免费看| 日韩电影免费观看在| 亚洲理论电影网| 日本福利视频一区| 麻豆成人在线观看| www.17c.com喷水少妇| 国产午夜三级一区二区三| av成人免费网站| 亚洲一区二区三区在线播放| 337p粉嫩色噜噜噜大肥臀| 日韩欧美美女一区二区三区| 麻豆导航在线观看| 伦理中文字幕亚洲| 国产精品久久久久av电视剧| 成人激情直播| 国产一区二区三区网| 亚洲小视频在线播放| 免费观看在线综合| 欧美bbbbb性bbbbb视频| 亚洲精品欧美在线| 小泽玛利亚一区二区三区视频| 亚洲成在人线av| 国产日产一区二区| 欧美亚洲在线观看| 电影亚洲一区| 国产精品区二区三区日本| 99久久精品费精品国产风间由美 | 成人在线手机视频| 亚洲一本大道在线| 黄色av一级片| 亚洲精品国偷自产在线99热| 最新国产露脸在线观看| 日韩美女视频免费看| 久久国产精品色av免费看| 永久免费网站视频在线观看| 老妇喷水一区二区三区| 国产中文字幕一区二区| ㊣最新国产の精品bt伙计久久| 国产99久久久久久免费看| 日韩电影免费在线观看中文字幕| 91社区在线高清| 国产91久久婷婷一区二区| 美女午夜精品| www.日本在线播放| 岛国av在线一区| 久一视频在线观看| 欧美人xxxx| 午夜视频在线| 91精品美女在线| 日韩精品二区| 久久精品网站视频| 久久嫩草精品久久久精品| 日韩大片免费在线观看| 亚洲国产成人精品电影| 色yeye免费人成网站在线观看| 91视频免费网站| 中文字幕日韩欧美精品高清在线| 91免费视频污| 一区二区三区中文在线观看| 99热这里只有精品99| 亚洲欧美精品在线| 性欧美freehd18| 亚洲国产欧美日韩| 久久99精品久久久久久动态图| 国产在线观看无码免费视频| 色综合久久综合中文综合网| 男操女在线观看| 日本在线精品视频| 久久91麻豆精品一区| 男女av免费观看| 欧美国产一区二区在线观看| 亚洲字幕av一区二区三区四区| 色妞久久福利网| 国产精品亚洲一区二区在线观看| 超碰10000| eeuss影院一区二区三区| 久久久久99精品成人片三人毛片| 亚洲人午夜精品免费| 91九色综合| 青青草综合在线| 337p粉嫩大胆噜噜噜噜噜91av| 国产黄网在线观看| 日韩亚洲第一页| 99久热这里只有精品视频免费观看| 大陆极品少妇内射aaaaa| 久久久不卡网国产精品二区| 亚洲一区二区三区高清视频| 欧美夫妻性生活xx| 日本在线中文字幕一区| 无码日韩人妻精品久久蜜桃| 国产视频一区二区在线| 亚洲天堂中文在线| www.久久色.com| 欧美日韩国产一区二区在线观看| 国产a级一级片| 亚洲欧洲一区二区在线播放| www.日韩高清| 欧美专区在线观看| 菠萝蜜一区二区| 91超薄肉色丝袜交足高跟凉鞋| 日韩欧美在线国产| 成人黄视频在线观看| 九色91视频| 美女mm1313爽爽久久久蜜臀| 日韩黄色免费观看| 亚洲欧美www| 精品视频在线播放一区二区三区 | 国产成人看片| 日韩av二区在线播放| 精品爆乳一区二区三区无码av| 日韩美女在线视频|