精品欧美一区二区三区在线观看 _久久久久国色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网| 日本在线视频1区| 九九九久久久精品| 69视频在线免费观看| 青青青视频在线免费观看| 91久久精品无嫩草影院| 欧美四级电影网| 人妻久久久一区二区三区| 色影视在线观看| 91在线观看视频| 51精品国产人成在线观看| 免费观看日批视频| 激情综合网址| 欧美超级乱淫片喷水| 久久久久久九九九九九| 成人精品动漫一区二区三区| 欧美日韩中字一区| 欧美日韩二三区| 影音先锋中文在线视频| 国产精品无遮挡| 欧美日韩三区四区| 日本免费不卡视频| 国产91丝袜在线播放0| 国产精品亚洲精品| 免费观看日批视频| 西西人体一区二区| 91精品国产91久久久久久吃药| 精品国产视频在线观看| 日韩一区电影| 亚洲夜晚福利在线观看| 北岛玲一区二区| 国产精品极品| 精品剧情在线观看| 特级黄色片视频| 北岛玲精品视频在线观看| 欧美婷婷六月丁香综合色| 欧美少妇性生活视频| 午夜欧美激情| 五月激情综合婷婷| 日韩亚洲欧美视频| 欧美xxxx少妇| 亚洲主播在线播放| 国产美女作爱全过程免费视频| 二区三区四区高清视频在线观看| 国产精品伦理在线| 亚洲综合网中心| 久热国产在线| 伊人婷婷欧美激情| 男人添女人荫蒂免费视频| 麻豆福利在线观看| 亚洲综合清纯丝袜自拍| 99久久久精品视频| heyzo一区| 欧美日韩国产在线看| 少妇高潮喷水久久久久久久久久| 在线天堂资源www在线污| 欧美性猛交xxxx偷拍洗澡 | 欧美一区视频| 欧美激情二区三区| 亚洲视频免费播放| 另类亚洲自拍| 国产精品久久激情| 91亚洲精品国偷拍自产在线观看| 国产一区二区三区四区五区美女| 91成人免费看| 先锋av资源站| 欧美国产禁国产网站cc| 在线观看一区二区三区三州| 性直播体位视频在线观看| 亚洲国产精品久久不卡毛片 | 美女网站色91| 亚洲淫片在线视频| 日本精品999| 国产欧美一区二区三区鸳鸯浴| 伊人色综合久久天天五月婷| 久久青青色综合| 欧美性猛交xxxx乱大交极品| 国产精品一区二区小说| 国产亚洲观看| 精品在线小视频| 三级黄色在线观看| 91久久黄色| 国产精品私拍pans大尺度在线 | 99re99热| 1区2区在线| 欧美色视频在线观看| 韩国黄色一级片| 国产一区二区三区不卡视频网站 | √天堂8资源中文在线| 欧美无砖砖区免费| 亚洲香蕉中文网| 欧洲杯足球赛直播| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲欧美一二三区| 国产xxx精品视频大全| 奇米视频888战线精品播放| a在线免费观看| 91福利国产成人精品照片| 欧美性猛交xxxx乱大交91| 亚洲人亚洲人色久| 欧美激情一区二区三区久久久| 久久久久久久久久一级| av一区二区三区在线| 曰韩不卡视频| 黄瓜视频成人app免费| 欧美不卡在线视频| 在线观看天堂av| 国产日本精品| 不卡一区二区三区视频| 色的视频在线免费看| 黑人巨大精品欧美一区免费视频| 欧美性受xxxx黒人xyx性爽| 国产成人精品一区二区免费看京 | 福利精品在线| 日韩极品精品视频免费观看| 久久久久久久久久91| 老司机一区二区| 日本不卡一区| 色在线免费观看| 精品国一区二区三区| 国产成人自拍网站| 久久国产夜色精品鲁鲁99| 女人一区二区三区| 亚洲电影观看| 亚洲高清福利视频| 黄色小说在线观看视频| 国产成+人+日韩+欧美+亚洲| 欧美做受777cos| 亚洲精品乱码日韩| 中文字幕无线精品亚洲乱码一区| 国产熟妇一区二区三区四区| 久久影院午夜论| 91猫先生在线| 色天下一区二区三区| 欧美极品在线视频| 日韩中文字幕综合| 午夜成人在线视频| 成年人的黄色片| 日韩一级精品| 久久久久久国产精品mv| 水蜜桃在线视频| 亚洲男人的天堂网站| 懂色av蜜臀av粉嫩av分享吧最新章节| 久久毛片高清国产| 草草草在线视频| 美女久久99| 国产精品久久久久久网站| av免费在线一区二区三区| 在线观看一区二区精品视频| 调教驯服丰满美艳麻麻在线视频| 日本中文在线一区| 在线观看成人av| 欧美不卡在线观看| 欧美激情videos| 婷婷色在线观看| 欧美视频一区二区三区…| 一级片手机在线观看| 日本不卡中文字幕| 在线免费观看成人网| 秋霞一区二区| 2021久久精品国产99国产精品| 你懂的在线观看视频网站| 色婷婷综合久色| 国产福利在线导航| 国产精品一区一区三区| 国产午夜福利100集发布| 美女久久久久| 91九色在线视频| ririsao久久精品一区| 亚洲毛片在线免费观看| 伊人精品一区二区三区| 亚洲精品成a人| 波多野结衣先锋影音| 日产国产欧美视频一区精品| 99热这里只有精品7| 欧美调教网站| 91精品国产综合久久香蕉最新版 | 中文字幕成人动漫| 国内精品国产成人| 国产69精品久久久久久久| 欧美丝袜一区| 福利精品视频| 看片一区二区| 98精品在线视频| 米奇777四色精品人人爽| 精品国产精品一区二区夜夜嗨| 亚洲 欧美 中文字幕| 亚洲精品成人精品456| 91视频在线网站| 国产suv精品一区二区883| 日韩精品免费播放| 亚洲午夜黄色| 亚洲砖区区免费| 亚洲资源网站| 成人免费91在线看| 老司机精品视频网| 国产97在线|亚洲| 国产91足控脚交在线观看| 在线成人激情视频| 午夜av免费观看| 欧美一级理论片| 中文在线观看免费高清| 亚洲成人动漫av| www色aa色aawww| 国产清纯白嫩初高生在线观看91| www男人天堂| 久久精品国产99久久6| 久久久久久久久久久久久国产精品| 欧美一区高清| 正在播放一区二区三区| 精品视频97| 久久精品国产第一区二区三区最新章节 | 99高清视频有精品视频| 男女啪啪999亚洲精品| 热久久视久久精品18亚洲精品| 中文字幕有码在线视频| 色噜噜久久综合伊人一本| 免费在线一级视频| 亚洲精品国产精品久久清纯直播| xxxx18国产| 欧美一区二区在线免费观看| 一区二区三区日| 欧美在线看片a免费观看| 日韩精品在线免费视频| 亚洲www啪成人一区二区麻豆| 国产午夜精品理论片| 国产精品你懂的| 三区四区在线观看| 欧美极品aⅴ影院| 免费成人深夜天涯网站| 国产丝袜欧美中文另类| 久久久久久久毛片| 欧美激情综合五月色丁香小说| 美女100%无挡| 国产欧美日韩精品一区| 国产精品成人无码免费| 国产日韩欧美不卡| 鲁丝一区二区三区| 国产日本欧洲亚洲| 国产在线综合视频| 日本一区二区成人在线| 欧美精品日韩在线| 国产精品成人一区二区艾草| fc2ppv在线播放| 亚洲日本青草视频在线怡红院| 看免费黄色录像| 亚洲激情在线激情| 久久精品女人毛片国产| 婷婷中文字幕综合| 日韩不卡视频在线| 在线欧美日韩国产| 91久久国语露脸精品国产高跟| 在线播放欧美女士性生活| 精品国产亚洲AV| 亚洲成av人影院在线观看| 午夜成人免费影院| 国产一区二区三区中文| 在线观看黄av| 欧美成人免费全部| 日本不良网站在线观看| 国产成人一区二| 高清不卡一区| 国产视频在线观看一区| 视频国产一区| 婷婷视频在线播放| 国产视频一区三区| 国产精品视频黄色| 国产一区不卡精品| 中文字幕乱码在线| 中文成人综合网| 欧美精品乱码视频一二专区| 欧美丝袜第一区| 国产又粗又猛视频| 亚洲成色777777女色窝| 成人影视在线播放| 欧美日本啪啪无遮挡网站| 筱崎爱全乳无删减在线观看| 91精品国产综合久久久久久蜜臀 | 97超碰青青草| 久久国产生活片100| 免费看黄色片的网站| 中文av一区二区| 日韩aaaaaa| 5858s免费视频成人| 污污网站免费在线观看| 精品国产欧美成人夜夜嗨| 3344国产永久在线观看视频| 国产精品老牛影院在线观看| 一区二区三区视频播放| 日韩欧美三级一区二区| 樱桃成人精品视频在线播放| 国产又大又黄又粗又爽| 99久久综合99久久综合网站| 色婷婷粉嫩av| 色哟哟亚洲精品| 亚洲国产精品欧美久久 | 免费在线国产视频| 国产精品久久中文| 欧美重口另类| 男人天堂手机在线视频| 久草在线在线精品观看| 成人免费网站黄| 亚洲成人免费影院| 国产免费不卡av| 夜夜嗨av一区二区三区四区| av日韩国产| 99久久综合狠狠综合久久止| 91免费精品| 四季av一区二区| 99re热这里只有精品免费视频| 黄色片在线观看网站| 欧美色综合天天久久综合精品| 清纯唯美亚洲色图| 国内伊人久久久久久网站视频| 精品国产三级| 在线播放 亚洲| 免费成人在线影院| 亚洲综合欧美综合| 欧美性猛交xxxxx免费看| 日韩中文字幕观看| 久久久亚洲网站| 成人黄色av网址| 18黄暴禁片在线观看| 国产电影精品久久禁18| 日韩在线一卡二卡| 欧美日韩你懂得| 日韩伦理在线观看| 国产精品嫩草影院久久久| 精品国产乱码久久久久久果冻传媒 | 日韩免费av一区| 欧美视频三区在线播放| 国产视频网址在线| 国产成人亚洲精品| 日韩免费在线| 岛国av在线免费| 中文字幕一区二区三区不卡在线| 这里只有精品国产| 精品国产美女在线| 亚洲香蕉久久| 欧美日韩一级在线 | 国产特黄级aaaaa片免| 欧美色欧美亚洲高清在线视频| 亚洲AV第二区国产精品| 97久久精品人搡人人玩 | 欧美日韩一级在线| 国产精品正在播放| 日本三级午夜理伦三级三| 亚洲成色777777在线观看影院| h片在线观看下载| 精品一区久久| 老司机久久99久久精品播放免费| 女人又爽又黄免费女仆| 欧美三级中文字| 麻豆传媒在线完整视频| 99re6热在线精品视频播放速度| 黑人一区二区三区四区五区| 亚洲欧美日韩偷拍| 欧美性猛交xxxx免费看| 又爽又大又黄a级毛片在线视频| 国产成人激情视频| 亚洲激情久久| 日本少妇xxxx| 在线观看免费一区| 国产超级va在线视频| 精品午夜一区二区三区| 肉丝袜脚交视频一区二区| 日韩一卡二卡在线观看| 精品久久久久久久久久久院品网| 五月天av在线| 一区二区三区偷拍| 成人av网址在线| 这里只有精品免费视频| 久久综合久久八八| 都市激情亚洲| 成年网站在线播放| 亚洲一区自拍偷拍| 国产露出视频在线观看| 亚洲综合视频1区| 噜噜噜躁狠狠躁狠狠精品视频| 国精品人伦一区二区三区蜜桃| 亚洲国产成人爱av在线播放| 草莓视频成人appios| 精品国产av无码一区二区三区| 国产欧美日本一区二区三区| 精品人妻午夜一区二区三区四区 | 欧美人与动xxxxz0oz| 国产91色在线观看| 午夜视黄欧洲亚洲| 日本高清视频在线观看| 激情一区二区三区| 国产一级精品在线| 亚洲黄网在线观看| 欧美精品第一页在线播放| 三区四区不卡|