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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

用JavaScript玩转计算机图形学(一)光线追踪入门

發(fā)布時(shí)間:2025/3/21 javascript 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用JavaScript玩转计算机图形学(一)光线追踪入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

系列簡(jiǎn)介

記得小時(shí)候讀過一本關(guān)于計(jì)算機(jī)圖形學(xué)(computer graphics, CG)的入門書,從此就愛上了CG。本系列希望,采用很多人認(rèn)識(shí)的JavaScript語言去分享CG,令更多人有機(jī)會(huì)接觸,并愛上CG。

本系列的特點(diǎn)之一,是讀者能在瀏覽器里直接執(zhí)行代碼,也可重覆修改代碼測(cè)試。透過這種互動(dòng),也許能更深刻體會(huì)內(nèi)容。讀者只要懂得JavaScript(因?yàn)镴avaScript很簡(jiǎn)單,學(xué)過Java/C/C++/C#之類的語言也應(yīng)沒問題)和一點(diǎn)點(diǎn)線性代數(shù)(linear algebra)就可以了。

筆者在大學(xué)期間并沒有修讀CG課程,雖然看過相關(guān)書籍,始終未親手做過全域光照的渲染器,本文也作為個(gè)人的學(xué)習(xí)分享。此外,筆者也差不多十年沒接觸JavaScript,希望各位不吝賜教。

本文簡(jiǎn)介

多數(shù)程序員聽到3D CG,就會(huì)聯(lián)想到Direct3D、OpenGL等API。事實(shí)上,這些流行的API主要為實(shí)時(shí)渲染(real-time rendering)而設(shè),一般采用光柵化(rasterization)方式,渲染大量的三角形(或其他幾何圖元種類(primitive types))。這種基于光柵化的渲染系統(tǒng),只支持局部光照(local illumination)。換句話說,渲染幾何圖形的一個(gè)像素時(shí),光照計(jì)算只能取得該像素的資訊,而不能訪問其他幾何圖形資訊。理論上,陰影(shadow)、反射(reflection)、折射(refraction)等為全局光照(global illumination)效果,實(shí)際上,柵格化渲染系統(tǒng)可以使用預(yù)處理(如陰影貼圖(shadow mapping)、環(huán)境貼圖(environment mapping))去模擬這些效果。

全局光照計(jì)算量大,一般也沒有特殊硬件加速(通常只使用CPU而非GPU),所以只適合離線渲染(offline rendering),例如3D Studio Max、Maya等工具。其中一個(gè)支持全局光照的方法,稱為光線追蹤(ray tracing)。光線追蹤能簡(jiǎn)單直接地支持陰影、反射、折射,實(shí)現(xiàn)起來亦非常容易。本文的例子里,只用了數(shù)十行JavaScript代碼(除canvas外不需要其他特殊插件和庫),就能實(shí)現(xiàn)一個(gè)支持反射的光線追蹤渲染器。光線追蹤可以用來學(xué)習(xí)很多計(jì)算機(jī)圖形學(xué)的課題,也許比學(xué)習(xí)Direct3D/OpenGL更容易。現(xiàn)在,先介紹點(diǎn)理論吧。

光線追蹤

光柵化渲染,簡(jiǎn)單地說,就是把大量三角形畫到屏幕上。當(dāng)中會(huì)采用深度緩沖(depth buffer, z-buffer),來解決多個(gè)三角形重疊時(shí)的前后問題。三角形數(shù)目影響效能,但三角形在屏幕上的總面積才是主要瓶頸。

光線追蹤,簡(jiǎn)單地說,就是從攝影機(jī)的位置,通過影像平面上的像素位置(比較正確的說法是取樣(sampling)位置),發(fā)射一束光線到場(chǎng)景,求光線和幾何圖形間最近的交點(diǎn),再求該交點(diǎn)的著色。如果該交點(diǎn)的材質(zhì)是反射性的,可以在該交點(diǎn)向反射方向繼續(xù)追蹤。光線追蹤除了容易支持一些全局光照效果外,亦不局限于三角形作為幾何圖形的單位。任何幾何圖形,能與一束光線計(jì)算交點(diǎn)(intersection point),就能支持。

上圖(來源)顯示了光線追蹤的基本方式。要計(jì)算一點(diǎn)是否在陰影之內(nèi),也只須發(fā)射一束光線到光源,檢測(cè)中間有沒有障礙物而已。不過光源和陰影留待下回分解。

初試畫板

光線追蹤的輸出只是一個(gè)影像(image),所謂影像,就是二維顏色數(shù)組。

要在瀏覽器內(nèi),用JavaScript生成一個(gè)影像,目前可以使用HTML 5的<canvas>。但現(xiàn)時(shí)Internet Explorer(直至版本8)還不支持<canvas>,其他瀏覽器如Chrome、Firefox、Opera等就可以。

以下是一個(gè)簡(jiǎn)單的實(shí)驗(yàn),把每個(gè)象素填入顏色,左至右越來越紅,上至下越來越綠。

Run

?

左邊的canvas定義如下:

1<canvas?width="256" height="256" id="testCanvas"></canvas>

修改代碼試試看

  • 把第三個(gè)pixels[i++] = 0 改為255 (即藍(lán)色全開)
  • 把第四個(gè)pixels[i++] = 255 改為128 (alpha=128)
  • 可以只修改兩個(gè)for循環(huán)里面的代碼,畫一個(gè)國(guó)際象棋棋盤么?

這實(shí)驗(yàn)說明,從canvas取得的影像資料canvas.getImageData(...).data是個(gè)一維數(shù)組,該數(shù)組每四個(gè)元素代表一個(gè)象素(按紅, 綠, 藍(lán), alpha排列),這些象素在影像中從上至下、左至右排列。

解決實(shí)驗(yàn)平臺(tái)的技術(shù)問題后,可開始從基礎(chǔ)類別開始實(shí)現(xiàn)。

基礎(chǔ)類

筆者使用基于物件(object-based)的方式編寫JavaScript。

三維向量

三維向量(3D vector)可謂CG里最常用型別了。這里三維向量用Vector3類實(shí)現(xiàn),用(x, y, z)表示。 Vector3亦用來表示空間中的點(diǎn)(point),而不另建類。先看代碼:

1234567891011121314151617Vector3 = function(x, y, z) { this.x = x; this.y = y; this.z = z; };Vector3.prototype = {????copy : function() { return?new?Vector3(this.x, this.y, this.z); },????length : function() { return?Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); },????sqrLength : function() { return?this.x * this.x + this.y * this.y + this.z * this.z; },????normalize : function() { var?inv = 1/this.length(); return?new?Vector3(this.x * inv, this.y * inv, this.z * inv); },????negate : function() { return?new?Vector3(-this.x, -this.y, -this.z); },????add : function(v) { return?new?Vector3(this.x + v.x, this.y + v.y, this.z + v.z); },????subtract : function(v) { return?new?Vector3(this.x - v.x, this.y - v.y, this.z - v.z); },????multiply : function(f) { return?new?Vector3(this.x * f, this.y * f, this.z * f); },????divide : function(f) { var?invf = 1/f; return?new?Vector3(this.x * invf, this.y * invf, this.z * invf); },????dot : function(v) { return?this.x * v.x + this.y * v.y + this.z * v.z; },????cross : function(v) { return?new?Vector3(-this.z * v.y + this.y * v.z, this.z * v.x - this.x * v.z, -this.y * v.x + this.x * v.y); }};Vector3.zero = new?Vector3(0, 0, 0);

