日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

three.js学习笔记(十四)——Shaders着色器

發布時間:2023/12/18 编程问答 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 three.js学习笔记(十四)——Shaders着色器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是著色器?

實際上著色器是WebGL的主要組件之一。如果我們在沒接觸Three.js情況下開始學習WebGL,著色器將是我們首先且必須要學的知識,這也是為什么原生WebGL很難入門。
著色器是一種使用GLSL(OpenGL Shading Language)編寫并在GPU上運行的程序。它們被用于定位幾何體的每個頂點,并為該幾何體的每個可見像素著色。使用“像素Pixel”來描述其實并不準確,因為渲染的每個點不一定與屏幕上的每個像素相匹配,因此我們更傾向于使用術語“片元fragment”。
之后我們會向著色器發送大量數據,如頂點坐標、網格變換、攝像機及其視野范圍的信息、顏色、紋理、燈光、霧等參數。然后,GPU會按照著色器的指示處理所有的這些數據,接著幾何體便出現在渲染中。
有倆種類型的著色器,并且我們都會用到它們。

頂點著色器Vertex Shader

頂點著色器(Vertex Shader)的作用是定位幾何體的頂點。其思想是發送頂點位置、網格變換(如定位position、旋轉rotation和縮放scale)、攝影機信息(如定位position、旋轉rotation和視野fov)。然后,GPU將按照頂點著色器中的指示處理所有這些信息,以便將頂點投影到2D空間,該空間將成為我們的渲染render,也就是我們的畫布canvas。
頂點著色器對頂點實現了一種通用的可編程方法。
使用頂點著色器時,其代碼將應用于幾何體的每個頂點。但有些數據(如頂點的位置)會在每個頂點之間發生變化。這種類型的數據(在頂點之間變化的數據)稱為attribute屬性變量。

  • attribute:使用頂點數組封裝每個頂點的數據,一般用于每個頂點都各不相同的變量,如頂點的位置等。

但有些數據不需要像網格的位置那樣在每個頂點之間進行變換,用于對同一組頂點組成的單個3D物體中所有頂點都相同的變量,如當前光源的位置,相機的位置,這種類型的數據(頂點之間不發生變化的數據)稱為uniform統一變量。

  • uniform:頂點著色器使用的常量數據,不能被著色器修改,一般用于對同一組頂點組成的單個3D物體中所有頂點都相同的變量,如當前光源的位置。

頂點著色器會首先觸發,當放置完頂點后,GPU會知道幾何體的哪些像素是可見的,然后可以接著下去使用片元著色器。

片元著色器Fragment Shader

片元著色器的作用是為幾何體的每個可見片元(像素)進行著色。
我們會創建片元著色器,可以通過使用uniform將數據(像是顏色)和著色器發送至GPU,之后GPU就會按照指令對每個片元進行著色。
片段著色器中最簡單直接的指令是可以使用相同的顏色為所有片段著色。如果我們只設置了顏色屬性,我們就得到了與MeshBasicMaterial等效的材質(每個可見像素都被著色白色)。

參考 著色器語言三種變量attribute、uniform 和 varying

簡單總結

  • 頂點著色器渲染定位頂點位置
  • 片段著色器為該幾何體的每個可見片元(像素)進行著色
  • 片段著色器在頂點著色器之后執行
  • 在每個頂點之間會有變化的數據(如頂點的位置)稱為attribute,只能在頂點著色器中使用
  • 頂點之間不變的數據(如網格位置或顏色)稱為uniform,可以在頂點著色器和片段著色器中使用
  • 從頂點著色器發送到片元著色器中的插值計算數據被稱為varying

為什么要寫著色器?

Three.js的內置材質試圖涵蓋盡可能多的情況,但是依舊有其局限性。如果我們想要突破限制,就必須自個寫自己的著色器。

當然也可能是出于性能原因。像MeshStandardMaterial這樣的材質非常精細,涉及大量代碼和計算。如果我們編寫自己的著色器,我們可以將功能和計算保持在最小限度,這樣就可以更好控制與優化演算性能了。

編寫我們自己的著色器也是將后期處理添加到渲染中的一個很好的方法,但我們將在后面專門的課程中再看到這一點。

一旦掌握了著色器,它們將成為所有項目中不可或缺的必備工具。

使用原始著色器材質(RawShaderMaterial)創建自己的第一個著色器

要創建第一個著色器,我們需要創建特定的材質。該材質可以是著色器材質ShaderMaterial或原始著色器材質RawShaderMaterial。這兩者之間的區別在于前者會自動將一些代碼添加到著色器代碼中(內置attributes和uniforms),而后者正如其名,什么都不會添加。

準備工作

我們的初始場景有一塊MeshBasicMaterial材質的簡單平面,將之材質替換為RawShaderMaterial原始著色器材質。然后你會發現報錯了,這是因為我們還沒添加著色器。如前所述,我們需要同時提供頂點著色器和片元著色器,并在里面書寫程序:

const material = new THREE.RawShaderMaterial({vertexShader: `uniform mat4 projectionMatrix;uniform mat4 viewMatrix;uniform mat4 modelMatrix;attribute vec3 position;void main(){gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);}`,fragmentShader: `precision mediump float;void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}` })

得到這樣的一個結果:

分離兩種著色器

新建一個shaders文件夾,在里面新建倆個文件vertex.glsl和fragment.glsl,將上邊代碼拷貝到對應文件中,再在vscode的插件商店安裝shader languages support for VS code,這樣我們的.glsl文件也就有了語法高亮提示。
之后導入:

import testVertexShader from './shaders/test/vertex.glsl' import testFragmentShader from './shaders/test/fragment.glsl'

然而我們會報一個webpack錯誤,因為需要告訴webpack如何處理.glsl文件。
去/bundler/webpack.common.js,修改如下:

module.exports = {// ...module:{rules:[// ...// Shaders{test: /\.(glsl|vs|fs|vert|frag)$/,exclude: /node_modules/,use: ['raw-loader']}]} }

這個規則僅告訴webpack提供文件的原始內容。然后重啟服務,會看到與前面一樣的場景。

我們在其他材質中介紹的大多數常見屬性(如wireframe、side、transparent、flatShading)仍然適用于RawShaderMaterial

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,wireframe: true })


但是像map、alphaMap、opacity、 color等屬性將不再生效,因為我們需要自己在著色器中編寫這些特性。

GLSL

OpenGL著色語言(OpenGL Shading Language)是用來在OpenGL中著色編程的語言,它是一種類C語言,下面先學習一下基礎語法。

日志

沒有控制臺,因此無法記錄值。這是因為代碼針對每個頂點和每個片段執行。記錄一個值是沒有意義的。

縮進

縮進不重要,可以隨意。

分號

任何指令的結尾都需要分號。哪怕忘記一個分號都可能導致編譯錯誤,使得整個材料都不起作用。

變量

GLSL是一種強類型語言,如C語言一般。

不能在操作中混合使用float和int,會報錯:

float a = 1.0; int b = 2; float c = a * b;

但是可以通過類型轉換進行操作:

float a = 1.0; int b = 2; float c = a * float(b);

Vector 2

如果我們想存儲具有x和y屬性的2個坐標這樣的值,我們可以使用vec2

vec2 foo = vec2(1.0, 2.0);

空的vec2將導致錯誤:

vec2 foo = vec2();

我們可以在創建vec2后更改這些屬性:

vec2 foo = vec2(0.0); foo.x = 1.0; foo.y = 2.0;

執行vec2與浮點相乘等操作將同時操作x和y屬性:

vec2 foo = vec2(1.0, 2.0); foo *= 2.0;

Vector 3

vec3與vec2類似,但具有第三個名為z的屬性。當需要3D坐標時,使用它非常方便:

vec3 foo = vec3(0.0); vec3 bar = vec3(1.0, 2.0, 3.0); bar.z = 4.0;

雖然我們可以使用x、y和z,但我們也可以使用r、g和b。這只是語法糖,結果完全一樣。當我們使用vec3存儲顏色時,它非常有效:

vec3 purpleColor = vec3(0.0); purpleColor.r = 0.5; purpleColor.b = 1.0;

vec3可以通過部分使用vec2來創建:

vec2 foo = vec2(1.0, 2.0); vec3 bar = vec3(foo, 3.0);

我們也可以使用vec3的一部分來生成vec2:

vec3 foo = vec3(1.0, 2.0, 3.0); vec2 bar = foo.xy;

Vector 4

最后,vec4的原理與前兩個類似,但第四個值命名為w或a(顏色alpha)

vec4 foo = vec4(1.0, 2.0, 3.0, 4.0); vec4 bar = vec4(foo.zw, vec2(5.0, 6.0));

還有其他類型的變量,如mat2、mat3、mat4或sampler2D,我們將在后面看到這些變量。

在著色器內,一般命名以gl_開頭的變量是著色器的內置變量,除此之外webgl_和_webgl還是著色器保留字,自定義變量不能以webgl_或_webgl開頭。變量聲明一般包含<存儲限定符><數據類型><變量名稱>,以attribute vec4 a_Position為例,attribute表示存儲限定符,vec是數據類型,a_Position為變量名稱。

原生函數

GLSL有許多內置的經典函數,如sin、cos、max、min、pow、exp、mod、clamp,也有非常實用的函數,如cross、dot、mix、step、smoothstep、length、distance、reflect、refract、normalize。

不幸的是,沒有對初學者友好的文檔,而且大多數時候,我們在網絡上進行搜索,結果通常出現在以下網站:

  • Kronos Group OpenGL reference pages:本文檔涉及OpenGL,但您將看到的大多數標準函數都與WebGL兼容。不要忘了WebGL只是一個訪問OpenGL的JavaScript API。
  • Book of shaders documentation:《Book of shaders》主要關注片元著色器,與Three.js無關。但是這是一個很好的學習資源,它有自己的詞匯表。

理解頂點著色器

下面開始嘗試理解著色器里面的內容。

首先注意的是,頂點著色器的目的是將幾何體的每個頂點放置在2D渲染空間上。換句話說,頂點著色器將3D頂點坐標轉換為2D畫布坐標。

main函數

它會自動調用,并且不會返回return任何內容

void main() { }

gl_Position

變量gl_Position原本就已經聲明好,是一個內置變量,我們只需重新分配它。
這個變量將會包含屏幕上的頂點的位置,main函數中的代碼便是要正確設置該變量。
這條長代碼將返回一個vec4,這意味著我們可以直接在gl_Position變量上使用其x、y、z和w屬性。

void main() {gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);gl_Position.x += 0.5;gl_Position.y += 0.5; }

會看到平面往右上角移動,但是要注意,我們并沒有在3D空間里邊移動平面,雖然看起來像我們在Three.js里面控制位置一樣。不過,我們確實是在2D空間上移動了平面

如何理解上面的話,想象一下你在桌上畫一幅帶透視效果的圖畫,然后你將整張圖畫往右上角移動,但是圖畫中的透視效果并未因此而改變。

可能你想要知道如果gl_Position的目標是在2D空間上定位頂點,那為什么還需要四個值?實際上這些坐標并不是精確的位于二維空間,而是位于我們說的需要四個維度的剪裁空間Clip Space。

剪裁空間Clip Space是指在-1到+1范圍內的所有3個方向(x、y和z)上的空間。這就像把所有東西都放在3D盒子里一樣,任何超出此范圍的內容都將被“剪裁”并消失。第四個值(w)負責透視。

幸運的是,所有這些都是自動完成的,作為初學者,我們不需要掌握所有東西,只用大概了解下就行。

但是我們到底向gl_Position發送了什么?

Position attributes

首先,我們使用下面代碼檢索頂點位置:

attribute vec3 position;

請記住,相同的代碼適用于幾何體的每個頂點。屬性變量attribute是頂點之間唯一會發生變化的變量。相同的頂點著色器將應用于每個頂點,“position”屬性將包含該特定頂點的x、y和z坐標。
然后,如上面所示的代碼,我們將這個vec3轉換成一個vec4,因為矩陣和gl_Position都需要用到這個vec4:

gl_Position = /* ... */ vec4(position, 1.0);

Matrices uniforms

每個矩陣都將變換position,直到我們得到最終的剪裁空間坐標。
我們的代碼中有3個矩陣,因為它們的值對于幾何體的所有頂點都是相同的,所以我們使用uniform檢索它們。

uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelMatrix;

每個矩陣都將做一部分變換:

  • modelMatrix將應用與網格相關的所有變換。如果我們縮放、旋轉或移動網格,這些變換將包含在modelMatrix中并應用于position。
  • viewMatrix將應用相對于相機的變換。如果我們向左旋轉相機,頂點應該在右邊。如果我們沿著網格的方向移動相機,頂點會變大,等等。
  • projectionMatrix將我們的坐標轉換為最終的剪裁空間坐標。

如果想了解更多關于矩陣和坐標的信息,可以看這篇文章Coordinate-Systems

要應用矩陣,我們需要將其相乘。如果要將mat4應用于變量,該變量必須是vec4。

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);

實際上有一個代碼更少的版本,便是將viewMatrix和modelMatrix組合成modelViewMatrix,雖然代碼更短但我們對每一步的控制權也就越弱:

uniform mat4 projectionMatrix; uniform mat4 modelViewMatrix;attribute vec3 position;void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }

為了更好理解和控制position,我們將如下面這樣寫更長些:

uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelMatrix;attribute vec3 position;void main() {vec4 modelPosition = modelMatrix * vec4(position, 1.0);vec4 viewPosition = viewMatrix * modelPosition;vec4 projectedPosition = projectionMatrix * viewPosition;gl_Position = projectedPosition; }

這些寫法都是等效的,但是現在能夠通過調整modelPosition的值來移動整個模型:

void main() {vec4 modelPosition = modelMatrix * vec4(position, 1.0);// 平面向上移動modelPosition.y += 1.0;// ... } void main() {vec4 modelPosition = modelMatrix * vec4(position, 1.0);// 平面變波浪形modelPosition.z += sin(modelPosition.x * 10.0) * 0.1;// ... }

理解片元著色器

片元著色器的代碼將應用于幾何體的每個可見片元(像素)。這就是為什么片元著色器運行在頂點著色器之后。

Precision

在最頂部有這樣一條指令:

precision mediump float;

這條指令可以讓我們決定浮點數的精度,有如下可能值

  • highp:會造成性能影響,并可能在某些設備上無法工作。
  • mediump:我們通常使用這個。
  • lowp:會由于缺乏精確性而產生某些錯誤。

我們也可以設置頂點著色器的精度,但這不是必要的。

這一部分在使用著色器材質ShaderMaterial會被自動處理,但現在我們使用的是原始著色器材質。

gl_FragColor

gl_FragColor與gl_Position相似只不過是用于顏色。跟前者一樣是內置變量了,只需要在main函數中重新設置值。
這是一個vec4,前三個值是紅色、綠色和藍色通道(r、g、b),第四個值是alpha(a),下面這代碼應用后會看到紫色幾何體:

gl_FragColor = vec4(0.5, 0.0, 1.0, 1.0);

如果要降低alpha值使能夠看出差異,還需要回到RawShaderMaterial中將transparent屬性設置為true:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,transparent: true })

Attributes

我們在前面已經有一個名為position的attribute屬性變量,現在可以直接將這個屬性添加到BufferGeometry中。我們將為每個頂點添加一個隨機值,并根據這個值在z軸上移動該頂點。

回到js中,我們要在創建完幾何體后,再new一個32位的浮點數型數組Float32Array,然后為了知道幾何體中有多少個頂點,可以通過幾何體的attributes屬性獲取:

const count = geometry.attributes.position.count const randoms = new Float32Array(count)

然后用隨機值填充該數組:

for(let i = 0; i < count; i++) {randoms[i] = Math.random() }

最后,我們在BufferAttribute中使用該數組,并將其添加到幾何體的屬性中:

geometry.setAttribute('aRandom', new THREE.BufferAttribute(randoms, 1))

setAttribute的第一個參數是我們設置的attribute屬性的名字,這也是下面在著色器中使用的名字。命名最好在前面加一個a前綴代表屬性。
BufferAttribute的第一個參數是數據數組,第二個參數是組成一個屬性的值的數量。如果我們要發送一個位置,我們會使用3,因為位置由3個值(x、y和z)組成。但在這里,每個頂點只有1個隨機值,所以我們使用1。

現在,我們可以在頂點著色器中檢索該屬性,并使用它移動頂點:

// ... attribute float aRandom;void main() {// ...modelPosition.z += aRandom * 0.1;// ... }

最后得到一個尖銳峰巒狀平面:

Varyings

現在我們還想用aRandom屬性給片元著色。但可惜,我們沒法直接在片元著色器中使用attribute屬性變量。

但是,有一種方法可以將數據從頂點著色器發送到片元著色器,稱之為varying可變量。我們必須在倆種著色器上都這樣做。

在頂點著色器上,我們需要在main函數之前創建varying,這里將該變量命名為vRandom,用v作前綴好區分,然后在main函數中賦值:

// ...varying float vRandom;void main() {// ...vRandom = aRandom; }

然后在片元著色器用一樣的方式:

precision mediump float; varying float vRandom; void main() {gl_FragColor = vec4(0.5, vRandom, 1.0, 1.0); }

最后觀察到如下圖:

varying的一個有趣之處是,頂點之間的值是線性插值的,以此實現平滑漸變。如果GPU正在兩個頂點之間繪制一個片元,一個頂點的變量為1.0,另一個頂點的變量為0.0,那么片元值將為0.5。
最后重新回歸最初的普通平面。

Uniforms

統一變量uniform是將數據從JavaScript發送到著色器的一種方式。

如果我們想使用同一個著色器但是參數不一樣,以得到不同的結果,就可以使用uniform。

兩個著色器中都可以使用,其對每個頂點和片元的數據都是相同的。我們的代碼中已經有了projectionMatrix、viewMatrix和modelMatrix,但我們沒有創建它們,是Three.js創建的。

下面創建我們自己的統一變量uniform。

為將統一變量添加到我們的material中,要使用uniforms屬性,我們要做一個波浪平面,并且能夠控制波形頻率:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,uniforms:{frequency: { value: 10 }} })

在這里我們將統一變量命名為frequency,雖然不是強制性的,但最好在前面加個u前綴以將統一變量和其他數據區分開來:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,uniforms:{uFrequency: { value: 10 }} })

如果你也有在看其他的教程或示例,你可能會看到它是這樣聲明uniform的:

uFrequency: { value: 10, type: 'float' }

在之前我們必須為其指定類型,但現在已經被棄用了。

現在,我們可以在著色器代碼中檢索該值,并在main函數中使用它:

uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelMatrix; uniform float uFrequency;attribute vec3 position;void main() {// ...modelPosition.z += sin(modelPosition.x * uFrequency) * 0.1;// ... }

然后你會發現結果是一樣的,但現在我們可以在js中控制波形頻率了。

讓我們把頻率frequency改為vec2來控制水平和垂直方向的波,這里使用Three.js中一個簡單的vec2:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,uniforms:{uFrequency: { value: new THREE.Vector2(10, 5) }} })

然后回到著色器,將float改為vec2,在z軸上應用位移:

// ... uniform vec2 uFrequency;// ...void main() {// ...modelPosition.z += sin(modelPosition.x * uFrequency.x) * 0.1;modelPosition.z += sin(modelPosition.y * uFrequency.y) * 0.1;// ... }


這些值現在由JavaScript控制,所以我們可以將它們添加到我們的Dat.GUI中:

gui.add(material.uniforms.uFrequency.value, 'x').min(0).max(20).step(0.01).name('frequencyX') gui.add(material.uniforms.uFrequency.value, 'y').min(0).max(20).step(0.01).name('frequencyY')


現在讓我們再新加一個uniform來讓平面像在風中飄動的旗幟。
我們將使用統一變量向著色器發送一個時間值,并在sin函數中使用:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,uniforms:{uFrequency: { value: new THREE.Vector2(10, 5) },uTime: { value:0 }} })

記得在tick函數中更新uTime:

const tick = () => {const elapsedTime = clock.getElapsedTime()// Update materialmaterial.uniforms.uTime.value = elapsedTime// ... }

更新頂點著色器代碼:

// ... uniform float uTime;// ...void main() {// ...modelPosition.z += sin(modelPosition.x * uFrequency.x + uTime) * 0.1;modelPosition.z += sin(modelPosition.y * uFrequency.y + uTime) * 0.1;// ... }


在使用uTime時要注意,如果我們使用原生JavaScript的Date.now(),你會發現不起作用,因為它返回的數值對于著色器而言太過龐大了。注意,我們不能發送太小或太大的統一變量值。

不要忘記這仍然是一個平面,我們可以像以前一樣變換網格。讓我們給飛機做個旗子形狀。

我們可以在著色器中通過乘以modelPosition.y來實現,但不要忘記,我們仍然可以直接在網格上更改位置position、縮放scale和旋轉rotation:

const mesh = new THREE.Mesh(geometry, material) mesh.scale.y = 2 / 3 scene.add(mesh)


在片元著色器中也可以使用統一變量,下面使用Three.js的Color作為新的統一變量:

const material = new THREE.RawShaderMaterial({vertexShader: testVertexShader,fragmentShader: testFragmentShader,uniforms:{uFrequency: { value: new THREE.Vector2(10, 5) },uTime: { value: 0 },uColor: { value: new THREE.Color('orange') }} }) precision mediump float;uniform vec3 uColor;void main() {gl_FragColor = vec4(uColor, 1.0); }

之后你會看到旗幟變為橘色。

Textures

下面將我們的旗幟貼圖紋理應用于平面上(網上找一張圖片1024*1024即可):

const textureLoader = new THREE.TextureLoader() const flagTexture = textureLoader.load('/textures/flag-CCCP.jpg')

然后將它傳給統一變量uTexture:

const material = new THREE.RawShaderMaterial({// ...uniforms:{// ...uTexture: { value: flagTexture }} })

下面要將我們的旗幟紋理的顏色應用于所有可見片元上,為此我們必須使用texture2D()方法,該方法第一個參數就是應用的紋理,第二個參數是由在紋理上拾取的顏色的坐標組成,我們還沒有這些坐標,而這聽起來很熟悉,我們正在尋找可以幫助我們在幾何體上投射紋理的坐標,也就是UV坐標。
PlaneBufferGeometry會自動生成這些坐標,可以通過打印geometry.attributes.uv看到。
因為它是一個屬性,我們可以在頂點著色器中檢索它:

attribute vec2 uv;

不過,我們需要在片元著色器中使用這些坐標。而要將數據從頂點著色器發送至片元著色器,我們要創建一個名為vUv的變量varying,并在main函數中對其賦值:

// ... attribute vec2 uv;varying vec2 vUv;void main() {// ...vUv = uv; }

現在,我們可以在片元著色器中檢索變量vUv傳給texture2D()方法:

precision mediump float;uniform vec3 uColor; uniform sampler2D uTexture;varying vec2 vUv;void main() {vec4 textureColor = texture2D(uTexture, vUv);gl_FragColor = textureColor; }

texture2D(...)的輸出值是一個vec4因為它包含rgb和a,即便這里沒用到a。

顏色變化

旗幟的顏色變化不是很明顯,如果有亮度的變化像陰影一般就好了,下面要用到的技術在物理上并不準確,但應該也能起到一點作用。
首先,在頂點著色器中,我們將把風的高度存儲在一個變量elevation中,然后通過varying將之發送至片元著色器:

// ... varying float vElevation;void main() {// ...float elevation = sin(modelPosition.x * uFrequency.x - uTime) * 0.1;elevation += sin(modelPosition.y * uFrequency.y - uTime) * 0.1;modelPosition.z += elevation;vElevation = elevation;// ... }

用這個變量來改變textureColor的r,g,b屬性:

// ... varying float vElevation;void main() {vec4 textureColor = texture2D(uTexture, vUv);textureColor.rgb *= vElevation * 2.0 + 0.5;gl_FragColor = textureColor; }

著色器材質

到目前為止,我們一直使用原始著色器材質RawShaderMaterial,而ShaderMaterial的工作原理其實是一樣的,只不過其有內置attributes和uniforms,精度也會自動設置。
你可以將材質直接替換:

const material = new THREE.ShaderMaterial({// ...

然后在著色器中移除下面這些uniform,attribute和precision:

  • uniform mat4 projectionMatrix;
  • uniform mat4 viewMatrix;
  • uniform mat4 modelMatrix;
  • attribute vec3 position;
  • attribute vec2 uv;
  • precision mediump float;

之后著色器會跟之前一樣正常運行,因為它會自動添加上上面這些。

調試

調試著色器很困難,我們不能像JavaScript那樣記錄數據,因為是GPU對每個頂點和每個片元都執行著色器代碼。
然而,Three.js在編譯中傳遞錯誤這方面做得很好。

查錯

如果我們忘打一個分號,Three.js會打印整個著色器代碼并提示我們在第幾行出錯,像這樣:ERROR: 0:99: 'textureColor' : syntax error

閱讀著色器

當使用ShaderMaterial時,在報錯時查看控制臺的整個著色器代碼也是一種很好的方式,可以觀察到Three.js為我們自動添加了哪些變量。

測試數值

調試數值的另一個解決方案是在gl_FragColor中使用它們。雖然并不精確,但是能看到顏色變化,有時候這也足夠了。
如果這些值在頂點著色器中,我們可以使用一個變量將其傳遞給片元著色器。
假如我們想看uv長啥樣,我們可以將其發送至片元著色器,然后在gl_FragColor中使用:

gl_FragColor = vec4(vUv, 1.0, 1.0);

最后

Glslify

GLSLify是一個node module模塊,它改進了我們對glsl文件的處理。通過glslify,我們可以像模塊一樣導入和導出glsl代碼。你可以使用glslify-loader并將之加到webpack配置中去。

網站

下面是學習著色器的一些網站和油管頻道:

  • The Book of Shaders: https://thebookofshaders.com/
  • ShaderToy: https://www.shadertoy.com/
  • The Art of Code Youtube Channel: https://www.youtube.com/channel/UCcAlTqd9zID6aNX3TzwxJXg
  • Lewis Lepton Youtube Channel: https://www.youtube.com/channel/UC8Wzk_R1GoPkPqLo-obU_kQ

筆記都是邊看視頻邊跟著敲代碼邊做筆記的,如果有哪里出錯,還望指出來,好做改進,謝謝。

總結

以上是生活随笔為你收集整理的three.js学习笔记(十四)——Shaders着色器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91久久国产露脸精品国产闺蜜 | 中文字幕影视 | 天天插狠狠插 | 在线视频国产区 | 欧美精品一区二区免费 | 福利片视频区 | 成人午夜剧场在线观看 | 一级片在线| 日本三级中文字幕在线观看 | 国产99久久久国产精品免费二区 | 欧美性性网 | 五月天色丁香 | 欧美日韩另类在线观看 | 美女视频黄频大全免费 | 免费观看国产精品 | 精品色综合 | 亚洲1区 在线| 91九色在线视频观看 | 国产激情电影综合在线看 | 久久精品精品 | 91av中文字幕 | 蜜臀av免费一区二区三区 | 九七视频在线 | 国产精品久久电影观看 | 亚洲精品18日本一区app | 日本精品久久久久 | 国产麻豆精品一区 | 久久亚洲私人国产精品 | 国产精品成| 热re99久久精品国产66热 | 国产剧在线观看片 | 久草视频视频在线播放 | 中文字幕av免费观看 | 在线视频免费观看 | 色网站视频 | 日日躁你夜夜躁你av蜜 | 久久午夜国产精品 | 亚洲午夜av | 国产视频在线播放 | 国产呻吟在线 | www.久久视频| 18国产精品福利片久久婷 | 婷婷av在线| 成年人在线看视频 | 日韩一区二区三区视频在线 | 国产毛片久久 | 欧美夫妻性生活电影 | 91麻豆精品一区二区三区 | 最新日韩在线观看视频 | 奇米影视8888在线观看大全免费 | 人人看人人 | 91精品一 | 99视频在线观看一区三区 | 精品国产视频在线观看 | 99热这里精品 | 日韩免费电影一区二区 | 国产精品 美女 | 亚洲精品午夜aaa久久久 | 国产精品久久电影网 | 美女视频国产 | 亚洲电影第一页av | 最新av在线播放 | 91精品在线看 | 在线观看亚洲国产精品 | 69绿帽绿奴3pvideos | 亚洲成人黄色网址 | www.夜夜操.com| 狠狠色丁香婷婷综合 | 国产97视频在线 | 人人爽人人爽 | 久久久久久久久久久久久久av | 欧美日韩另类在线观看 | 特级a毛片 | 欧美在线a视频 | 视频在线观看入口黄最新永久免费国产 | 在线免费观看黄色大片 | 免费视频xnxx com | a级黄色片视频 | 免费视频 你懂的 | 天天操天天摸天天爽 | 成人免费一级片 | 激情久久一区二区三区 | 国产精品久久久久久婷婷天堂 | 天天射天天爱天天干 | 中文字幕高清视频 | 国产免费午夜 | 又黄又爽又无遮挡免费的网站 | 国产精品免费在线 | 久久综合狠狠综合久久综合88 | 97视频在线免费观看 | 色综合天天做天天爱 | 狠狠狠狠狠操 | 99免费在线视频观看 | av在线亚洲天堂 | 国产亚洲在线观看 | 久久久久久电影 | 精品视频免费久久久看 | 久久成人毛片 | 成人午夜在线电影 | 久久久黄色免费网站 | 91传媒91久久久 | 日日夜夜狠狠 | a黄在线观看 | 精品国产一区二区三区四 | 日韩高清二区 | 91久久影院| 久久99久国产精品黄毛片入口 | 亚洲一级在线观看 | 午夜精品久久久久久久99婷婷 | 日韩在线免费观看视频 | 成年人免费在线观看 | 亚洲精品乱码白浆高清久久久久久 | a在线观看视频 | 日日摸日日爽 | 亚洲无人区小视频 | 久久久久免费网 | 狠狠色丁香久久婷婷综合五月 | 久久久午夜剧场 | 亚洲国产一二三 | 99视频在线观看一区三区 | 最新真实国产在线视频 | 成人在线观看免费 | 国产一级电影 | 天天操天天射天天插 | 天堂av在线网 | 九九视频免费观看视频精品 | 中文字幕日韩在线播放 | 免费看的国产视频网站 | 涩涩爱夜夜爱 | 狠狠地日 | www,黄视频 | 欧美高清成人 | 丁香五月缴情综合网 | 国产精品毛片久久蜜 | 天天干天天干天天干 | 一区二区三区中文字幕在线观看 | 日韩中文字幕免费视频 | 日韩av成人在线观看 | 色在线国产 | 手机在线黄色网址 | 91亚·色 | 国产精品九九九 | 奇米影视8888在线观看大全免费 | 在线有码中文字幕 | 日韩最新在线视频 | 激情av网 | 天天玩天天干 | 久久国产亚洲精品 | 精品国精品自拍自在线 | 日本视频网 | 久久久久亚洲精品成人网小说 | 91视频在线观看免费 | 中国一级特黄毛片大片久久 | 人人干人人草 | 国产二区电影 | 欧美日韩在线精品一区二区 | 亚洲成年人免费网站 | 中文字幕一区二区三区久久 | 国产热re99久久6国产精品 | 久av电影 | 亚洲国产中文字幕 | 色吊丝在线永久观看最新版本 | 亚洲精品777 | 欧美久久久久久久久久久久 | 国产91欧美 | 日韩欧美黄色网址 | 国产色秀视频 | 麻豆久久一区二区 | 亚洲涩综合 | 成人久久久久久久久久 | 一级黄毛片 | 五月天久久激情 | 国产一区视频导航 | 中文字幕第一页av | 2024国产精品视频 | 91视频网址入口 | 99久久精品免费一区 | 麻花豆传媒mv在线观看 | 99久久综合狠狠综合久久 | 亚洲电影av在线 | 国产一区二区在线观看免费 | 五月综合色婷婷 | 97国产一区二区 | 国产丝袜在线 | 亚洲最新视频在线 | 人人插人人做 | 97精品电影院 | 在线精品视频免费观看 | 国产电影黄色av | 69国产盗摄一区二区三区五区 | a在线免费观看视频 | 韩国一区二区三区在线观看 | 欧美一区二区在线免费观看 | 黄色激情网址 | 国产精品中文久久久久久久 | 国产中的精品av小宝探花 | 免费观看丰满少妇做爰 | 国产精品久久久久久久久久ktv | 一区二区三区高清在线观看 | 国产91精品久久久久 | 国产亚洲婷婷 | 国产美女黄网站免费 | 最近乱久中文字幕 | 亚洲视频久久久 | 亚洲精品国产电影 | 黄色av成人在线观看 | 五月天久久精品 | 国产真实精品久久二三区 | 97av影院 | 国产99久久久久久免费看 | 91在线网址 | 中文视频一区二区 | 黄色小说视频网站 | 亚洲精品美女在线观看播放 | 亚洲理论片在线观看 | 高清久久久久久 | 国产免费影院 | 日本精品久久久一区二区三区 | 日韩二三区 | 九九免费观看视频 | 五月天综合网站 | 婷婷在线视频 | 国产一级大片免费看 | 久久久久亚洲精品国产 | 9999精品 | 成人av直播| 久久久一本精品99久久精品 | 丁香婷婷色综合亚洲电影 | 日本高清免费中文字幕 | 91九色在线视频 | 国产区高清在线 | 久久久影院官网 | 狠狠88综合久久久久综合网 | 亚州日韩中文字幕 | 精品国产一区二区三区久久久蜜臀 | 婷婷色视频| 天堂av在线7 | 日韩欧美综合精品 | 91精品国自产在线观看欧美 | 四虎免费av| 黄色精品久久久 | 日日夜夜天天久久 | 天天操天天操天天操天天操 | 免费观看9x视频网站在线观看 | 久久综合狠狠综合久久激情 | 麻豆成人网 | 国产黄影院色大全免费 | 日本精品va在线观看 | 国产一区二区三区免费在线 | 久久午夜色播影院免费高清 | 国产麻豆精品传媒av国产下载 | 天堂av一区二区 | 91在线观看视频网站 | 亚洲激情综合 | 国产免费叼嘿网站免费 | 美女黄频在线观看 | av大全免费在线观看 | 久久一区二区三区国产精品 | 精品亚洲免a | 亚洲综合精品视频 | 亚洲国产成人精品久久 | 亚洲精品国产免费 | 免费亚洲一区二区 | 免费在线色视频 | 午夜av一区 | 亚洲一区二区三区四区在线视频 | 国产免费中文字幕 | 精品国偷自产在线 | 一区二区精品在线视频 | 99免费| 免费a一级| 免费黄色av电影 | 成人在线免费观看网站 | 国产精品毛片一区视频 | 99视频一区二区 | 九九国产视频 | 成人a免费视频 | 久久国产精品久久久久 | 久精品视频在线 | 国产精品va最新国产精品视频 | 国产中文视频 | 激情视频区 | va视频在线观看 | 色综合久久久网 | 精品久久一 | av女优中文字幕在线观看 | 在线观看视频你懂得 | 丁香五月网久久综合 | 毛片美女网站 | 中文字幕在线一二 | 日韩a在线 | 操操操av | 中文字幕频道 | 91麻豆高清视频 | 97超碰人人模人人人爽人人爱 | 五月天亚洲精品 | 国内外成人免费在线视频 | 欧美一区二区三区不卡 | 999精品| 午夜精品久久久久久久久久 | 日韩av片无码一区二区不卡电影 | 在线色资源 | 天天天干夜夜夜操 | 中文字幕中文字幕在线中文字幕三区 | 国产精品色婷婷 | 日韩免费区| 丁香婷婷基地 | 国内精品久久久久影院一蜜桃 | 国产亚洲精品久久久久久久久久久久 | 国产成人福利在线观看 | 久久激情综合网 | 久久人人爽人人爽人人片 | 99久久综合国产精品二区 | 成人中心免费视频 | 中文字幕av在线 | 国产福利电影网址 | 国产日本在线播放 | 久久久久久亚洲精品 | 国产精品一区二区吃奶在线观看 | 一区二区不卡在线观看 | 久久久久 免费视频 | av片子在线观看 | 久久国内精品视频 | 久久九九国产精品 | 久久精品一区二区三区四区 | 久久精品伊人 | 一区二区三区在线观看 | 一区二区精品国产 | 免费日韩 精品中文字幕视频在线 | 久久福利剧场 | 超碰97人人干 | www.99热精品 | 91资源在线视频 | 尤物九九久久国产精品的分类 | 丁香婷婷综合网 | 伊人久在线 | 亚洲综合一区二区精品导航 | av在线免费播放网站 | 国产在线日本 | 2019天天干夜夜操 | 欧美一级性生活片 | 亚洲人久久久 | 日本一区二区免费在线观看 | 五月天激情综合网 | 国产成人久久77777精品 | 亚洲国产精品久久久久久 | 鲁一鲁影院 | 综合久久五月天 | 日韩在线观看的 | 91丨porny丨九色 | 天天操天天操天天操 | 人人干干人人 | 97福利在线观看 | 欧美一级免费片 | 日本黄色一级电影 | 天天爱av导航 | 亚洲国产精品成人女人久久 | 中文字幕麻豆 | 午夜成人免费电影 | 久久精品视频3 | 久草热视频| 天堂av在线网址 | 日韩精品一区二区三区免费观看视频 | 日批视频国产 | 日批视频| 国产中文视频 | 丝袜美腿一区 | 免费成人黄色片 | 99久久精品久久久久久清纯 | 制服丝袜天堂 | 久久久久久久久久久影视 | 日韩欧美99 | 一区二区三区日韩视频在线观看 | 激情五月婷婷综合 | 最新99热 | 久久久久免费精品视频 | 亚洲国产福利视频 | 在线观看成人毛片 | 九九九热 | 成人动漫一区二区三区 | 91视频在线观看免费 | 欧美男同视频网站 | 亚洲区另类春色综合小说校园片 | 国产高清av在线播放 | 国产69精品久久久久久久久久 | 国产成人中文字幕 | 狠狠色丁香久久婷婷综合五月 | av免费电影在线 | 91久久久久久久一区二区 | 鲁一鲁影院 | 69国产精品视频 | .国产精品成人自产拍在线观看6 | 欧美日本一二三 | 二区三区中文字幕 | 国产日韩欧美在线观看 | 91麻豆精品国产91久久久久 | 国产一级免费观看 | 黄色免费观看 | 亚洲激情在线视频 | 一区二区三区在线影院 | 久久99精品视频 | 精品国产一区二区三区免费 | 国产免费观看久久 | 伊人婷婷在线 | aaa免费毛片 | 日韩亚洲国产中文字幕 | 99视频在线精品免费观看2 | 免费高清在线视频一区· | 亚洲精品在线电影 | 国产一区在线视频观看 | 国产精品区一区 | 在线亚洲成人 | 国产精品免费观看久久 | 国产精品视频99 | 久久国产精品99久久人人澡 | 日本深夜福利视频 | 亚洲欧美精品在线 | 91在线视频免费观看 | 日韩大片在线 | 天天干,天天射,天天操,天天摸 | 久久国产精品久久久久 | 日日躁夜夜躁aaaaxxxx | 最近日本中文字幕 | 国产精品国内免费一区二区三区 | 91精品久久久久久 | 亚洲精品97| 日精品 | 成人午夜在线电影 | 综合激情久久 | 亚洲最新在线视频 | 99精品视频在线播放观看 | www好男人 | 2021国产在线视频 | 国产黑丝袜在线 | 一级久久精品 | 欧美日韩国产高清视频 | 米奇四色影视 | a黄色| 在线观看av黄色 | 日韩视频免费在线观看 | 伊人天天色| 国产精品一码二码三码在线 | 麻花天美星空视频 | 超碰在线网 | 日韩激情片在线观看 | 国产一级免费av | 色婷婷国产精品一区在线观看 | 视频二区在线 | 国产99久久精品一区二区300 | 91av手机在线观看 | 国产成人亚洲精品自产在线 | 91日韩免费| 国产精品人成电影在线观看 | 九九色网 | 国产免费不卡av | 国产亚洲婷婷 | 久久精品国产免费看久久精品 | 国内精品久久久久久久久久清纯 | 狠狠综合久久 | 草在线 | 亚洲精品国产麻豆 | 国产精品网在线观看 | 国产xx在线| 最新国产精品拍自在线播放 | 欧美亚洲xxx| 久久午夜电影院 | 国产一区二区播放 | 中文字幕 国产视频 | 国产一区二区三区高清播放 | 中文字幕资源站 | 超碰97久久 | 亚洲禁18久人片 | 久久99热精品这里久久精品 | 免费亚洲视频在线观看 | 国产成人精品一区二区在线观看 | 日韩天堂在线观看 | 国产亚洲精品免费 | 天天干天天干 | 久热国产视频 | 天天操天天射天天 | 国产午夜在线观看 | 免费看久久 | 狠狠色伊人亚洲综合网站色 | 97福利在线观看 | 超碰在线官网 | 91色蜜桃 | 日本在线观看中文字幕无线观看 | 97超碰免费在线观看 | 亚洲精品高清在线 | 久久亚洲综合国产精品99麻豆的功能介绍 | 亚洲深夜影院 | 欧美坐爱视频 | 美女福利视频一区二区 | 国产精品久久久久久久久久不蜜月 | 久久久久免费 | 天天搞天天干 | 午夜成人免费影院 | 欧美性久久久 | av成人黄色 | 97视频免费看 | 成人小视频免费在线观看 | 日批视频国产 | 国内精品久久久久久中文字幕 | 超碰电影在线观看 | 成人久久久久久久久久 | av中文字幕亚洲 | 91高清完整版在线观看 | 福利电影一区二区 | 91精选| 玖玖视频在线 | 天天射日 | 久久久污 | 亚洲干 | 色视频在线免费 | 亚洲情影院 | 9草在线 | 国产视频97 | 久久久久日本精品一区二区三区 | www国产亚洲精品久久麻豆 | 中文字幕在线观看播放 | 国产午夜精品一区 | 玖玖在线观看视频 | 亚洲精品视频免费在线观看 | 久久精品视频在线观看免费 | 天天射天天操天天 | 国产精品一区二区三区视频免费 | 五月天最新网址 | 开心色插 | 天堂成人在线 | 五月婷婷一级片 | 玖玖国产精品视频 | 亚洲做受高潮欧美裸体 | 91麻豆精品国产91久久久使用方法 | 丁香六月婷婷开心婷婷网 | 在线免费观看视频一区二区三区 | 亚洲日本黄色 | 99久久久久国产精品免费 | 成人精品国产免费网站 | 天天色天天操天天爽 | 久草在线最新免费 | 国产精品美女久久久久久久 | 日本久久久久久久久久 | 伊人电影在线观看 | 91福利社在线观看 | 欧美日韩网址 | 免费中文字幕视频 | 激情网色 | 一区二区精品在线 | 亚洲 欧美日韩 国产 中文 | 亚洲少妇自拍 | 最近中文国产在线视频 | 在线免费三级 | 激情xxxx | 久保带人| 日本精品一区二区 | 精品1区2区3区 | 波多野结衣在线视频一区 | 亚洲免费永久精品国产 | 很黄很污的视频网站 | 97在线精品 | 精品在线观看一区二区 | av电影免费看 | av黄色免费网站 | 精品网站999www | 色a综合| 97人人网| 国产 日韩 欧美 在线 | 69国产盗摄一区二区三区五区 | 亚洲日本va午夜在线电影 | 99在线精品观看 | 日日日日 | 国产视频一区在线 | 亚洲国产伊人 | 国产精品免费在线视频 | 久久久久亚洲精品中文字幕 | 99久高清在线观看视频99精品热在线观看视频 | 最近更新好看的中文字幕 | 国产欧美精品一区二区三区 | 精品黄色片 | 成人一级视频在线观看 | 欧美一区二区三区免费看 | 三级黄色网址 | 久 久久影院 | 免费a网 | 亚洲va欧美va国产va黑人 | 国产一级视屏 | 国产91aaa | av夜夜操| 国产精品18久久久久久不卡孕妇 | 在线看成人 | 中文字幕av在线电影 | 免费在线激情电影 | 日韩av一区二区三区 | 国产精品视频99 | 毛片基地黄久久久久久天堂 | 国产精品一区在线观看 | 成人va在线观看 | 最近最新中文字幕视频 | 国产精品久久久久久久久久妇女 | 日本精品视频在线观看 | 中文字幕无吗 | 欧美怡红院 | 国产在线欧美在线 | 看片网站黄 | 69精品在线 | 免费高清在线一区 | 成人动漫一区二区三区 | 精品在线免费观看 | 成人免费观看完整版电影 | 一区二区国产精品 | 手机在线看a | 日本久久久久久科技有限公司 | av免费看在线 | av动态图片| 激情电影影院 | 一区二区三区国 | 成 人 黄 色视频免费播放 | 在线视频 精品 | 久久精品国产亚洲aⅴ | 中文字幕观看av | 国产精品91一区 | 欧美一区二区在线免费观看 | 青青河边草免费观看完整版高清 | 在线免费观看亚洲视频 | 91 在线视频播放 | 日日夜夜精品免费观看 | 胖bbbb搡bbbb擦bbbb | 日韩电影精品一区 | 日本久久精 | 在线亚洲欧美日韩 | 久久成电影 | 超碰人人射 | 欧美少妇18p | 蜜臀av夜夜澡人人爽人人桃色 | 国产打女人屁股调教97 | 伊人婷婷久久 | 特黄色大片 | 欧美日韩免费看 | 香蕉一区 | 一区二区三区视频网站 | 欧美成人黄色 | 日韩欧美aaa| 国产精品夜夜夜一区二区三区尤 | av高清免费在线 | 欧美,日韩 | 蜜臀久久99精品久久久无需会员 | 国产很黄很色的视频 | 国产免费a| 久久久国产精品亚洲一区 | 伊甸园永久入口www 99热 精品在线 | 免费av在线播放 | 一区二区三区 中文字幕 | 欧美性极品xxxx娇小 | 91成人在线网站 | 免费福利小视频 | 国产精品久久久久久久免费观看 | 日韩av在线小说 | 一二三四精品 | 美女视频黄在线 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品视频资源 | 操操操影院 | 久久99精品国产麻豆宅宅 | 亚洲国产美女久久久久 | 日韩免费二区 | 日日干夜夜操视频 | 色五丁香 | 日韩有色 | 国产流白浆高潮在线观看 | 国外调教视频网站 | 国产69精品久久久久99尤 | 激情五月播播久久久精品 | 98精品国产自产在线观看 | 日韩毛片在线一区二区毛片 | 国产三级视频在线 | 久久美女电影 | 久草在线费播放视频 | 99色免费| 三级动态视频在线观看 | 亚洲精品三级 | 国产精品小视频网站 | 美女视频黄在线 | 日本久久视频 | 亚洲婷婷综合色高清在线 | 天天色欧美 | 国产高清无线码2021 | 久久成人精品视频 | 在线天堂v | 色视频成人在线观看免 | 亚洲精品久久久蜜桃 | 国产一线二线三线性视频 | 亚洲作爱| 又黄又色又爽 | 日本中文字幕一二区观 | 国产一区二区在线播放视频 | 久艹视频在线免费观看 | 久久久久国产成人免费精品免费 | 亚洲免费精品一区二区 | 日本黄色免费在线观看 | 日韩v欧美v日本v亚洲v国产v | 欧美成人一区二区 | 337p欧美| 一二三四精品 | 免费av 在线| 国产日产精品久久久久快鸭 | 亚洲精品久久久久中文字幕二区 | 免费在线中文字幕 | 久久精品99国产精品亚洲最刺激 | 国产亚洲精品av | 亚洲精品视 | 91在线porny国产在线看 | 日韩中文字幕网站 | 99视频免费播放 | 日日夜夜爱 | 字幕网资源站中文字幕 | 国产精品美女久久久久久免费 | 成人国产一区二区 | 欧美日韩国产综合网 | 四虎在线观看视频 | 国产精品午夜在线 | 久久免费看毛片 | 啪啪精品 | 亚洲在线免费视频 | 激情视频在线观看网址 | 亚洲成a人片在线www | 国产黄a三级 | 在线韩国电影免费观影完整版 | 久久久久免费精品视频 | av在线影视| 在线观看视频99 | 天天干天天干天天操 | 日韩手机视频 | 日本久久久久久 | 久久久久影视 | 久久99精品久久久久久久久久久久 | 夜夜爽www | 成人一级片视频 | 狠狠操电影网 | 国产精品九九九九九 | 成人在线视频在线观看 | 免费在线黄网 | 久久国产视频网站 | 精品国产伦一区二区三区 | 六月色婷婷 | 国产精品www| 在线观看免费版高清版 | 在线看成人片 | 天堂成人在线 | 综合久久一本 | 国产午夜亚洲精品 | 免费观看一区二区三区视频 | 日韩在线观看中文字幕 | 国产亚州精品视频 | av在线播放快速免费阴 | 精品国产欧美一区二区 | 亚洲久草在线视频 | 日韩一区二区三区免费电影 | 免费三级在线 | 五月天婷婷在线播放 | 欧美日韩一区二区三区不卡 | 国产成人在线看 | 91九色porny在线| 国产又粗又猛又黄又爽视频 | 一本一本久久aa综合精品 | 九九热re| 久久精品这里都是精品 | 日韩美在线 | 奇米导航 | 狠狠网站 | 韩国一区在线 | 成人片在线播放 | 亚洲专区免费观看 | 欧美日韩国产综合一区二区 | 欧美特一级 | av一级二级| 成年人黄色免费网站 | 99久精品视频 | 精品国产免费人成在线观看 | 一级电影免费在线观看 | 开心激情网五月天 | 国产精品美女久久久久久久久 | 亚洲精品国产自产拍在线观看 | 色偷偷88888欧美精品久久久 | 81精品国产乱码久久久久久 | 久久久久国产一区二区三区 | 四虎亚洲精品 | 国产区免费在线 | 日本一区二区三区免费观看 | 91日韩精品一区 | 白丝av免费观看 | 亚洲视频axxx | 精品国产伦一区二区三区免费 | 日本动漫做毛片一区二区 | 激情五月激情综合网 | 国产原厂视频在线观看 | 99久久99久久精品 | 成年人看片| 日本三级香港三级人妇99 | 成人a级网站 | 免费在线观看av网址 | 日日干天天爽 | 欧美日韩国产精品一区二区三区 | 久久久福利视频 | 国产va饥渴难耐女保洁员在线观看 | 国产视频久 | 综合色亚洲 | 成人网大片 | 在线免费视频a | 久久夜色精品国产欧美一区麻豆 | 在线看一区 | a电影在线观看 | avwww在线 | 国产永久免费高清在线观看视频 | 91精品免费在线 | 精品嫩模福利一区二区蜜臀 | 日本精品视频网站 | 久久精品婷婷 | 精品视频免费观看 | 日韩美av在线 | 久久久久北条麻妃免费看 | 久久天天拍| 五月天精品视频 | 国产精品美女久久久 | 国产精品久久一区二区三区, | 精品国产乱码久久久久久三级人 | 91女人18片女毛片60分钟 | 97成人免费| 日韩不卡高清 | 国产午夜三级 | 人人插人人做 | 久热色超碰 | 成人久久久久久久久久 | 91天天操 | 久久婷婷一区二区三区 | 成人91免费视频 | 久草视频免费看 | 日韩在线一二三区 | 欧美一级黄色视屏 | 国产美女视频免费 | 超碰97国产在线 | 九九欧美 | 丁香六月中文字幕 | 成人在线免费视频 | 天天综合网国产 | 精品人妖videos欧美人妖 | 日韩欧美在线国产 | 深爱激情五月网 | 国产精品av久久久久久无 | 久久精品网站免费观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩av看片 | 超碰97网站 | 亚洲欧美综合精品久久成人 | 成年人黄色免费网站 | 久久国产精品色婷婷 | 日韩视频一区二区三区在线播放免费观看 | 又黄又爽又湿又无遮挡的在线视频 | 国产一级a毛片视频爆浆 | www.五月婷婷.com | 日本中文字幕在线看 | 久草在| 成年人免费在线看 | 中文字幕在线国产精品 | 91重口视频 | 日韩免费一级电影 | 精品国产诱惑 | 日韩精品久久一区二区三区 | 久久99久久99精品免观看粉嫩 | 成人在线超碰 | 六月丁香激情综合色啪小说 | 新av在线| 极品国产91在线网站 | 国产91成人在在线播放 | 最新国产中文字幕 | 国产精品精品久久久久久 | 日韩丝袜在线 | av电影在线观看 | 国产看片网站 | 亚洲专区视频在线观看 | 国产黄色av影视 | 女人18毛片90分钟 | 国产99区| 成人av电影在线观看 | 天天爱综合 | 丁香激情综合久久伊人久久 | www成人精品 | 久久日韩精品 | 人成电影网 | 亚洲最新视频在线播放 | 九九热免费在线视频 | 狠狠狠操 | 永久免费看av | 国产精品99视频 | 国产99久久久欧美黑人 | 免费在线观看污 | 天天操天天射天天爽 | 91麻豆精品国产自产在线游戏 | 精品一区电影国产 | 99国产精品免费网站 | 日日干日日 | 久久综合久久综合九色 | 久久精品视频观看 | 九九国产精品视频 | 中文久久精品 | 五月天天av| www.国产高清 | 中文字幕精品在线 | 黄色片网站免费 | 欧美激情亚洲综合 | 亚洲涩涩涩| 免费福利片2019潦草影视午夜 | 色婷婷国产精品一区在线观看 | 少妇自拍av | 欧美日韩伦理在线 | 国产一区二区高清不卡 | 亚洲午夜小视频 | 毛片基地黄久久久久久天堂 | 久久综合久久伊人 | 亚洲欧洲精品视频 | 亚洲人成在 | 欧美一级爽| 国产成人综合在线观看 | 五月婷婷影视 | 国产精品美女久久久久久 | 中文字幕精品一区二区精品 | a一片一级 | 久久久久久久久久久久影院 | 免费69视频 | 77国产精品 | 热热热热热色 | 亚洲综合在线发布 | 国产黄影院色大全免费 | 在线观看视频免费播放 | 99福利片 | 国产99久久久国产精品成人免费 | 日日添夜夜添 | 天天激情天天干 | 国产精品久久99综合免费观看尤物 | 欧美综合在线视频 | 成人网页在线免费观看 | 色综合久久久久久中文网 | 国内少妇自拍视频一区 | 激情校园亚洲 | 国产99久久久国产精品成人免费 | 欧美日韩一级久久久久久免费看 | 午夜视频在线观看一区二区三区 | 婷婷五综合 | 亚洲无人区小视频 | 在线蜜桃视频 | 蜜臀av网址 | 中文字幕丝袜美腿 | 97国产精品久久 | 99 久久久久 | 99精品国产一区二区三区不卡 | 日本丶国产丶欧美色综合 | 狠狠综合久久av | av 在线观看 | 国产午夜一区 | 久久久久久久久久久久久久免费看 | bayu135国产精品视频 | 九九国产精品视频 | 一级一片免费看 | 国产天天爽 | 亚洲国产99| 五月天中文在线 | 国产精品6999成人免费视频 | 97成人免费视频 | 在线免费av播放 | 粉嫩高清一区二区三区 | 九色琪琪久久综合网天天 | www.一区二区三区 | 午夜久久福利视频 | 久久在线看 | 麻豆高清免费国产一区 | 国内视频一区二区 | 欧美一区二区三区免费观看 | 欧美一区二区三区在线视频观看 | 在线免费中文字幕 | 黄色字幕网 | 久久96| 中文字幕亚洲综合久久五月天色无吗'' | 国产精品久久久久久久久久不蜜月 | 97视频在线观看视频免费视频 | 亚洲免费小视频 | 成年人免费av | 亚洲第一久久久 | 免费特级黄色片 | 久久免费成人网 | 黄色国产精品 | 日日爽视频 | 成人av中文字幕在线观看 | 日韩大片在线看 | 精品中文字幕视频 | 国产精品久久久久久婷婷天堂 | 久久久精品国产一区二区电影四季 | 久草精品在线 | 久亚洲精品| 日韩69视频 |