這些類方法(如normalize、negate、add等),如果傳回Vector3類對(duì)象,都會(huì)傳回一個(gè)新建構(gòu)的Vector3。這些三維向量的功能很簡(jiǎn)單,不在此詳述。注意multiply和divide是與純量(scalar)相乘和相除。

Vector3.zero用作常量,避免每次重新構(gòu)建。值得一提,這些常量必需在prototype設(shè)定之后才能定義。

光線

所謂光線(ray),從一點(diǎn)向某方向發(fā)射也。數(shù)學(xué)上可用參數(shù)函數(shù)(parametric function)表示:

當(dāng)中,o即發(fā)謝起點(diǎn)(origin),d為方向。在本文的例子里,都假設(shè)d為單位向量(unit vector),因此t為距離。實(shí)現(xiàn)如下:

12345Ray3 = function(origin, direction) { this.origin = origin; this.direction = direction; }Ray3.prototype = {????getPoint : function(t) { return?this.origin.add(this.direction.multiply(t)); }};

球體

球體(sphere)是其中一個(gè)最簡(jiǎn)單的立體幾何圖形。這里只考慮球體的表面(surface),中心點(diǎn)為c、半徑為r的球體表面可用等式(equation)表示:

如前文所述,需要計(jì)算光線和球體的最近交點(diǎn)。只要把光線x = r(t)代入球體等式,把該等式求解就是交點(diǎn)。為簡(jiǎn)化方程,設(shè)v=o - c,則:

因?yàn)閐為單位向量,所以二次方的系數(shù)可以消去。 t的二次方程式的解為

若根號(hào)內(nèi)為負(fù)數(shù),即相交不發(fā)生。另外,由于這里只需要取最近的交點(diǎn),因此正負(fù)號(hào)只需取負(fù)號(hào)。代碼實(shí)現(xiàn)如下:

1234567891011121314151617181920212223242526272829Sphere = function(center, radius) { this.center = center; this.radius = radius; };Sphere.prototype = {????copy : function() { return?new?Sphere(this.center.copy(), this.radius.copy()); },????initialize : function() {????????this.sqrRadius = this.radius * this.radius;????},????intersect : function(ray) {????????var?v = ray.origin.subtract(this.center);????????var?a0 = v.sqrLength() - this.sqrRadius;????????var?DdotV = ray.direction.dot(v);????????if?(DdotV <= 0) {????????????var?discr = DdotV * DdotV - a0;????????????if?(discr >= 0) {????????????????var?result = new?IntersectResult();????????????????result.geometry = this;????????????????result.distance = -DdotV - Math.sqrt(discr);????????????????result.position = ray.getPoint(result.distance);????????????????result.normal = result.position.subtract(this.center).normalize();????????????????return?result;????????????}????????}????????return?IntersectResult.noHit;????}};

實(shí)現(xiàn)代碼時(shí),盡快用最少的運(yùn)算剔除沒相交的情況(Math.sqrt是比較慢的函數(shù))。另外,預(yù)計(jì)算了球體半徑r的平方,此為一個(gè)優(yōu)化。

這里用到一個(gè)IntersectResult類,這個(gè)類只用來記錄交點(diǎn)的幾何物件(geometry)、距離(distance)、位置(position)和法向量(normal)。 IntersectResult.noHit的geometry為null,代表光線沒有和任何幾何物件相交。

12345678IntersectResult = function() {????this.geometry = null;????this.distance = 0;????this.position = Vector3.zero;????this.normal = Vector3.zero;};IntersectResult.noHit = new?IntersectResult();

攝影機(jī)

攝影機(jī)在光線追蹤系統(tǒng)里,負(fù)責(zé)把影像的取樣位置,生成一束光線。

由于影像的大小是可變的(多少像素寬x多少像素高),為方便計(jì)算,這里設(shè)定一個(gè)統(tǒng)一的取樣座標(biāo)(sx, sy),以左下角為(0,0),右上角為(1 ,1)。

從數(shù)學(xué)角度來說,攝影機(jī)透過投影(projection),把三維空間投射到二維空間上。常見的投影有正投影(orthographic projection)、透視投影(perspective projection)等等。這里首先實(shí)現(xiàn)透視投影。 ]]>

透視攝影機(jī)

透視攝影機(jī)比較像肉眼和真實(shí)攝影機(jī)的原理,能表現(xiàn)遠(yuǎn)小近大的觀察方式。透視投影從視點(diǎn)(view point/eye position),向某個(gè)方向觀察場(chǎng)景,觀察的角度范圍稱為視野(field of view, FOV)。除了定義觀察的向前(forward)是那個(gè)方向,還需要定義在影像平面中,何謂上下和左右。為簡(jiǎn)單起見,暫時(shí)不考慮寬高不同的影像,FOV同時(shí)代表水平和垂直方向的視野角度。

上圖顯示,從攝影機(jī)上方顯示的幾個(gè)參數(shù)。 forward和right分別是向前和向右的單位向量。

因?yàn)橐朁c(diǎn)是固定的,光線的起點(diǎn)不變。要生成光線,只須用取樣座標(biāo)(sx, sy)計(jì)算其方向d。留意FOV和s的關(guān)系為:

把sx從[0, 1]映射到[-1,1],就可以用right向量和s,來計(jì)算r向量,代碼如下:

123456789101112131415PerspectiveCamera = function(eye, front, up, fov) { this.eye = eye; this.front = front; this.refUp = up; this.fov = fov; };PerspectiveCamera.prototype = {????initialize : function() {????????this.right = this.front.cross(this.refUp);????????this.up = this.right.cross(this.front);????????this.fovScale = Math.tan(this.fov * 0.5 * Math.PI / 180) * 2;????},????generateRay : function(x, y) {????????var?r = this.right.multiply((x - 0.5) * this.fovScale);????????var?u = this.up.multiply((y - 0.5) * this.fovScale);????????return?new?Ray3(this.eye, this.front.add(r).add(u).normalize());????}};

代碼中fov為度數(shù),轉(zhuǎn)為弧度才能使用Math.tan()。另外,fovScale預(yù)先乘了2,因?yàn)閟x映射到[-1,1]每次都要乘以2。 sy和sx的做法一樣,把兩個(gè)在影像平面的向量,加上forward向量,就成為光線方向d。因之后的計(jì)算需要,最后把d變成單位向量。

渲染測(cè)試

寫了Vector3、Ray3、Sphere、IntersectResult、Camera五個(gè)類之后,終于可以開始渲染一點(diǎn)東西出來!

基本的做法是遍歷影像的取樣座標(biāo)(sx, sy),用Camera把(sx, sy)轉(zhuǎn)為Ray3,和場(chǎng)景(例如Sphere)計(jì)算最近交點(diǎn),把該交點(diǎn)的屬性轉(zhuǎn)為顏色,寫入影像的相對(duì)位置里。

把不同的屬性渲染出來,是CG編程里經(jīng)常用的測(cè)試和調(diào)試手法。筆者也是用此方法,修正了一些錯(cuò)誤。

渲染深度

深度(depth)就是從IntersectResult取得最近相交點(diǎn)的距離,因深度的范圍是從零至無限,為了把它顯示出來,可以把它的一個(gè)區(qū)間映射到灰階。這里用[0, maxDepth]映射至[255, 0],即深度0的像素為白色,深度達(dá)maxDepth的像素為黑色。

12345678910111213141516171819202122232425262728// renderDepth.htmfunction?renderDepth(canvas, scene, camera, maxDepth) {????// 從canvas取得imgdata和pixels,跟之前的代碼一樣????// ...????scene.initialize();????camera.initialize();????var?i = 0;????for?(var?y = 0; y < h; y++) {????????var?sy = 1 - y / h;????????for?(var?x = 0; x < w; x++) {????????????var?sx = x / w;??????????? ????????????var?ray = camera.generateRay(sx, sy);????????????var?result = scene.intersect(ray);????????????if?(result.geometry) {????????????????var?depth = 255 - Math.min((result.distance / maxDepth) * 255, 255);????????????????pixels[i??? ] = depth;????????????????pixels[i + 1] = depth;????????????????pixels[i + 2] = depth;????????????????pixels[i + 3] = 255;????????????}????????????i += 4;????????}????}????ctx.putImageData(imgdata, 0, 0);}

Run

?

這里的觀看方向是,正X軸向右,正Y軸向上,正Z軸向后。

修改代碼試試看

  • 改變球體的位置
  • 改變球體的半徑
  • 改變fov(PerspectiveCamera最后的參數(shù))
  • 改變maxDepth(renderDepth最后的參數(shù))
  • 改變攝影機(jī)的方向,例如向左轉(zhuǎn)一點(diǎn)點(diǎn)(記得要是單位向量啊!可以用new Vector(...).normalize())

渲染法向量

相交測(cè)試也計(jì)算了幾何物件在相交位置的法向量,這里也可把它視覺化。法向量是一個(gè)單位向量,其每個(gè)元素的范圍是[-1, 1]。把單位向量映射到顏色的常用方法為,把(x, y, z)映射至(r, g, b),范圍從[-1, 1]映射至[0, 255]。

1 2 3 4 5 6 7 8 9 10 11 // renderNormal.htm function?renderNormal(canvas, scene, camera) { ????// ... ????????????if?(result.geometry) { ????????????????pixels[i??? ] = (result.normal.x + 1) * 128; ????????????????pixels[i + 1] = (result.normal.y + 1) * 128; ????????????????pixels[i + 2] = (result.normal.z + 1) * 128; ????????????????pixels[i + 3] = 255; ????????????} ????// ... }

Run

?

球體上方的法向量是接近(0, 1, 0),所以是淺綠色(0.5, 1, 0.5)。

修改代碼試試看

  • 從球體的正上方往下看

材質(zhì)

渲染深度和法向量只為測(cè)試和調(diào)試,要顯示物件的"真實(shí)"顏色,需要定義該交點(diǎn)向某方向(如往視點(diǎn)的方向)發(fā)出的光的顏色,稱之為幾個(gè)圖形的材質(zhì)(material )。

材質(zhì)的接口為function sample(ray, posiiton, normal) ,傳回顏色Color的對(duì)象。這是個(gè)極簡(jiǎn)陋的接口,臨時(shí)做一些效果出來,有機(jī)會(huì)再詳談。

顏色

顏色在CG里最簡(jiǎn)單是用紅、綠、藍(lán)三個(gè)通道(color channel)。為實(shí)現(xiàn)簡(jiǎn)單的Phong材質(zhì),還加入了對(duì)顏色的簡(jiǎn)單操作。

1234567891011121314Color = function(r, g, b) { this.r = r; this.g = g; this.b = b };Color.prototype = {????copy : function() { return?new?Color(this.r, this.g, this.b); },????add : function(c) { return?new?Color(this.r + c.r, this.g + c.g, this.b + c.b); },????multiply : function(s) { return?new?Color(this.r * s, this.g * s, this.b * s); },????modulate : function(c) { return?new?Color(this.r * c.r, this.g * c.g, this.b * c.b); }};Color.black = new?Color(0, 0, 0);Color.white = new?Color(1, 1, 1);Color.red = new?Color(1, 0, 0);Color.green = new?Color(0, 1, 0);Color.blue = new?Color(0, 0, 1);

這Color類很像Vector3類,值得留意的是,顏色有調(diào)制(modulate)操作,其意義為兩個(gè)顏色中每個(gè)顏色通道相乘。

格子材質(zhì)

CG世界里,國(guó)際象棋棋盤是最常見的測(cè)試用紋理(texture)。這里不考慮紋理貼圖(texture mapping)的問題,只憑(x, z)坐標(biāo)計(jì)算某位置發(fā)出黑色或白色的光(黑色的光不叫光吧,哈哈)。

1234567CheckerMaterial = function(scale, reflectiveness) { this.scale = scale; this.reflectiveness = reflectiveness; };CheckerMaterial.prototype = {????sample : function(ray, position, normal) {????????return?Math.abs((Math.floor(position.x * 0.1) + Math.floor(position.z * this.scale)) % 2) < 1 ? Color.black : Color.white;????}};

代碼中scale的意義為1坐標(biāo)單位有多少個(gè)格子,例如scale=0.1即一個(gè)格子的大小為10x10。

Phong材質(zhì)

這里實(shí)現(xiàn)簡(jiǎn)單的Phong材質(zhì),因?yàn)槲从泄庠聪到y(tǒng),只用全域變量設(shè)置一個(gè)臨時(shí)的光源方向,并只計(jì)算漫射(diffuse)和鏡射(specular)。

123456789101112131415161718192021PhongMaterial = function(diffuse, specular, shininess, reflectiveness) {????this.diffuse = diffuse;????this.specular = specular;????this.shininess = shininess;????this.reflectiveness = reflectiveness;};// global tempvar?lightDir = new?Vector3(1, 1, 1).normalize();var?lightColor = Color.white;PhongMaterial.prototype = {????sample: function(ray, position, normal) {????????var?NdotL = normal.dot(lightDir);????????var?H = (lightDir.subtract(ray.direction)).normalize();????????var?NdotH = normal.dot(H);????????var?diffuseTerm = this.diffuse.multiply(Math.max(NdotL, 0));????????var?specularTerm = this.specular.multiply(Math.pow(Math.max(NdotH, 0), this.shininess));????????return?lightColor.modulate(diffuseTerm.add(specularTerm));????}};

Phong的內(nèi)容不在此述。

渲染材質(zhì)

修改之前的渲染代碼,當(dāng)碰到相交時(shí),就向幾何對(duì)象取得material屬性,并調(diào)用sample方法函數(shù)取得顏色。

123456789101112// rayTrace.htmfunction?rayTrace(canvas, scene, camera) {????// ...????????????if?(result.geometry) {????????????????var?color = result.geometry.material.sample(ray, result.position, result.normal);????????????????pixels[i] = color.r * 255;????????????????pixels[i + 1] = color.g * 255;????????????????pixels[i + 2] = color.b * 255;????????????????pixels[i + 3] = 255;????????????}????// ...}

Run

?

修改代碼試試看

  • 改變fov,有了格子地板效果應(yīng)該很明顯
  • 改變CheckerMaterial的scale
  • 把原來紅色的球改為綠色
  • 把原來紅色的球改為黃色
  • 改變shininess(PhongMaterial最后一個(gè)參數(shù))

多個(gè)幾何物件

只渲染一個(gè)幾何物件太乏味,這節(jié)再加入一個(gè)無限平面,和介紹如何組合多個(gè)幾何物件。

平面

一個(gè)(無限)平面(Plane)在數(shù)學(xué)上可用等式定義:

n為平面的法向量,d為空間原點(diǎn)至平面的最短距離。光線和平面的相交計(jì)算很簡(jiǎn)單,這里不詳述了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Plane = function(normal, d) { this.normal = normal; this.d = d; }; Plane.prototype = { ????copy : function() { return?new?plane(this.normal.copy(), this.d); }, ????initialize : function() { ????????this.position = this.normal.multiply(this.d); ????}, ????? ????intersect : function(ray) { ????????var?a = ray.direction.dot(this.normal); ????????if?(a >= 0) ????????????return?IntersectResult.noHit; ????????var?b = this.normal.dot(ray.origin.subtract(this.position)); ????????var?result = new?IntersectResult(); ????????result.geometry = this; ????????result.distance = -b / a; ????????result.position = ray.getPoint(result.distance); ????????result.normal = this.normal; ????????return?result; ????} };

并集

把多個(gè)幾何物件結(jié)合起來,可以使用集(set)的概念。這里最容易實(shí)現(xiàn)的操作,就是并集(union),即光線要找到一組幾個(gè)圖形的最近交點(diǎn)。無需改其他代碼,只加入一個(gè)Union類就可以:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Union = function(geometries) { this.geometries = geometries; }; Union.prototype = { ????initialize: function() { ????????for?(var?i in?this.geometries) ????????????this.geometries[i].initialize(); ????}, ????? ????intersect: function(ray) { ????????var?minDistance = Infinity; ????????var?minResult = IntersectResult.noHit; ????????for?(var?i in?this.geometries) { ????????????var?result = this.geometries[i].intersect(ray); ????????????if?(result.geometry && result.distance < minDistance) { ????????????????minDistance = result.distance; ????????????????minResult = result; ????????????} ????????} ????????return?minResult; ????} };

可以看到,這里利用Javascript的多型(polymorphism)的特性,完全不用修改原來的代碼,就可以擴(kuò)展功能。

如前所述,這里只考慮幾何幾何圖形的表面。如果考慮幾何圖形是實(shí)心的,就可以用構(gòu)造實(shí)體幾何(constructive solid geometry, CSG)方法,提供并集、交集、補(bǔ)集等操作。容后再談。

反射

以上實(shí)現(xiàn)的,也只是局部照明。只要再加入一點(diǎn)點(diǎn)代碼,就可以實(shí)現(xiàn)反射。

下圖說明反射向量的計(jì)算方法:

把d投射到n上(因n是單位向量,只需要點(diǎn)乘即可),就可以計(jì)算d在n上的長(zhǎng)度,把d減去這長(zhǎng)度兩倍的法向量,就是反射向量r。數(shù)學(xué)上可寫成:

<img src="http://latex.codecogs.com/png.latex?\mathbf{r}%20=%20\mathbfozvdkddzhkzd%20-%202(\mathbf{d%20\cdot%20n})\bf{n}" "="" style="border: 0px; display: block; margin-left: auto; margin-right: auto; max-width: 900px;">

一般材質(zhì)并非完全反射(鏡子除外),因此這里為材質(zhì)加上一個(gè)反射度(reflectiveness)的屬性。反射的功能很簡(jiǎn)單,只要在碰到反射度非零的材質(zhì),就繼續(xù)向反射方向追蹤,并把結(jié)果按反射度來混合。例如一個(gè)材質(zhì)的反射度為25%,則它傳回的顏色是75%本身顏色,加上25%反射傳回來的顏色。

另外,不斷反射會(huì)做成大量的運(yùn)算,甚至乎永遠(yuǎn)不能停止(考慮攝影機(jī)在兩個(gè)鏡子中間)。因此要限制反射的次數(shù)。含反射功能的光線追蹤代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 function?rayTraceRecursive(scene, ray, maxReflect) { ????var?result = scene.intersect(ray); ????? ????if?(result.geometry) { ????????var?reflectiveness = result.geometry.material.reflectiveness; ????????var?color = result.geometry.material.sample(ray, result.position, result.normal); ????????color = color.multiply(1 - reflectiveness); ????????? ????????if?(reflectiveness > 0 && maxReflect > 0) { ????????????var?r = result.normal.multiply(-2 * result.normal.dot(ray.direction)).add(ray.direction); ????????????ray = new?Ray3(result.position, r); ????????????var?reflectedColor = rayTraceRecursive(scene, ray, maxReflect - 1); ????????????color = color.add(reflectedColor.multiply(reflectiveness)); ????????} ????????return?color; ????} ????else ????????return?Color.black; } function?rayTraceReflection(canvas, scene, camera, maxReflect) { ????// 從canvas取得imgdata和pixels,跟之前的代碼一樣 ????// ... ????scene.initialize(); ????camera.initialize(); ????var?i = 0; ????for?(var?y = 0; y < h; y++) { ????????var?sy = 1 - y / h; ????????for?(var?x = 0; x < w; x++) { ????????????var?sx = x / w; ????????????var?ray = camera.generateRay(sx, sy); ????????????var?color = rayTraceRecursive(scene, ray, maxReflect); ????????????pixels[i++] = color.r * 255; ????????????pixels[i++] = color.g * 255; ????????????pixels[i++] = color.b * 255; ????????????pixels[i++] = 255; ????????} ????} ????ctx.putImageData(imgdata, 0, 0); }

Run

?

修改代碼試試看

  • 改變一個(gè)球的reflectiveness,試試0、1及之間的數(shù)值
  • 改變maxReflect(rayTraceReflection最后一個(gè)參數(shù))
  • 加入更多的球體(可用for循環(huán)啊……不過小心渲染時(shí)間太長(zhǎng))

結(jié)語

能體會(huì)到計(jì)算機(jī)圖形學(xué)的有趣之處么?百多行簡(jiǎn)單的JavaScript代碼,就繪畫出像真的影像,那種滿足感實(shí)非筆墨所能形容。

本文實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的光線追蹤渲染器,支持球體、平面、Phong材質(zhì)、格子材質(zhì)、多重反射等功能。讀者可以下載這組代碼,加入不同的擴(kuò)展,也可以嘗試翻譯做熟悉的編程語言。很多光線追蹤用到的計(jì)算機(jī)圖形技術(shù),也可以應(yīng)用到實(shí)時(shí)圖形編程里,例如光源和材質(zhì)的計(jì)算,基本上可以簡(jiǎn)易翻譯做實(shí)時(shí)圖形的著色器(shader)編程。

游戲里采用光柵化渲染技術(shù)已有二十年以上,這幾年的硬件發(fā)展,使其他渲染方法也能用于實(shí)時(shí)應(yīng)用。光線追蹤和其他類似的方法,有個(gè)當(dāng)今重要優(yōu)點(diǎn),就是能高度平行化。采樣之間并沒有依賴性,例如256x256=65536個(gè)采樣,理論上,可使用65536個(gè)機(jī)器/核心獨(dú)立執(zhí)行追蹤,那么完成時(shí)間只是最慢的一個(gè)取樣所需的時(shí)間。

筆者希望繼續(xù)撰寫這系列,例如包括以下內(nèi)容:

  • 其他幾何圖形(長(zhǎng)方體、柱體、三角形、曲面、高度場(chǎng)、等值面、……)
  • 光源(方向光源、點(diǎn)光源、聚光燈、陰影、ambient occlusion)
  • 材質(zhì)(Phong-Blinn、Oren-Nayar、Torrance-Sparrow、折射、 Fresnel、BRDF、BSDF……)
  • 紋理(紋理座標(biāo)、采樣、Perlin noise)
  • 攝影機(jī)模型(正投射、全景、景深)
  • 成像流程(漸進(jìn)渲染、反鋸齒、后期處理)
  • 優(yōu)化方法(場(chǎng)景剖分、低階優(yōu)化)
  • 其他全局光照渲染方法

祈望得到大家的意見反饋。

參考

  • Matt Pharr, Greg Humphreys, Physically Based Rendering, Morgan Kaufmann, 2004
  • Wikipedia,?Ray Tracing
  • Slime,?The JavaScript Raytracer
  • SIGGRAPH HyperGraph Education Project,?Ray Tracing

更新

  • 2010年3月31日,網(wǎng)友HouSisong把本文代碼以C++實(shí)現(xiàn),并完全保留了原設(shè)計(jì),代碼可於他的博文下載。

from:?http://www.cnblogs.com/miloyip/archive/2010/03/29/1698953.html

總結(jié)

以上是生活随笔為你收集整理的用JavaScript玩转计算机图形学(一)光线追踪入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产一区高清在线观看 | 久久国产精品一区二区三区 | 色欧美成人精品a∨在线观看 | 国产亚洲va综合人人澡精品 | 国产精品18久久久久久久 | 久久精品一区二区三区视频 | 亚洲 成人 欧美 | 色激情五月 | 日韩欧美在线高清 | 亚洲少妇xxxx | 亚洲热视频 | 久久久久 | 狂野欧美激情性xxxx欧美 | 91精品一 | 国产h片在线观看 | 国产黄色大片 | 中文字幕在线网址 | 中文字幕在线观看免费高清电影 | 日韩av影片在线观看 | 日日躁你夜夜躁你av蜜 | 国产免费视频一区二区裸体 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产一二三在线视频 | 成人av片免费观看app下载 | 久草视频观看 | 91丨九色丨国产丨porny精品 | 国产视频中文字幕 | 波多野结衣小视频 | 天天操天天射天天舔 | 久久线视频 | 天天艹天天爽 | 又爽又黄在线观看 | 91亚洲国产成人 | 欧美资源 | 中文在线中文资源 | av字幕在线 | 免费网站观看www在线观看 | 91中文在线 | 91一区啪爱嗯打偷拍欧美 | 亚av在线| 色综合久久88 | 十八岁以下禁止观看的1000个网站 | 51精品国自产在线 | 久久综合狠狠综合久久激情 | 色婷婷综合视频在线观看 | 国产18精品乱码免费看 | 五月天亚洲激情 | 在线免费观看的av | 91片黄在线观看 | 国产中文字幕亚洲 | 久久国产精品一国产精品 | 久艹视频在线免费观看 | 涩涩色亚洲一区 | 三级黄色在线观看 | 国产自产高清不卡 | 最近中文字幕完整视频高清1 | 日韩免费网址 | 久久艹国产视频 | 久久6精品 | 国产黄色精品 | 国产资源精品在线观看 | 天天射天天做 | aaa亚洲精品一二三区 | 国产剧情一区 | 久草在线视频免费资源观看 | 成 人 黄 色视频免费播放 | 免费在线色电影 | 久久精品看片 | av丝袜在线| 国内精品福利视频 | 中文字幕在线国产精品 | 色婷婷一区 | 天堂av免费在线 | 98福利在线| 91丨九色丨蝌蚪丨老版 | www免费| 国产精品18久久久久久不卡孕妇 | 91视频88av | 亚洲va综合va国产va中文 | 天天躁天天狠天天透 | 美女视频黄色免费 | 久久精品一区二区三区四区 | 最新av在线网站 | 91福利专区 | 国产一区二区免费在线观看 | 久久公开免费视频 | 99久久国产免费看 | 久久国产高清视频 | 中文在线免费看视频 | 免费午夜网站 | 亚洲国产一区在线观看 | 一级精品视频在线观看宜春院 | 国产精品免费久久久久 | 在线视频精品播放 | 久久激情片 | av资源免费在线观看 | 久久96国产精品久久99漫画 | 狠狠狠操 | 亚洲第一中文字幕 | 欧美夫妻生活视频 | 丁香花在线视频观看免费 | 日本高清免费中文字幕 | 干天天 | 亚洲成人网av | 久久久综合色 | 日韩欧美在线综合网 | 亚洲电影影音先锋 | 一级黄色片毛片 | 人人爱人人爽 | 国产一级特黄毛片在线毛片 | 97在线观看免费高清完整版在线观看 | 亚洲成人xxx | www黄色大片 | 日韩专区 在线 | 久久久一本精品99久久精品66 | 久久久91精品国产一区二区三区 | 91女子私密保健养生少妇 | 97精品在线观看 | 日韩高清 一区 | 色噜噜色噜噜 | 欧美aa在线 | 91av大全 | 激情综合网色播五月 | 国产亚州精品视频 | 天天射天天干天天操 | 国产精品一区二区三区久久久 | 成人在线视频网 | 国产一级二级在线 | 久久国语露脸国产精品电影 | av福利网址导航 | 中文av资源站 | 久久精品国产99 | 色资源中文字幕 | 999久久精品 | 欧美资源 | 日日碰狠狠添天天爽超碰97久久 | 亚洲精品国产视频 | 国产伦精品一区二区三区高清 | 国产在线不卡视频 | 久久精品老司机 | a黄色大片 | 亚洲成a人片77777潘金莲 | 免费久久片 | 日日噜噜噜噜夜夜爽亚洲精品 | 999在线精品 | 99久热在线精品 | 日韩视频免费在线观看 | 黄色影院在线播放 | 国产精品18久久久久久久 | 欧美作爱视频 | 久久婷婷一区二区三区 | www在线观看视频 | 黄网站免费大全入口 | 91久久精品日日躁夜夜躁国产 | 国产日产精品一区二区三区四区的观看方式 | 亚洲在线免费视频 | 色激情五月 | 91av在线免费观看 | 亚洲成人精品影院 | 久久精品伊人 | 伊人久久精品久久亚洲一区 | 国产色婷婷精品综合在线手机播放 | 国内精品在线一区 | 99一级片 | 亚州精品成人 | 国产香蕉视频在线观看 | 国产自在线| 五月婷婷在线观看 | 亚洲精品毛片一级91精品 | 国产日韩中文字幕在线 | 99国产在线视频 | 月下香电影 | 网站在线观看日韩 | 99热这里只有精品免费 | 国产在线视频一区二区三区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 久色网 | 天天操天天拍 | 99久久9| 手机色站| 亚洲激情小视频 | 狠狠色丁香婷婷综合基地 | 九九热视频在线 | 欧美综合在线视频 | 日韩一区二区免费在线观看 | 国产五月色婷婷六月丁香视频 | 亚洲精品国产麻豆 | 美女中文字幕 | 91看毛片 | 亚洲在线免费视频 | 国产精品嫩草影视久久久 | 黄色一集片| 最新高清无码专区 | 五月天视频网站 | 久久不射电影院 | 亚洲精品视频观看 | 久久国产日韩 | 99久久这里有精品 | 日韩在线免费视频观看 | 国产69精品久久app免费版 | 亚洲婷婷在线 | 中文字幕在线视频第一页 | 在线视频你懂 | 欧美看片 | 久久婷婷视频 | 特级西西人体444是什么意思 | 色999在线| 精品国产欧美一区二区三区不卡 | 亚洲精品在线观看网站 | a黄色 | 国内丰满少妇猛烈精品播 | 久久成人午夜视频 | 超碰在线97免费 | 狠狠干夜夜爽 | 天天做夜夜做 | 99精品国产在热久久下载 | 天堂网av 在线 | а天堂中文最新一区二区三区 | 亚洲成人av在线 | 免费看成人片 | 国产美女精品视频 | 国产美女在线观看 | 全久久久久久久久久久电影 | 精品视频免费久久久看 | 中文字幕在线观看的网站 | 日韩视频一区二区三区在线播放免费观看 | 豆豆色资源网xfplay | 九九热久久久 | 国产精品久久久久久久电影 | 黄色成人av | 久久精品欧美一 | 精品在线视频一区二区三区 | 国产无套精品久久久久久 | 久久97超碰 | 91伊人久久大香线蕉蜜芽人口 | 欧美aa一级 | 亚洲天天综合 | 国产精品久久久久免费 | 国产精品久久久久久五月尺 | 成人高清av在线 | 日日夜夜综合网 | 中字幕视频在线永久在线观看免费 | 五月婷婷婷婷婷 | 国产成人一区二区三区在线观看 | 在线播放视频一区 | 久久99影院 | 久久草网站 | 探花视频在线观看 | 久久av影院 | 国产一区精品在线观看 | 色.www| 天天射成人 | 亚洲 欧美变态 另类 综合 | 丁香视频五月 | 午夜99| 国产成人久久 | 不卡电影免费在线播放一区 | 亚洲国产美女精品久久久久∴ | 国产精品精品国产 | 国产剧情久久 | 欧美精品一级视频 | 热99在线视频 | 美女视频黄在线观看 | av在线电影网站 | 天天干天天干天天干 | 在线观影网站 | 国产精品免费不卡 | 五月激情丁香婷婷 | 99久久超碰中文字幕伊人 | 亚洲精品成人网 | 日本福利视频在线 | 中文字幕一区二区三区乱码在线 | 视频在线观看入口黄最新永久免费国产 | 日韩在线视频线视频免费网站 | 久久国产一区二区 | 欧美视频在线观看免费网址 | 国内丰满少妇猛烈精品播 | 国产午夜精品一区二区三区四区 | 国产精品21区 | 精品国产一区二区三区四区在线观看 | 国产精品人人做人人爽人人添 | 免费一级特黄毛大片 | 欧美国产日韩一区二区三区 | 久久国产一区 | 91精品麻豆 | 国产精品 美女 | 中文字幕有码在线观看 | 久热av在线 | 操操日日| 高潮久久久久久久久 | 夜色资源站wwwcom | 国产探花视频在线播放 | 国产精品不卡一区 | 午夜在线看片 | 日韩精品中文字幕在线观看 | 中文字幕资源网 国产 | 久久久国产影视 | 日本精品久久久一区二区三区 | 丁香六月久久综合狠狠色 | www.99av| av福利电影 | 视频在线99re | 国产精品精品久久久 | 日韩欧美视频在线 | 久久成人国产精品免费软件 | 国产亚洲人 | 麻豆一二 | x99av成人免费 | 久久一区91| 婷婷久月 | 天天色视频 | 日韩欧美v| 国产成人三级在线播放 | 在线观看亚洲成人 | 欧美日本国产在线观看 | 国产精品视频 | 国内精品久久久久 | 亚洲一级免费电影 | 欧美精品久久久久久久久老牛影院 | 精品国产一区二区三区四区在线观看 | 97超碰总站| 在线观看免费观看在线91 | 久久精品久久精品久久精品 | 中文字幕日韩电影 | 中文在线字幕免费观看 | 国产精品久久久久久久久久久免费 | 日韩理论在线 | 日韩欧美在线视频一区二区三区 | 波多野结衣一区 | 精品国产乱码久久久久 | 欧美日韩99| 久av在线 | 麻豆一二| 中文字幕在线看视频 | av看片在线 | www.99久久.com | 亚洲视屏在线播放 | 亚洲女同videos| 欧美日高清视频 | 日本二区三区在线 | 久久不卡国产精品一区二区 | 五月天久久 | 在线电影 一区 | 在线播放视频一区 | 国产精品无av码在线观看 | 福利视频导航网址 | 热久久免费国产视频 | 在线视频黄 | 色天天综合久久久久综合片 | 女人18精品一区二区三区 | 中文字幕日本电影 | 亚洲视频观看 | 亚洲国产午夜 | 天天爽天天搞 | 国产精品美女久久久久久久网站 | av电影在线免费观看 | 国产成人精品一区二区三区在线 | 午夜男人影院 | 五月婷婷在线观看 | 在线看片视频 | 久久香蕉一区 | 麻豆传媒视频在线免费观看 | 视频一区在线免费观看 | 97超碰影视 | 三级小视频在线观看 | 国产精品一区二区三区久久 | 五月婷亚洲| 国产日韩欧美在线观看视频 | 欧美一级性生活 | 91九色网址 | 亚洲国产精品成人女人久久 | 麻豆免费在线视频 | www色| 天天插天天操天天干 | 久久久久久久久久福利 | 亚洲专区欧美专区 | 少妇资源站 | 久久久久国产a免费观看rela | 久久久久久视频 | 久久久综合九色合综国产精品 | 日韩女同一区二区三区在线观看 | 国产高清久久久久 | 国产亚洲精品精品精品 | 婷婷丁香五 | 亚洲午夜精品久久久 | 日韩在线视频二区 | 爱射综合 | 激情伊人五月天久久综合 | 成人宗合网 | 香蕉在线视频观看 | 99久久久久 | 91最新在线视频 | 最新av网址在线 | 国产三级香港三韩国三级 | 热re99久久精品国产66热 | 美女视频黄在线 | av在线亚洲天堂 | 男女精品久久 | 夜夜爽夜夜操 | 久久特级毛片 | 日韩高清在线观看 | 国产精品久久久久久吹潮天美传媒 | 91热视频在线观看 | 国产精品一区二区精品视频免费看 | 精品国产一区二区三区蜜臀 | 午夜免费福利视频 | 涩五月婷婷 | 国产精品久久久精品 | 久久精品免费电影 | 精品欧美日韩 | 欧美一区二区三区免费观看 | 久久黄页| 国产精品涩涩屋www在线观看 | 亚洲精品三级 | 免费69视频 | 狠狠色丁香婷婷综合欧美 | 欧美激情精品 | 婷婷精品国产欧美精品亚洲人人爽 | 天天干天天干天天操 | 精品av网站 | 五月婷在线播放 | 免费一级片在线观看 | 色午夜影院 | 国产精品久久久久久久久久久久冷 | 一区二区三区中文字幕在线观看 | 91久久在线观看 | 一区二区三区在线播放 | 久久精品激情 | 国产视频18 | 欧美精品v国产精品v日韩精品 | 欧美日韩中文字幕综合视频 | 91精品老司机久久一区啪 | 成人小视频在线观看免费 | 91麻豆精品国产91久久久使用方法 | 成人国产精品一区 | 久草观看视频 | 免费av电影网站 | 久久国产精品99久久久久久丝袜 | 免费看一级黄色 | 国产精品国产精品 | 日韩欧美视频 | 亚洲精品视频 | 亚洲国产wwwccc36天堂 | 麻豆视屏| 欧美精品久久久久 | 亚洲欧美乱综合图片区小说区 | 欧美日一级片 | 国产91对白在线播 | 麻豆视频国产精品 | 日韩高清在线不卡 | 久久精品久久久精品美女 | 精品一区二区在线免费观看 | 久草在线视频国产 | 国产手机视频在线 | 日韩高清毛片 | 亚洲国产网址 | 成人中心免费视频 | 国产免费美女 | 在线精品视频免费观看 | 国产精品丝袜在线 | www.夜色.com | 亚洲国产无| 中文字幕在线观看1 | 国产美女精品在线 | 亚洲国产成人在线 | 91精品在线观看视频 | 亚洲va欧美va人人爽 | 国产在线理论片 | 日韩精品在线看 | 狠狠干夜夜操天天爽 | 久久免费99精品久久久久久 | 国产高清视频在线播放一区 | 亚洲aⅴ免费在线观看 | 欧美一级片在线 | 欧美最猛性xxx | 日韩网站一区 | 国产99久久久欧美黑人 | 天堂网在线视频 | 欧美成人a在线 | 精品久久久久久综合 | 国产精品视频99 | 欧美人人爱 | 国产视频在线播放 | 成人网页在线免费观看 | 日三级在线 | 日韩三级免费 | 日本黄色黄网站 | 中文字幕第 | 国产精品久久久久久久7电影 | 99久久精品国产一区二区成人 | 国产精选在线观看 | 99热 精品在线 | 亚洲欧洲国产日韩精品 | 久久在线免费观看视频 | 久久久久久久久久久久99 | 四虎免费av | 亚洲国产人午在线一二区 | 亚州成人av在线 | 一区二区三区日韩精品 | www.五月婷 | 日韩视频免费看 | 欧美天堂视频在线 | 黄视频色网站 | 首页中文字幕 | 国产成人精品一区二区三区在线 | 91久久精品一区 | 黄色小说在线观看视频 | 亚洲v欧美v国产v在线观看 | 91chinesexxx | 久久久精品一区二区三区 | 人人澡人摸人人添学生av | 丁香婷婷综合五月 | 国产视频一级 | 久久国产网| 韩国av免费在线 | 成人在线一区二区三区 | 日韩欧美精品在线 | www.狠狠| 美女久久视频 | 亚洲a色| 色午夜| 久久av在线播放 | 一本一道久久a久久精品蜜桃 | 免费高清在线视频一区· | 中文不卡视频在线 | 黄色一级免费 | 免费在线观看一级片 | 天天干com | 日韩成人一级大片 | 五月激情亚洲 | 96在线| 日b视频国产 | 91黄色免费看 | 视频一区二区国产 | 色干综合 | 人人网人人爽 | 婷婷新五月 | 久久久视频在线 | 中文字幕乱偷在线 | 国产伦精品一区二区三区四区视频 | 久久综合亚洲鲁鲁五月久久 | 香蕉精品在线观看 | 九九综合在线 | 欧美日韩国产一区二区三区 | 色姑娘综合天天 | 最新日韩在线观看视频 | 456免费视频 | 夜夜澡人模人人添人人看 | 手机av在线不卡 | 东方av免费在线观看 | 日韩欧美视频免费在线观看 | 亚洲国产中文字幕在线观看 | 亚洲成aⅴ人片久久青草影院 | 国产极品尤物在线 | 国产视频久久久 | www.av在线播放 | 免费网站v | 丁香六月欧美 | 人人狠狠综合久久亚洲婷 | 久久久国产精品视频 | 日韩精品久久久 | 99久久电影 | 午夜av不卡 | 日韩久久久久久久 | 久久综合久久综合久久 | 精品一区精品二区 | 在线免费观看视频一区二区三区 | 国产aaa大片 | www.午夜色.com| 国产福利小视频在线 | 国产精品观看 | 久久久高清视频 | 日韩黄色中文字幕 | 香蕉视频国产在线观看 | 国产直播av | av字幕在线 | 视频精品一区二区三区 | 97在线观看 | 免费看色网站 | av久久在线 | 久久这里只有精品久久 | av黄色一级片 | 婷婷天天色 | 国产亚洲精品bv在线观看 | 中文字幕在线观看免费高清电影 | 久久在线观看 | www.狠狠色| 亚洲国产精品传媒在线观看 | 日韩精品aaa | 最近中文字幕免费观看 | 九色porny真实丨国产18 | 91精品久久久久久 | 国产精品免费观看网站 | 黄色片免费看 | 激情综合啪啪 | 国产精品高清在线 | 国产视频导航 | 国产精品免费在线播放 | 成人久久国产 | 精品999在线观看 | 免费在线观看中文字幕 | 国产精品2019 | 在线观看第一页 | 国产一区二区三区高清播放 | 九九九热精品免费视频观看 | 日韩中文字幕亚洲一区二区va在线 | 成人精品亚洲 | 日本精品视频在线播放 | 亚洲人人爱 | 久久99国产精品自在自在app | 免费视频久久久久 | 国产91精品看黄网站 | 亚洲精品久久久久www | 亚洲综合视频在线 | 国产美女主播精品一区二区三区 | 丁香婷婷激情啪啪 | 国产精品久久久久一区 | 亚洲成人免费在线 | 久久久影院官网 | 黄av免费| 91精品免费视频 | 国产精品自拍在线 | 午夜av剧场 | 美女网站视频一区 | 久久综合狠狠综合久久激情 | 91av视频免费在线观看 | 不卡的av | 在线三级中文 | 精品国产一区二区三区不卡 | 99在线精品视频观看 | 日日夜夜天天 | 欧美精品三级在线观看 | 精精国产xxxx视频在线播放 | 最新av网址在线观看 | 伊人久久在线观看 | 欧美成人亚洲成人 | 视频在线观看一区 | 国产精品久久久久久久久久 | 午夜黄色一级片 | 99精品久久久久久久 | 天天射,天天干 | 精品亚洲免费视频 | 五月天色丁香 | 最新久久免费视频 | 亚洲第一成网站 | 色九九影院 | 欧美久久久久久久久久久久久 | www.亚洲精品 | 国产成视频在线观看 | 人人射人人爽 | 婷婷爱五月天 | 人成在线免费视频 | 超碰成人免费电影 | 黄色成人影视 | 国产精品久久久久久久久婷婷 | 成人黄在线 | 色综合久久中文综合久久牛 | 成人毛片在线观看视频 | 国产一级片毛片 | 色人久久| 手机成人免费视频 | 91精品久久久久久久久久入口 | 欧美日韩视频免费 | 99精品色| 色婷婷久久一区二区 | 久久综合久久综合九色 | 久久精品婷婷 | 国产午夜精品一区二区三区在线观看 | 99亚洲国产精品 | 美女av免费 | 婷婷日韩 | 黄色av成人在线观看 | 最新av免费在线观看 | 亚洲成a人片在线www | 激情电影在线观看 | 人人爽网站 | 精品在线观 | 欧美激情第28页 | 日韩视频在线观看免费 | 中文字幕一区二区三区在线视频 | 一级黄色片在线免费观看 | 少妇bbw撒尿 | 激情久久小说 | 日韩欧美在线观看 | 黄色91在线 | a√天堂中文在线 | 黄色特级片| 国产精品九色 | 久久久久久激情 | 激情五月在线 | 国产精品一区二区久久精品 | 91人人插| www.超碰| 亚洲精品国产精品国自 | 午夜精品一区二区三区可下载 | 久久99精品国产91久久来源 | 国产成人精品久久久久 | 91日韩在线播放 | 91av视频在线观看免费 | 欧美性受极品xxxx喷水 | 日日操网 | 最新中文字幕 | 亚洲毛片视频 | 欧美精品一二 | 国产高清综合 | 免费日韩一级片 | 亚洲精品在线观看不卡 | 婷婷丁香狠狠爱 | 亚洲成熟女人毛片在线 | 久久国内精品视频 | 精品一区欧美 | 91久久奴性调教 | 欧美巨大荫蒂茸毛毛人妖 | 成人综合日日夜夜 | 激情五月婷婷综合 | www一起操| 国产精品久久久久毛片大屁完整版 | 日韩欧美精品在线 | 精品在线一区二区 | 99在线免费视频 | 视频三区在线 | 国产福利精品在线观看 | 色久天| 色婷婷成人 | 国内一级片在线观看 | 欧美色综合天天久久综合精品 | 日韩在线免费视频 | 日日爱av| 麻豆高清免费国产一区 | 美女免费av| 亚洲一区久久 | 成人黄大片视频在线观看 | 国产精品18久久久久久不卡孕妇 | 51久久夜色精品国产麻豆 | 久久久久9999亚洲精品 | 久久久久久久久久久免费 | 99国产精品 | 亚洲在线精品视频 | 97视频在线 | 亚洲九九精品 | 成人在线免费看 | 天天色天天爱天天射综合 | 天天插视频 | 国产成视频在线观看 | 成人av资源| 欧亚日韩精品一区二区在线 | 成人av一二三区 | 你操综合 | 久久久久久久国产精品 | 久久久九色精品国产一区二区三区 | 在线观看免费国产小视频 | 美女久久一区 | 欧美日韩中文国产 | 色婷婷导航 | 国产视频一区精品 | 久久av高清 | 婷婷在线五月 | 久久久久久久电影 | 欧美一级免费 | 亚洲三级影院 | 久久免视频 | 日本黄网站| 在线观看日本韩国电影 | 久久免费a | 成人在线观看资源 | 色www精品视频在线观看 | 五月天久久狠狠 | 久久久久久久久久伊人 | 97人人添人澡人人爽超碰动图 | 免费观看v片在线观看 | 黄色在线免费观看网站 | 欧美一级xxxx | 日韩免费大片 | 亚洲精品乱码久久久久久蜜桃动漫 | 久久免费毛片视频 | 国产久草在线观看 | 91福利社在线观看 | 国产69精品久久久久久久久久 | 亚洲成人999 | 九色精品免费永久在线 | 右手影院亚洲欧美 | 欧美日韩久 | 久久er99热精品一区二区三区 | 久久精品国产一区二区电影 | 亚洲最新视频在线 | 日韩影视在线 | 黄色av网站在线观看免费 | 久亚洲| 国内精品久久久久久久久久 | 九九精品久久久 | 中文字幕国产一区二区 | 91夫妻视频 | 日韩丝袜 | 97超视频| av在线永久免费观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久草在线最新免费 | 日韩中文字幕视频在线观看 | 久久国产免费 | 99欧美精品 | 日韩av资源在线观看 | 玖玖在线播放 | 中文字幕黄色网址 | av黄色免费看| 制服丝袜亚洲 | 日夜夜精品视频 | 超碰精品在线观看 | 国产网站在线免费观看 | 91香蕉久久 | 精品一区二区电影 | 国产精品久久久久久久久久免费 | av国产在线观看 | 久久特级毛片 | 国产精品免费一区二区三区 | 欧美日韩亚洲第一 | 日韩一级片观看 | 亚洲欧美日韩国产一区二区三区 | 97夜夜澡人人爽人人免费 | 在线免费观看黄网站 | 色偷偷网站视频 | 欧美性爽爽 | 欧美性生爱 | 亚洲精品视频网址 | 黄色在线视频网址 | 色婷婷骚婷婷 | 久久婷五月 | 久久久www成人免费毛片麻豆 | 五月婷婷视频在线观看 | 91精品办公室少妇高潮对白 | 黄色软件视频大全免费下载 | 日韩av图片 | 日日日操 | 日韩精品久久久久久中文字幕8 | 美女视频一区 | 天天在线视频色 | 亚洲年轻女教师毛茸茸 | 国内精品久久久久影院一蜜桃 | 在线国产91| www九九热 | 国产日产精品久久久久快鸭 | 久久精品视频国产 | 中文字幕亚洲高清 | 视频一区二区免费 | 国产中文a | 欧美激情综合五月色丁香小说 | 精品国产乱码一区二区三区在线 | 日本精品久久 | 国产精品入口66mio女同 | 免费午夜av | 狠狠狠色丁香综合久久天下网 | 久久精品中文字幕少妇 | 成年人免费看片网站 | 日韩影片在线观看 | 亚洲精品 在线视频 | 成人丝袜| 欧洲精品久久久久毛片完整版 | www,黄视频 | 97视频免费看 | 伊人婷婷在线 | 99爱视频| 四虎最新入口 | 国产一级淫片免费看 | 黄色三级在线 | 福利视频一区二区 | 国产伦精品一区二区三区照片91 | 草久久精品 | av再线观看| 91色网址| 亚洲午夜久久久久久久久久久 | 欧美日韩一区二区三区在线观看视频 | 久久日本视频 | 中文字幕视频在线播放 | 99re6热在线精品视频 | 一区二区三区精品久久久 | 91视频免费网址 | 成人高清在线观看 | 欧美日韩高清在线 | 日日天天 | 久久精品99国产精品 | 91视频这里只有精品 | 色爱成人网 | 999国内精品永久免费视频 | 99 久久久久 | 香蕉久久久久久av成人 | 久久久久中文 | 一区二区三区观看 | 日韩精品免费在线视频 | 夜夜躁日日躁狠狠久久88av | 精品国产激情 | 久久久久久久久久久久国产精品 | 国产精品国产三级国产不产一地 | 欧美日韩二区在线 | 激情深爱.com| 日本精品一区二区三区在线观看 | 国产福利在线免费 | 久久夜靖品| 午夜精品区 | 久久99久久99精品 | 国产69精品久久app免费版 | 91精品国产综合久久福利不卡 | 国产在线观看国语版免费 | 成人免费观看大片 | 天天干,天天草 | 九九九九精品九九九九 | 天无日天天操天天干 | 国产精品 视频 | 亚洲国产精品va在线看黑人 | 中文字幕在线视频国产 | 手机在线日韩视频 | 成人wwwxxx视频| 超碰av在线免费观看 | 欧美一级在线观看视频 | 亚州成人av在线 | 色综合综合 | 亚洲精品2区| 天天操夜夜逼 | 国内视频1区 | 久久激情精品 | 免费一级日韩欧美性大片 | av免费电影在线观看 | 成人免费共享视频 | 成人免费ⅴa | a视频免费在线观看 | 伊人超碰在线 | 国产精品去看片 | 免费高清在线视频一区· | 色网免费观看 | 人人爽人人爱 | 亚洲精品国产第一综合99久久 | 亚洲免费观看视频 | www色婷婷com| 天堂在线一区 | 91看片在线 | 夜夜看av | 97视频在线观看视频免费视频 | 成在人线av| 91欧美在线 | 美女中文字幕 | 天天看天天干 | 六月丁香伊人 | 精品久久久久久国产 | 成 人 免费 黄 色 视频 | 天天激情 | 国产91粉嫩白浆在线观看 | 91精品小视频 | 欧美另类老妇 | 91精品啪| 91成人精品一区在线播放 | 国产一级免费av | 91av大全| 免费黄色在线播放 | 91成熟丰满女人少妇 | 一区二区三区 中文字幕 | 日韩欧美综合 | 黄色小说18 | 免费三级骚 | 国产最新视频在线观看 | 国产成免费视频 | 友田真希av | 国产色综合天天综合网 | 日日干天天插 | 日韩一区二区免费在线观看 | 国产999视频在线观看 | 91久久偷偷做嫩草影院 | av成人免费在线观看 | 欧美一级高清片 | 国产欧美在线一区 | 亚洲免费资源 | 久热色超碰 | avove黑丝 | 久久人人97超碰com | 亚洲免费av网站 | 欧美国产高清 | 中文字幕高清 | 午夜精品一二三区 | 欧美日韩久久久 | 精品福利视频在线 | 草久在线| 色诱亚洲精品久久久久久 | 免费高清在线视频一区· | 久久国语露脸国产精品电影 | 日韩欧美在线第一页 | 97色se| 夜夜视频欧洲 | 国产a级片免费观看 | 丁香六月在线观看 | 成人在线免费视频 | 激情欧美一区二区三区 | 四虎在线视频 | 国产精品免费人成网站 | 欧美一级性生活 | 日日爱网址 | 99精品久久只有精品 | 欧美日韩有码 | 久久久久国产一区二区三区 | 国产精品美女久久久久久久久久久 | 国产一区观看 | 在线成人中文字幕 |