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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GAMES101作业7-路径追踪实现过程代码框架超全解读

發布時間:2023/12/29 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GAMES101作业7-路径追踪实现过程代码框架超全解读 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

Path Tracing算法過程討論

蒙特卡洛積分

直接光照 direct illumination

間接光照 indirect illumination

?編輯

合成全局光照

解決一些存在的問題

問題1:光線爆炸

問題2:遞歸停止條件

問題3:目前算法并不高效

問題3解決方案:采樣光源Sample the light

Shadow:光源遮擋問題

Sample the Light過程偽代碼

Now path tracing is finally done!

框架修改內容詳細解讀

main.cpp

Renderer.cpp

Object.hpp?

getArea()

Sample()

get_random_float()

hasEmit()

Sphere.hpp

area

Sample()(目前沒搞明白這個函數怎么寫的)

getArea() & hasEmint()

Triangle()

BVH.hpp

BVH.cpp -> getSample()

Material.hpp

toWorld()

sample()

pdf()

eval()

補全castRay()

粘貼作業6代碼

粘貼需要注意的點

Bounds3.hpp -> IntersectP()

?Triangle.hpp -> getIntersection(Ray ray)

?BVH.hpp ->?getIntersection()

本次實驗給出的與框架匹配的偽代碼

簡單分析一些新出現的函數

Scene::sampleLight()

代碼具體實現過程

結果展示

spp=2

spp=4

spp=16

spp=30

spp=60

spp=256


Path Tracing算法過程討論

在正式寫castRay()之前,先讓我們一起理一下Path Tracing的思路。GAMES101課程上總結出了一個Render Equation渲染方程,而Path Tracing是一種求解渲染方程的方法。

兩個求解關鍵點

(1)需要解方程后面的積分;

(2)積分部分要用到遞歸。

首先解決第一個關鍵點——解積分

用什么方法計算積分呢?蒙特卡洛方法,下面簡單復習一下蒙特卡洛方法:

蒙特卡洛積分

蒙特卡洛方法告訴我們,當我們想求一個在[a,b]上的積分f(x)

任意取一個合理的pdf(概率密度函數)

只需要在積分域內以一定的pdf采樣,則這個積分可以近似成求f(x)在N個隨即變量下的均值:

需要注意的是:(1)如果只采樣一個,即N==1,相差就會很大,因此采樣越多(N越大),結果越接近;(2)在x上積分,就必須采樣x。

接下來開始用蒙特卡洛方法求解積分。暫時忽略物體自發光(emission)部分,要用蒙特卡羅方法,就需要選取一個合適的pdf。我們知道,渲染方程是定義在半球內對立體角的積分,半球面積為2Π,采用均勻采樣的方法,則pdf為:

要把光照分為直接光照和間接光照來討論:

直接光照 direct illumination

考慮光路直接從光源發出,就能得到直接光照的結果,得到偽代碼:

void shade(p, wo) {//隨機生成N個方向的wi并以pdf(wi)分布L0 = 0.0;//對每條wiFor each wi{//向wi方向追蹤一條射線ray r(p,wi)Trace a ray r(p,wi)//如果射線擊中光源(相交)If ray r hit the light//寫出求和式L0 += (1 / N) * L_i * f_r * cosine / pdf(wi)}return L0; }

直接光照考慮完了之后,接下來要看間接光照,關于直接光照和間接光照內容可以參考:GAMES101作業5-從頭到尾理解代碼&Whitted光線追蹤_flashinggg的博客-CSDN博客

間接光照 indirect illumination

如圖所示,開始求光線擊中物體的情況。從上圖看,可以看作從P點觀察Q點,把Q點當作直接光照,這就跟之前的聯系起來了,就可以在直接光照偽代碼的基礎上加上:

//射線擊中物體上的p點(射線r與q相交) Else if ray r hit an object at q L0 += (1 / N) * shade(q,-wi) * f_r * cosine / pdf(wi)

合成全局光照

加上后,就得到一個遞歸的、支持全局光照的偽代碼:

void shade(p, wo) {//隨機生成N個方向的wi并以pdf(wi)分布L0 = 0.0;//對每條wiFor each wi{//向wi方向追蹤一條射線ray r(p,wi)Trace a ray r(p,wi)//如果射線擊中光源(相交)If ray r hit the light//寫出求和式L0 += (1 / N) * L_i * f_r * cosine / pdf(wi)//射線擊中物體上的p點(射線r與q相交)Else if ray r hit an object at qL0 += (1 / N) * shade(q,-wi) * f_r * cosine / pdf(wi)}return L0; }

但我們的問題還未完全解決!

解決一些存在的問題

問題1:光線爆炸

由于加入了遞歸,導致發出的光線數量呈指數增長!計算量將爆炸!很明顯,只有N==1的時候,才能解決這個問題,偽代碼將修改成這樣:

void shade(p, wo) {//隨機選取1個方向的wi并以pdf(wi)分布L0 = 0.0;//向該方向追蹤一條射線ray r(p,wi)Trace a ray r(p,wi)//如果射線擊中光源(相交)If ray r hit the light//寫出求和式Return L_i * f_r * cosine / pdf(wi)//射線擊中物體上的p點(射線r與q相交)Else if ray r hit an object at qReturn shade(q,-wi) * f_r * cosine / pdf(wi) }

由此,N==1,就是我們做的Path Tracing路徑追蹤。

上述N==1的方法雖然解決了光線爆炸問題,但又有了新問題:樣本數量下降,結果生成的畫面噪點會變得非常多。

針對這個問題,我們可以發出多條路徑穿過像素,再將這么多路徑的著色結果求均值即可。

void ray_generation(camPos, pixel) {//在像素上均勻地選取N個樣本位置pixel_radiance = 0.0;//對于每個樣本位置For each sample in the pixel//發射一條射線r(CamPos, cam_to_sample)shoot a ray r(CamPos, cam_to_sample)//射線r與場景相交與點pIF ray r hit the scene at ppixel_radiance += 1 / N * shade(p, sample_to_cam)return pixel_radiance; }

問題2:遞歸停止條件

我們都知道遞歸實現有兩個條件:①問題得到轉移;②遞歸要能停。第一個點剛才已經解決了,現在是要找到能停止遞歸的條件。

解決方法1:限制彈射遞歸的深度

也就是限制光線的彈射次數,這個方法意味著能量的削減,能量就不守恒了。

解決方法2:俄羅斯輪盤賭

以一定的概率停止繼續追蹤,想要實現追蹤停止又不改變得到的結果Lo:

(1)以一定的概率P(0<P<1)發射光線 -> return Lo/P;

(2)以概率1-P不發射光線 -> return 0.

可以計算這種方式的期望值E,會發現以這種方式得到的結果還會是Lo,但無限遞歸的概率就收斂到0了。

展示成偽代碼:

void shade(p, wo) {//以某種方法確定一個概率P_RR// 隨機選取一個隨機數ksi∈[0,1]// if(ksi>P_RR) reutn 0;// ksi<P_RR的情況就正常發射光線,然后結果需要/P_RR//隨機選取1個方向的wi并以pdf(wi)分布L0 = 0.0;//向該方向追蹤一條射線ray r(p,wi)Trace a ray r(p, wi)//如果射線擊中光源(相交)If ray r hit the light//寫出求和式,這是需要/PReturn L_i * f_r * cosine / pdf(wi) / P_RR//射線擊中物體上的p點(射線r與q相交)Else if ray r hit an object at qReturn shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR }

到此為止,Path Tracing就完成了,但其實還有問題:

這個算法并不高效!It's not efficient!

問題3:目前算法并不高效

Why?

從上圖可以看出,現在這種從著色點向外出射光線的采樣方法,打中光源的概率完全看運氣,光源面積大概率就大;光源面積小概率就小,由此可見這種方法并不高效。

需要找到另一種更高效的采樣方法——采樣光源 Sample the Light

問題3解決方案:采樣光源Sample the light

首先要明確一點,我們為什么能改變采樣方法?因為:蒙特卡洛方法并沒有規定pdf的選取,我們可以選擇任意一個合適的pdf進行采樣!以此來大大減少光線的浪費,此時采樣對象就從半球立體角dw轉換到了光源表面的微面元dA

那么隨之而來又有新的問題,在之前講蒙特卡洛方法就提到了其中一個注意點:在x上積分,就必須采樣x因此,我們需要利用數學的方法,將積分對象從dw轉變到dA.

做一個變量替換,我們的渲染方程就變成了:

基于此,之前的算法依照全局光照的貢獻對象可以分為兩個部分:

(1)光照來自于光源 - 直接光照 不用輪盤賭

(2)其他非光源 - 間接,需要輪盤賭

Shadow:光源遮擋問題

這個好說,直接在進行直接光照計算前判斷是否被遮擋即可。

就得到了Sample the light的偽代碼:

Sample the Light過程偽代碼

shade (p, wo)//直接光照//在光源上均勻選擇一個采樣點x',以pdf_light分布Uniformly sample the light at x' ( pdf_light = 1 / A)//首先判斷光源是否被遮擋:發射一條連接物體p和x'的射線Shoot a ray from p to x'//如果射線不被遮擋,則計算直接光照:If the ray is not blocked in the middleL_dir = L_i * f_r * cos_theta * cos_theta' / |x'-p|^2 / pdf_light//間接光照L_indir = 0.0//以某種方法確定一個概率P_RR(0<P_RR<1)Test Russian Roulette with probability P_RR//在均勻分布在[0,1]上的樣本中隨機選取一個值ksiIf ksi>P_RRReturn L_dir;//半球上隨機生成一個方向wi,以pdf=1/2Π分布Uniformly sample the hemisphere toward wi ( pdf_hemi = 1 / 2pi)Trace a ray r(p, wi)//如果射線r擊中一個不自發光的物體(非光源)If ray r hit a non - emitting object at q L_indir = shade (q, -wi) * f_r * cos_theta / pdf_hemi / P_RRReturn L_dir + L_indir

Now path tracing is finally done!

把整個Path Tracing的過程學習清楚之后,已經可以開始完成作業了。但是我為了了解清楚整個代碼框架每個部分是什么含義,會先把作業6和這次作業給的框架進行對比,學習并了解新增的內容都有哪些,再進行Path Tracing部分。

框架修改內容詳細解讀

讓我們來看看都是什么地方做了改動

main.cpp

新增:定義了一些材質。

//與作業6多了部分:定義了材質(顏色)Material* red = new Material(DIFFUSE, Vector3f(0.0f));red->Kd = Vector3f(0.63f, 0.065f, 0.05f);Material* green = new Material(DIFFUSE, Vector3f(0.0f));green->Kd = Vector3f(0.14f, 0.45f, 0.091f);Material* white = new Material(DIFFUSE, Vector3f(0.0f));white->Kd = Vector3f(0.725f, 0.71f, 0.68f);Material* light = new Material(DIFFUSE, (8.0f * Vector3f(0.747f+0.058f, 0.747f+0.258f, 0.747f) + 15.6f * Vector3f(0.740f+0.287f,0.740f+0.160f,0.740f) + 18.4f *Vector3f(0.737f+0.642f,0.737f+0.159f,0.737f)));light->Kd = Vector3f(0.65f);

在作業6中并沒有給模型賦予材質,而是直接給了光照,可以看到兔子是黑白的

Renderer.cpp

... //出現了與作業6不同的點:加了整型變量spp// games101里老師提到過:“path tracing其中一個問題就是:并不高效,low spp->它的// spp(sample per pixel)很低,光線會被浪費”// 這里的spp就是指每個pixel會采樣的次數// change the spp value to change sample ammountint spp = 16;std::cout << "SPP: " << spp << "\n";for (uint32_t j = 0; j < scene.height; ++j) {for (uint32_t i = 0; i < scene.width; ++i) {// generate primary ray directionfloat x = (2 * (i + 0.5) / (float)scene.width - 1) *imageAspectRatio * scale;float y = (1 - 2 * (j + 0.5) / (float)scene.height) * scale;//這里的dir方向跟我作業6取的不一樣,作業6里是(x,y,-1)Vector3f dir = normalize(Vector3f(-x, y, 1));//與作業6不同:每個pixel分成了spp次采樣for (int k = 0; k < spp; k++){framebuffer[m] += scene.castRay(Ray(eye_pos, dir), 0) / spp; }m++;} ...

其實這么看來,Whitted-Style Ray Tracing就相當于Path?Tracing中spp==1的情況?(不是很確定這么說是否正確)

Object.hpp?

... //與6相比加了新的屬性:area,以實現對光源按面積采樣virtual float getArea()=0;//與6相比加了新屬性:sameplevirtual void Sample(Intersection &pos, float &pdf)=0;virtual bool hasEmit()=0; ...

具體涉及到的函數:

getArea()

//在Triangle.hpp & Sphere.hpp 里都有用到 float getArea(){return area; }

Sample()

這個函數將會在Scene.cpp?->?sampleLight()光源采樣接口函數中用到。

//class MeshTriangle里:void Sample(Intersection &pos, float &pdf){bvh->Sample(pos, pdf);pos.emit = m->getEmission();}//class Sphere:void Sample(Intersection &pos, float &pdf){float theta = 2.0 * M_PI * get_random_float(), phi = M_PI * get_random_float();Vector3f dir(std::cos(phi), std::sin(phi)*std::cos(theta), std::sin(phi)*std::sin(theta));pos.coords = center + radius * dir;pos.normal = dir;pos.emit = m->getEmission();pdf = 1.0f / area;}//class Triangle:void Sample(Intersection &pos, float &pdf){float x = std::sqrt(get_random_float()), y = get_random_float();pos.coords = v0 * (1.0f - x) + v1 * (x * (1.0f - y)) + v2 * (x * y);pos.normal = this->normal;pdf = 1.0f / area;}

get_random_float()

gloal.hpp中定義的一個隨機從范圍[0,1]取浮點數的函數:

//得到范圍為[0.1]的浮點數 inline float get_random_float() {std::random_device dev;std::mt19937 rng(dev());std::uniform_real_distribution<float> dist(0.f, 1.f); // distribution in range [0,1]return dist(rng); }

值得注意的是!?

感謝解決了隨機數的取值問題:Games101 作業7 路徑追蹤_gong_zi_shu的博客-CSDN博客

其中提到window系統跑這份代碼的同學,需要修改global.cpp 中的get_random_float()函數,不然你的這個"隨機函數"每次都是跑出來相同的結果,修改后能顯著提高效率,改為:

inline float get_random_float() {static std::random_device dev;static std::mt19937 rng(dev());static std::uniform_real_distribution<float> dist(0.f, 1.f); // distribution in range [0,1]return dist(rng); }

經過實踐這個函數確實能顯著提高效率!后續會出一片作業7加速渲染的優化方法匯總,展示前后對比。

hasEmit()

//均相同,是:bool hasEmit(){return m->hasEmission();} //m:Material* m; //hasEmission() 是 class Material 定義的一個bool Material::hasEmission() {if (m_emission.norm() > EPSILON) return true;else return false;}

hasEmission()

?Material.hpp中定義的一bool類型:

bool Material::hasEmission() {if (m_emission.norm() > EPSILON) return true;//e_emission有長度,即它存在else return false; }

Sphere.hpp

與作業6相比:多了一個 area屬性 和一個 Sample()函數

area

... //與作業6相比多了一個areafloat area;...bool intersect(const Ray& ray) {...//整個球面積=4Πr2float area = 4 * M_PI * radius2;...} ...

Sample()(目前沒搞明白這個函數怎么寫的)

對光源采樣,在上面的Object.hpp已經體現過了,這里貼一個課上老師將Sampling the light的截圖幫助理解,可以結合我對代碼的注釋具體理解這個函數:

//將光源進行按面采樣,隨機從光源發射一條ray打到場景中的sphere上得到某個交點void Sample(Intersection &pos, float &pdf){//theta(θ)∈[0,2Π],控制著// // //phi(φ)∈[0,Π]float theta = 2.0 * M_PI * get_random_float(), phi = M_PI * get_random_float();//dir -> {cosφ,sinφ*cosθ,sinφ*sinθ}Vector3f dir(std::cos(phi), std::sin(phi)*std::cos(theta), std::sin(phi)*std::sin(theta));pos.coords = center + radius * dir;//O+dir*rpos.normal = dir;pos.emit = m->getEmission();pdf = 1.0f / area;//}

getArea() & hasEmint()

Object.hpp已有提及:

...float getArea(){return area;}bool hasEmit(){return m->hasEmission();} ...

Triangle()

與Sphere.hpp相同,給Triangle和MeshTriangle類也是加上了Area和Sample()

class Triangle : public Object { ...//三角形面積area = crossProduct(e1, e2).norm()*0.5f; ...void Sample(Intersection &pos, float &pdf){float x = std::sqrt(get_random_float()), y = get_random_float();pos.coords = v0 * (1.0f - x) + v1 * (x * (1.0f - y)) + v2 * (x * y);pos.normal = this->normal;pdf = 1.0f / area;}float getArea(){return area;}bool hasEmit(){return m->hasEmission();} };...class MeshTriangle : public Object { ...area = 0; ...void Sample(Intersection &pos, float &pdf){bvh->Sample(pos, pdf);pos.emit = m->getEmission();}float getArea(){return area;}bool hasEmit(){return m->hasEmission();} };

BVH.hpp

定義的BVH類中加上了getSample()Sample()函數。

... void getSample(BVHBuildNode* node, float p, Intersection &pos, float &pdf);void Sample(Intersection &pos, float &pdf); ...

BVH.cpp -> getSample()

void BVHAccel::getSample(BVHBuildNode* node, float p, Intersection &pos, float &pdf){if(node->left == nullptr || node->right == nullptr){node->object->Sample(pos, pdf);pdf *= node->area;return;}if(p < node->left->area) getSample(node->left, p, pos, pdf);else getSample(node->right, p - node->left->area, pos, pdf); }

Material.hpp

實現了smple,eval,pdf三個方法用于Path Tracing變量的輔助計算,我們把這部分代碼從頭到尾看一遍:

首先枚舉定義了一個材料類型漫反射材質,這次作業好像也只有這一個材質類型;

enum MaterialType { DIFFUSE};

接下來定義了一個類Material;

class Material{ private:...public:...};

(2)private里首先定義三個向量分別代表:反射射線方向、折射射線方向和菲涅爾方程項,都與作業5類似,就不過多贅述,具體可以去看看我寫的那篇:GAMES101作業5-從頭到尾理解代碼&Whitted光線追蹤_flashinggg的博客-CSDN博客

... Vector3f reflect(const Vector3f &I, const Vector3f &N) const{return I - 2 * dotProduct(I, N) * N;}//折射射線方向,與作業5相同Vector3f refract(const Vector3f &I, const Vector3f &N, const float &ior) const{...}//菲涅爾方程,與作業5相同void fresnel(const Vector3f &I, const Vector3f &N, const float &ior, float &kr) const{...} ...

toWorld()

接著加了一個作業5中沒有的向量toWorld,作用是將localray的半球坐標(局部)變換成世界坐標.,具體過程可以參考我的代碼注釋:

...// 半球坐標 -> 世界坐標// 半球上的坐標是局部坐標系下的a,認為法向量是N方向上的(0,0,1),所以需要轉換// 其中局部坐標系下:a.x,a.y,a.z在的三個方向相互垂直,其中a.z的方向就是N的方向// 步驟:// 1.假定有B,C兩個單位向量,B,C由N得出,B,C,N兩兩垂直,且B,C,N都是單位向量// 2.讓a.x,a.y,a.z的值分別去乘B,C,N ->沿著B,C,N三個方向按照對應值的比例放大// 3.再將得到的三個向量相加,就能在世界坐標中出表示出原始的aVector3f toWorld(const Vector3f &a, const Vector3f &N){//假定B,CVector3f B, C;//這里的條件判斷,應該是為了避免出現分母為0的情況if (std::fabs(N.x) > std::fabs(N.y)){//至少在x軸上有分量float invLen = 1.0f / std::sqrt(N.x * N.x + N.z * N.z);//我們就不管y軸的事(已知x一定有值)//保證以下兩點:1.用x,z的數表示出一個單位向量;2.且要與N垂直C = Vector3f(N.z * invLen, 0.0f, -N.x *invLen);}//這里同理,只不過用的是y,z的數表示了else {float invLen = 1.0f / std::sqrt(N.y * N.y + N.z * N.z);C = Vector3f(0.0f, N.z * invLen, -N.y *invLen);}//按照步驟1,C,N做叉乘得到與C,N都垂直的單位向量BB = crossProduct(C, N);//進行步驟2,分別相乘,再加在一起(步驟3)return a.x * B + a.y * C + a.z * N;} ...

至于半球坐標的計算sample()在后面會將到,我們繼續順著代碼看,下面是public,我做了一些簡單的小注釋幫助理解代碼。

... public:MaterialType m_type;//材質類型,只給了一個枚舉項:diffuse//Vector3f m_color;Vector3f m_emission;//材質自發光float ior;//材質的折射率Vector3f Kd, Ks;//漫反射和高光項float specularExponent;//高光項指數//Texture tex;inline Material(MaterialType t=DIFFUSE, Vector3f e=Vector3f(0,0,0));//這里e_type=diffuse, e_emission=einline MaterialType getType();//return m_type//inline Vector3f getColor();inline Vector3f getColorAt(double u, double v);//返回當下的vector3f?inline Vector3f getEmission();//return m_emissioninline bool hasEmission();//判斷是否有emission//光線擊中某點后,繼續隨即彈射的方向inline Vector3f sample(const Vector3f &wi, const Vector3f &N);//計算該光線的pdf(概率密度函數probability density function,描述連續隨機變量的概率分布)inline float pdf(const Vector3f &wi, const Vector3f &wo, const Vector3f &N);//計算光線的貢獻inline Vector3f eval(const Vector3f &wi, const Vector3f &wo, const Vector3f &N); ...

sample()

下面是class里定義涉及到的一些函數,其中sample()用于采樣光線擊中某點后繼續隨機彈射的方向:——

//采樣光線擊中某點后繼續隨機彈射的方向 Vector3f Material::sample(const Vector3f &wi, const Vector3f &N){switch(m_type){case DIFFUSE:{// 均勻地對半球采樣//半球z軸值z∈[0,1]// r -> 以法線為旋轉軸的半徑,x2+y2+z2=1,r2=x2+y2//phi∈[0,2Π],旋轉角度float x_1 = get_random_float(), x_2 = get_random_float();//隨機[0,1]取值float z = std::fabs(1.0f - 2.0f * x_1);//不是很理解為什么不直接取[0,1]隨機數float r = std::sqrt(1.0f - z * z), phi = 2 * M_PI * x_2;Vector3f localRay(r*std::cos(phi), r*std::sin(phi), z);//半球面上隨機光線的方向//接著需要把半球上的局部光線坐標轉換成世界坐標return toWorld(localRay, N);break;}} }

pdf()

概率密度函數的計算,可以來回顧一下pdf的定義,幫助更好的理解代碼:

PDF

參考:03.隨機變量和3F(PDF、CDF、PMF) - 知乎 (zhihu.com)

概率密度函數(probability density function),用來描述連續隨機變量的概率分布,連續型隨機變量的概率密度函數是一個描述某個確定的取值點附近的可能性的函數。

例如:正態分布的PDF:

計算ray的PDF:

如上圖:課程里老師給出了一個簡單的采樣方法——均勻地采樣

pdf就是個常數,整個半球面對應的Solid angle:,均勻的采樣pdf就是:

//計算概率密度函數pdf float Material::pdf(const Vector3f &wi, const Vector3f &wo, const Vector3f &N){switch(m_type){case DIFFUSE://材質{//均勻采樣,則pdf為常數1/2Πif (dotProduct(wo, N) > 0.0f)return 0.5f / M_PI;elsereturn 0.0f;break;}} }

eval()

計算某個材質對光照的貢獻,本作業用漫反射系數kd來體現:

//計算材質貢獻 Vector3f Material::eval(const Vector3f &wi, const Vector3f &wo, const Vector3f &N){switch(m_type){case DIFFUSE:{//計算DIFFUSE貢獻 -> kd float cosalpha = dotProduct(N, wo);//只看半球,另一半不看,所以要判斷一下wo和N的夾角if (cosalpha > 0.0f) {Vector3f diffuse = Kd / M_PI;return diffuse;}elsereturn Vector3f(0.0f);break;}} }

Material.hpp到這里就結束了。

補全castRay()

粘貼作業6代碼

粘貼需要注意的點

代碼其他的部分直接粘貼作業6的內容,直接粘貼就好但有兩點值得注意:

(1)Intersectp()函數注意取等號問題:

... return tenter <= texit&& texit >= 0; ...

原因在games101學習平臺有大神給了解釋:Games101 作業7 繞坑引路 (Windows) – 計算機圖形學與混合現實在線平臺 (games-cn.org)

(2)為了大幅度縮短渲染時長,建議在運行代碼前修改get_random_float()函數,這點在上面的代碼注釋中已有提到,這里就只展示修改后的:

inline float get_random_float() {static std::random_device dev;static std::mt19937 rng(dev());static std::uniform_real_distribution<float> dist(0.f, 1.f); // distribution in range [0,1]return dist(rng); }

Bounds3.hpp -> IntersectP()

inline bool Bounds3::IntersectP(const Ray& ray, const Vector3f& invDir,const std::array<int, 3>& dirIsNeg) const {Vector3f tmin = (pMin - ray.origin) * invDir;Vector3f tmax = (pMax - ray.origin) * invDir;if (dirIsNeg[0])std::swap(tmin.x, tmax.x);if (dirIsNeg[1])std::swap(tmin.y, tmax.y);if (dirIsNeg[2])std::swap(tmin.z, tmax.z);float texit = std::min(tmax.x, std::min(tmax.y, tmax.z));float tenter = std::max(tmin.x, std::max(tmin.y, tmin.z));return tenter <= texit&& texit >= 0; }

?Triangle.hpp -> getIntersection(Ray ray)

inline Bounds3 Triangle::getBounds() { return Union(Bounds3(v0, v1), v2); }inline Intersection Triangle::getIntersection(Ray ray) {Intersection inter;if (dotProduct(ray.direction, normal) > 0)return inter;double u, v, t_tmp = 0;Vector3f pvec = crossProduct(ray.direction, e2);double det = dotProduct(e1, pvec);if (fabs(det) < EPSILON)return inter;double det_inv = 1. / det;Vector3f tvec = ray.origin - v0;u = dotProduct(tvec, pvec) * det_inv;if (u < 0 || u > 1)return inter;Vector3f qvec = crossProduct(tvec, e1);v = dotProduct(ray.direction, qvec) * det_inv;if (v < 0 || u + v > 1)return inter;t_tmp = dotProduct(e2, qvec) * det_inv;if (t_tmp < 0)//t>0 ray是射線return inter;// TODO find ray triangle intersection//給inter所有參數賦予值inter.happened = true;//有交點inter.coords = ray(t_tmp);//vector3f operator()(double t){return origin+dir*t};inter.normal = normal;//法向量inter.distance = t_tmp;//double distanceinter.obj = this;//this是所有成員函數的隱藏函數,一個const指針,指向當前對象(正在使用的對象)inter.m = m;//class 材質 mreturn inter; }

?BVH.hpp ->?getIntersection()

Intersection BVHAccel::getIntersection(BVHBuildNode* node, const Ray& ray) const {Intersection res;std::array<int, 3>dirIsNeg = { int(ray.direction.x<0), int(ray.direction.y<0), int(ray.direction.z<0) };//無交點if (!node->bounds.IntersectP(ray, ray.direction_inv, dirIsNeg)) {return res;}//有交點//無子節點if (node->left == nullptr && node->right == nullptr) {res = node->object->getIntersection(ray);return res;}//有子節點 ->遞歸Intersection left, right;left = getIntersection(node->left, ray);right = getIntersection(node->right, ray);return left.distance < right.distance ? left : right; }

下面參考作業給出的偽代碼補全castRay()。

本次實驗給出的與框架匹配的偽代碼

shade (p, wo)sampleLight ( inter , pdf_light )Get x, ws , NN , emit from interShoot a ray from p to xIf the ray is not blocked in the middleL_dir = emit * eval(wo , ws , N) * dot(ws , N) * dot(ws , NN) / |x-p|^2 / pdf_lightL_indir = 0.0Test Russian Roulette with probability RussianRoulettewi = sample (wo , N)Trace a ray r(p, wi)If ray r hit a non - emitting object at qL_indir = shade (q, -wi) * eval (wo , wi , N) * dot(wi , N) / pdf(wo , wi , N) / RussianRouletteReturn L_dir + L_indir

簡單分析一些新出現的函數

Scene::sampleLight()

偽代碼第一步是sampleLight()函數,這個函數在Scene.cpp中定義的,是實現采樣光源的接口。

//實現了采樣光源的接口 //對場景中的光源進行隨機采樣,以pdf進行 void Scene::sampleLight(Intersection& pos, float& pdf) const {float emit_area_sum = 0;for (uint32_t k = 0; k < objects.size(); ++k) {if (objects[k]->hasEmit()) {//第k個物體有自發光,hasEmit ->bool量emit_area_sum += objects[k]->getArea();//得到場景中自發光區域的面積和,用以后續求pdf=1/area}}//對場景中的所有光源按面積均勻采樣一個點,計算float p = get_random_float() * emit_area_sum;//隨機取[0, emit_area_sum]之間的浮點數emit_area_sum = 0;for (uint32_t k = 0; k < objects.size(); ++k) {if (objects[k]->hasEmit()) {emit_area_sum += objects[k]->getArea();if (p <= emit_area_sum) {//隨機選取一個光源面,即第k個自發光物體的光源面//利用Sample()在光源面中按照pdf的概率隨即找到一個點pos,得到這個點pos的信息objects[k]->Sample(pos, pdf);break;}}} }

代碼具體實現過程

步驟我已經盡可能的在注釋寫的很詳細了,直接看代碼:

// Implementation of Path Tracing Vector3f Scene::castRay(const Ray& ray, int depth) const {//創建變量以儲存直接和間接光照計算值Vector3f dir = { 0.0,0.0,0.0 };Vector3f indir = { 0.0,0.0,0.0 };//1.判斷是否有交點:光線與場景中物體相交?Intersection inter = Scene::intersect(ray);//如果沒交點if (!inter.happened) {return dir;//return 0,0,0}//2.ray打到光源了:說明渲染方程只用算前面的自發光項,因此直接返回材質的自發光項if (inter.m->hasEmission()) {if (depth == 0) {//第一次打到光return inter.m->getEmission();}else return dir;//彈射打到光,直接返回0,0.0}//3.ray打到物體:這個時候才開始進行偽代碼后面的步驟//對場景中的光源進行采樣,得到采樣點light_pos和pdf_lightIntersection light_pos;float pdf_light = 0.0f;sampleLight(light_pos, pdf_light);//3.1計算直接光照//物體的一些參數Vector3f p = inter.coords;Vector3f N = inter.normal.normalized();Vector3f wo = ray.direction;//物體指向場景//光源的一些參數Vector3f xx = light_pos.coords;Vector3f NN = light_pos.normal.normalized();Vector3f ws = (p - xx).normalized();//光源指向物體float dis = (p - xx).norm();//二者距離float dis2 = dotProduct((p - xx), (p - xx));//判斷光源與物體間是否有遮擋://發出一條射線,方向為ws 光源xx -> 物體pRay light_to_obj(xx, ws);//Ray(orig,dir)Intersection light_to_scene = Scene::intersect(light_to_obj);//假如dis>light_to_scene.distance就說明有遮擋,那么反著給條件即可:if (light_to_scene.happened&& (light_to_scene.distance-dis>-EPSILON)) {//沒有遮擋//為了更貼近偽代碼,先設定一些參數Vector3f L_i = light_pos.emit;//光強Vector3f f_r = inter.m->eval(wo, -ws, N);//材質,課上說了,BRDF==材質,ws不參與計算float cos_theta = dotProduct(-ws, N);//物體夾角float cos_theta_l = dotProduct(ws, NN);//光源夾角dir = L_i * f_r * cos_theta * cos_theta_l / dis2 / pdf_light;}//3.2間接光照//俄羅斯輪盤賭//Scene.hpp中已經定義了P_RR:RussianRoulette=0.8float ksi = get_random_float();//隨機取[0,1]if (ksi < RussianRoulette) {//計算間接光照//隨機生成一個wi方向Vector3f wi = inter.m->sample(wo, N).normalized();//這里的wi其實沒參與計算,返回的是一個隨機的方向Ray r(p, wi);Intersection obj_to_scene = Scene::intersect(r);//擊中了物體&&物體不是光源if (obj_to_scene.happened && !obj_to_scene.m->hasEmission()) {Vector3f f_r = inter.m->eval(wo, wi, N);//wo不參與計算float cos_theta = dotProduct(wi, N);float pdf_hemi = inter.m->pdf(wo, wi, N);indir = castRay(r, depth + 1) * f_r * cos_theta / pdf_hemi / RussianRoulette;}}return dir + indir; }

結果展示

spp=2

spp=4

spp=16

spp=256


?

感謝耐心看到這里的人~

總結

以上是生活随笔為你收集整理的GAMES101作业7-路径追踪实现过程代码框架超全解读的全部內容,希望文章能夠幫你解決所遇到的問題。

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

人人澡澡人人 | 午夜精品一区二区三区视频免费看 | 婷婷色网站 | 欧美日韩99| 天天做天天爱天天爽综合网 | 亚洲精品视频 | 在线91av| 日批在线看| 一区二区三区在线观看免费视频 | 成人免费看片98欧美 | 特级a毛片 | 五月天色丁香 | 亚洲激色 | 日韩高清不卡一区二区三区 | 久久艹综合| 丁香激情婷婷 | 91视频国产免费 | 五月天丁香综合 | 五月天久久激情 | 久久亚洲免费视频 | 午夜精品福利一区二区 | 丁香婷婷综合五月 | 一区三区视频 | 欧美91片| 国产精品1024 | 欧美一区二区三区在线观看 | 日韩免费网址 | 天天色成人| 91视频免费国产 | 久久亚洲国产精品 | 国产伦理久久精品久久久久_ | 天天干,天天射,天天操,天天摸 | 中文字幕精品一区二区三区电影 | 精品中文字幕视频 | 国产精品视频永久免费播放 | 91精品成人久久 | 日本h在线播放 | 人人插人人 | 亚洲第一中文网 | 久久国产精品免费一区二区三区 | 夜添久久精品亚洲国产精品 | 亚洲黄色成人网 | 久久久久久欧美二区电影网 | 欧美夫妻性生活电影 | 天天射天天舔天天干 | 天天插日日插 | 亚洲激情六月 | 亚洲综合色视频在线观看 | 国产91精品久久久久 | 欧美激情另类文学 | 黄色小说视频网站 | 天天操夜操 | 欧美最猛性xxxx | 色欲综合视频天天天 | 色综合天天做天天爱 | 主播av在线 | 国产精品a久久久久 | 久久综合操 | 91av九色| 久久久久亚洲最大xxxx | 8x成人在线 | 日韩视频中文字幕在线观看 | 欧美日韩精品在线一区二区 | 久久理论电影 | av资源中文字幕 | 日本婷婷色 | 在线一二三区 | 欧美一区免费观看 | 精品在线观看国产 | 国产伦理久久精品久久久久_ | 国产精品亚洲人在线观看 | 国产视频精品视频 | 天天视频色 | 天堂av在线网 | 色www精品视频在线观看 | 97超碰成人 | 久久久香蕉视频 | 亚洲欧美视频 | 久久精品—区二区三区 | 最近中文字幕大全中文字幕免费 | 免费三级大片 | 国产91全国探花系列在线播放 | 日韩欧美国产视频 | 日韩在线理论 | 久久激情综合 | a黄色片| 国产在线无 | 国产一区在线精品 | 亚洲综合欧美日韩狠狠色 | 久久不射电影院 | 久草观看| www.久久久久 | 日日夜夜网 | 日韩在线电影一区二区 | 激情丁香 | 日韩av在线一区二区 | 99精品国产99久久久久久福利 | 91成人精品一区在线播放69 | 在线视频第一页 | 欧美另类高潮 | 国产小视频免费观看 | 开心色激情网 | 国产精品久久久久久久久久久久 | 伊人影院在线观看 | 午夜精品一二三区 | 日韩欧美在线一区二区 | 国产精品久久久久久久久费观看 | 另类老妇性bbwbbw高清 | 免费欧美高清视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 91麻豆精品国产91久久久久 | 欧美精品免费在线观看 | 999电影免费在线观看 | 欧美精品日韩 | 一本一道波多野毛片中文在线 | 亚洲色图 校园春色 | 国产免费黄视频在线观看 | 日韩一区二区三区高清免费看看 | 干狠狠| 一区二区三区四区不卡 | 日b视频国产| 99精品视频在线观看视频 | 国产精品视屏 | 天天摸夜夜添 | 日韩av电影免费观看 | 中文字幕91| 国产在线一卡 | 婷婷色综合| 视频一区二区三区视频 | 91麻豆精品国产91久久久无限制版 | 91看片黄色 | 欧美视频在线观看免费网址 | 高清国产一区 | av高清不卡 | 91成人网在线观看 | 国产一级黄色免费看 | 在线亚州| 久久国产美女视频 | 97在线资源 | 日日躁夜夜躁xxxxaaaa | 国产99久久九九精品免费 | 人成在线免费视频 | 四虎精品成人免费网站 | 国产中文伊人 | 日日激情 | sm免费xx网站| 成人精品影视 | 在线观看一区二区精品 | 中文有码在线 | 久久99国产精品自在自在app | 免费色视频在线 | 亚洲精品一区二区久 | 91久久久久久国产精品 | 蜜桃视频成人在线观看 | 麻豆极品 | 免费在线观看国产黄 | 在线观看欧美成人 | 天天射,天天干 | 久久久国产精品一区二区三区 | 婷婷视频在线观看 | 久久久这里有精品 | 探花视频在线观看免费 | 久热精品国产 | 在线日本v二区不卡 | 韩国av一区二区三区在线观看 | 韩国在线视频一区 | 草免费视频 | 国产一级在线观看 | 六月天综合网 | 99精品免费久久久久久日本 | 国产高清不卡av | 国产伦理久久精品久久久久_ | 96亚洲精品久久 | 亚洲 欧美日韩 国产 中文 | а天堂中文最新一区二区三区 | 美女视频黄免费的 | 五月天婷婷综合 | 激情狠狠干 | 日本三级吹潮在线 | 97国产精品 | 国产高清专区 | 国产一区二区综合 | 国产日韩视频在线观看 | 免费观看www小视频的软件 | 亚欧日韩成人h片 | 激情久久婷婷 | 在线精品播放 | 日韩欧美视频一区二区 | 亚洲 欧美 国产 va在线影院 | 亚洲精品2区| 操操操日日日 | 波多野结依在线观看 | 国产午夜三级 | 日韩免费在线一区 | 久久国产精品99久久久久久老狼 | 久久99久久99精品中文字幕 | 91在线看| 成人精品一区二区三区电影免费 | 天堂av在线网| 四虎永久视频 | 国产精品成人在线观看 | 国产一区二区三精品久久久无广告 | 高清av免费看| 国产在线观看二区 | 丁香激情综合 | 日本公乱妇视频 | 国产精品美女免费看 | 视频国产 | 日本三级吹潮在线 | 欧美一级片在线观看视频 | 国产资源免费 | 免费在线观看视频一区 | 91视频啪 | 国产精品久久久久久一区二区三区 | 视频在线观看入口黄最新永久免费国产 | 亚洲高清在线精品 | 中文字幕免费 | 亚洲精品欧美成人 | 91入口在线观看 | 五月婷婷狠狠 | 国产精品自在线 | 国产一区在线视频 | 国产日韩精品一区二区三区 | 久久久久久精 | 五月开心六月伊人色婷婷 | 91亚洲精品久久久 | 国产人在线成免费视频 | 丁香婷婷久久久综合精品国产 | 中文字幕在线一区观看 | 久久精品4| 国产夫妻性生活自拍 | 男女精品久久 | 最近中文字幕大全中文字幕免费 | 91污在线观看 | 亚洲欧洲精品一区二区 | 久久a免费视频 | 免费观看mv大片高清 | 九色福利视频 | 中文字幕在线观看网址 | www.色婷婷 | 91av中文字幕 | 国产亚洲日本 | 韩国精品一区二区三区六区色诱 | 日日夜夜干 | 奇米影视在线99精品 | 一区二区在线不卡 | 玖玖视频精品 | 日本黄色a级大片 | a级国产片 | 米奇狠狠狠888 | 一区二区三区在线视频观看58 | 青春草视频 | 91传媒在线观看 | 成年人免费观看国产 | 丝袜精品视频 | 亚洲美女在线国产 | 亚洲专区欧美专区 | 一级精品视频在线观看宜春院 | 国产人成精品一区二区三 | 欧美在线视频第一页 | 精品亚洲视频在线 | 超碰最新网址 | 人人射| 99se视频在线观看 | 国内精品免费 | 婷婷综合电影 | 日本 在线 视频 中文 有码 | av福利在线看 | 精品一区二区电影 | 色综合久久88色综合天天6 | 国产精品12 | 欧美精品在线观看一区 | 久久久片 | 欧美精品在线视频 | 在线成人免费av | 8x8x在线观看视频 | av 在线观看 | 成年人在线视频观看 | 国产精品自在线拍国产 | 国产va饥渴难耐女保洁员在线观看 | 国产精品成人久久 | 18久久久久久 | 亚洲精品午夜久久久久久久 | 亚州av一区 | 一区二区三区 中文字幕 | 在线观看国产区 | 天天操天天干天天爽 | www,黄视频 | 日韩免费av网址 | 久久国产精品99久久久久久进口 | 久久久久久久久久伊人 | 国产一区欧美二区 | 一区二区三区精品久久久 | 精品国产一区二区三区免费 | 国产精品18p | 亚洲精品小区久久久久久 | 久草a在线| 国产精品一区二区无线 | 天天看天天干 | 天天操天天干天天玩 | 国产精品精品视频 | 丁香六月婷婷激情 | 精品美女国产在线 | 麻豆影视在线播放 | 99久久婷婷国产综合亚洲 | 国产精品69久久久久 | 999久久久久久 | 久久99婷婷 | 91视视频在线直接观看在线看网页在线看 | 久久精品欧美一 | 久久歪歪 | 久草免费在线视频观看 | 狠狠的干狠狠的操 | 天天干天天射天天插 | 久久国内免费视频 | 色婷婷免费 | 精品女同一区二区三区在线观看 | 国产精品专区在线观看 | 国产淫a | 九九九九精品 | av在线播放中文字幕 | 久久久久在线观看 | 亚洲视频,欧洲视频 | 九九九在线观看 | 少妇自拍av | 日日干精品 | 超薄丝袜一二三区 | 日韩欧美精品在线视频 | 四虎国产精品免费 | 色av色av色av | 久久精品播放 | 亚洲欧洲精品一区二区精品久久久 | 国产精品久久久久久久av大片 | 久久国产精品久久精品国产演员表 | 国产精品久久久久久a | 婷婷丁香在线视频 | 亚洲爱av | 91探花在线 | 国产91在线播放 | 国产97视频在线 | 欧美夫妻性生活电影 | 午夜精品久久久久久久久久久久 | 一级做a视频 | 日韩三级视频在线看 | 久久男人免费视频 | 久久国产精品久久精品国产演员表 | 狠狠色噜噜狠狠狠合久 | 久久久国产一区二区三区四区小说 | 久久久亚洲电影 | 蜜桃视频成人在线观看 | 日韩xxx视频| 久久久黄色av| 色噜噜狠狠狠狠色综合久不 | 97成人免费视频 | 国产亚洲精品综合一区91 | 中文亚洲欧美日韩 | 天天爱天天操 | wwwwww色| 69久久久久久久 | av线上看 | 亚洲综合国产精品 | 国产精品爽爽爽 | www.久久久com| 亚洲91av| 国产成人区 | 91在线产啪 | 天堂av免费看| 久草在线免费资源站 | 国产一区二区免费 | 黄色av在| 99产精品成人啪免费网站 | 国产精品综合久久久久久 | 日韩欧美高清一区二区 | 国产成人一区二区三区在线观看 | 日韩视频三区 | 97国产一区二区 | 黄色视屏av | 91麻豆看国产在线紧急地址 | 日本在线中文在线 | 99免费在线播放99久久免费 | 久久免费视频在线观看6 | 探花视频在线观看免费版 | 在线视频观看成人 | 国产在线 一区二区三区 | 国产96在线视频 | 亚洲日本黄色 | 99久久影视| 久久综合久久综合这里只有精品 | 色噜噜日韩精品一区二区三区视频 | 日韩欧美一级二级 | 免费日p视频 | 午夜影视剧场 | 91久久精品日日躁夜夜躁国产 | 六月久久婷婷 | 亚洲色图av | 免费日韩| 久久综合婷婷综合 | 99精品在线播放 | 国产一区欧美日韩 | 美女视频久久 | 色射爱 | 激情五月婷婷综合 | 久久国产电影 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 91在线精品一区二区 | 日韩精品2区 | 亚洲手机av | 国产看片 色 | 亚洲在线视频免费 | 在线综合色 | 97精品国产97久久久久久 | 午夜精品久久久久久久爽 | 久免费视频 | 黄色av高清 | 91插插插免费视频 | 91丨九色丨国产在线 | 亚洲人毛片 | 99久久99久久精品国产片 | 丁香九月激情 | 久久久久国产免费免费 | av不卡在线看 | 黄色午夜网站 | ,久久福利影视 | 国产99视频在线观看 | avcom在线| 国产精品1区2区 | 九九热国产视频 | 激情综合五月婷婷 | 久久精品高清视频 | 欧美a级成人淫片免费看 | 99国产情侣在线播放 | 欧美片网站yy | 99久高清在线观看视频99精品热在线观看视频 | 久久久免费毛片 | 久久九九影视网 | 色香蕉在线 | 国产不卡片 | 91桃色在线观看视频 | 欧美夫妻生活视频 | 三级黄色大片在线观看 | 婷婷免费在线视频 | 91在线视频播放 | 一级α片 | 亚洲一区二区精品3399 | 国产一区二区观看 | 亚洲日韩欧美视频 | 亚洲另类视频 | 色噜噜在线观看 | 亚洲午夜久久久久久久久久久 | 国产精品va在线观看入 | 蜜臀av在线一区二区三区 | 色无五月 | 人人狠狠综合久久亚洲 | 国产99久久精品 | 久久精品国产免费观看 | 久久午夜电影院 | 免费人成在线观看网站 | 中文字幕色婷婷在线视频 | 天天拍夜夜拍 | 国产成人在线播放 | 国产精品激情在线观看 | 97超碰中文| 中文字幕在线观看资源 | 91免费视频网站在线观看 | av黄免费看 | 日韩69av| 亚洲精品456在线播放第一页 | 国产精品久久久久久久妇 | 五月亚洲综合 | 久草在线99 | 在线国产视频一区 | 日韩专区 在线 | 97网在线观看| 激情五月播播久久久精品 | 亚洲精品乱码久久久久v最新版 | 亚洲a在线观看 | 亚洲第一区在线播放 | 欧美一级片在线观看视频 | 91精品啪啪 | 亚洲伦理一区 | 欧美精品首页 | 久久视影 | 国产又黄又爽无遮挡 | 夜夜澡人模人人添人人看 | 亚洲免费精彩视频 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 欧美日韩国产一区二区三区 | 国产高清无线码2021 | 婷婷精品国产欧美精品亚洲人人爽 | 国产一区播放 | 中文在线免费观看 | 亚洲专区欧美专区 | 国产精选在线 | 国产精品成人久久久久久久 | 色网站在线免费观看 | 久久久精品小视频 | 亚洲精品国产精品国自 | 欧美在线观看视频一区二区 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久久久69| 国内精品久久久久影院优 | 黄网站色 | 91精品国产亚洲 | 国产xxxx做受性欧美88 | 肉色欧美久久久久久久免费看 | 亚洲精品乱码久久久久久按摩 | 亚洲二区精品 | av天天色 | 超碰夜夜 | 中文字幕在线播放日韩 | 狠狠五月婷婷 | 免费看三级网站 | 久久a久久| 国产一级久久 | 丁香久久激情 | 美女搞黄国产视频网站 | 国产91精品高清一区二区三区 | 玖玖在线资源 | 99久久夜色精品国产亚洲96 | 亚洲人久久久 | 在线视频精品播放 | 欧美视频日韩 | 日韩精品中文字幕在线不卡尤物 | 婷婷综合av | 日韩精品在线免费播放 | 日韩三级久久 | 久久蜜臀一区二区三区av | 麻豆视频在线看 | 国产精品久久久免费看 | 欧美a影视 | 99精品国产一区二区三区麻豆 | 中文字幕高清av | 香蕉久久久久 | 久久精品视频中文字幕 | 久一网站 | 久久国产欧美日韩精品 | 91九色pron| 亚洲黄网站| 黄色大片免费网站 | 国产午夜精品久久 | 色播99 | 中文字幕在线观看不卡 | 伊人手机在线 | 一区二区精品在线视频 | 欧美做受xxx| 亚洲欧洲美洲av | 久久久久久久国产精品影院 | 中文字幕在线不卡国产视频 | 日韩网站在线观看 | 久久精品网站免费观看 | 久久免费国产精品 | 91精品国产电影 | 91麻豆精品国产91久久久久久久久 | 丁香六月婷婷开心 | 久草在线视频网站 | 麻花传媒mv免费观看 | 99在线视频精品 | 亚洲九九影院 | 欧美精品久久久久久久久久丰满 | 中文字幕在线播放视频 | 成人黄色小说视频 | 韩国一区二区av | 亚洲爽爽网 | 国产一区二区视频在线 | 黄色小网站在线 | 久久精品a | 91亚洲精品国偷拍 | 国产午夜一区 | 国产精品va在线播放 | 中文字幕日韩国产 | 香蕉影视在线观看 | avav99| 天天操天天干天天 | 在线网址你懂得 | 国产精品久久久久一区二区 | 天天躁日日 | 国产高清黄 | 亚洲欧洲一级 | 在线看国产视频 | 亚洲国产精品人久久电影 | 日韩高清 一区 | 一区免费视频 | 精品欧美一区二区在线观看 | 91久久丝袜国产露脸动漫 | 国产专区在线看 | 九九九在线观看视频 | 在线色资源 | 日本视频网 | 五月婷婷六月丁香在线观看 | 人人超碰97| av中文在线 | 黄色免费高清视频 | 日韩大片在线播放 | 欧美片一区二区三区 | 天堂v中文 | 99视频这里只有 | 免费十分钟 | 国产精品久久久久一区二区三区共 | 国产成人一区二区三区 | 免费在线观看午夜视频 | 99精品视频免费观看 | 黄色午夜网站 | 日韩在线电影 | 亚洲成人精品在线 | 日韩av影视在线 | ,久久福利影视 | 欧美a免费| 午夜精品久久久久久久99水蜜桃 | av手机版| 丝袜av一区 | 国产精品99久久久久久人免费 | 深爱激情综合 | 国产高清久久久 | 国产精品粉嫩 | 天天激情天天干 | 国产在线永久 | 国产91小视频 | 久草网站在线观看 | 韩国在线视频一区 | 日日夜夜国产 | 一区二区中文字幕在线 | 国产亚洲婷婷免费 | 国产在线久久久 | 国产精品久久在线观看 | 激情图片qvod| 最新中文字幕在线播放 | 成人在线免费av | 99热在线免费观看 | 国产午夜三级一二三区 | 亚洲精品av在线 | 在线色视频小说 | 成人夜晚看av | 中文字幕国产 | 97精品伊人 | 手机版av在线 | 久久99久久精品 | 狠狠五月婷婷 | 欧美 日韩 久久 | 日韩免费视频在线观看 | 中文字幕视频一区 | 91自拍91| 九九九国产 | 亚洲在线精品 | 国产精品毛片一区视频播 | 国内久久视频 | 中文亚洲欧美日韩 | 91精品在线免费 | 夜夜视频欧洲 | 日b视频在线观看网址 | 免费观看十分钟 | 91在线观看黄 | 久99久视频 | 欧美a级在线| 免费看黄的视频 | 亚洲人成免费 | 色偷偷88888欧美精品久久 | 一级免费黄色 | 国产视频精品久久 | 夜夜摸夜夜爽 | 黄视频网站大全 | avsex| 亚洲精品视频一二三 | 毛片一级免费一级 | 国产一区在线视频观看 | 麻豆成人在线观看 | 99久久爱| 久久久久久麻豆 | 国产精品四虎 | 亚洲国产伊人 | 99这里只有 | 色噜噜在线观看 | 日韩欧美精品在线观看 | 欧美国产一区二区 | 缴情综合网五月天 | 久久99热精品 | 中文字幕乱码在线播放 | 男女拍拍免费视频 | a资源在线 | 激情五月色播五月 | 99九九热只有国产精品 | 九九九九免费视频 | 久久免费高清 | 国产尤物在线视频 | 国产黄色av | 国产精品麻豆91 | 日本亚洲国产 | 去看片 | 美女网站一区 | 新版资源中文在线观看 | 国产成人av免费在线观看 | 成人黄色在线观看视频 | 高潮毛片无遮挡高清免费 | 深夜福利视频在线观看 | 国产中文字幕三区 | 日韩电影中文 | 深爱激情av | 五月婷婷激情综合 | 日韩av线观看 | 国产精品一区二区果冻传媒 | 最新国产精品拍自在线播放 | av免费黄色 | 成年人免费av网站 | 色91在线 | 日本中文字幕在线观看 | 亚洲国产精品va在线 | 国产精品国产精品 | 国产精品美女视频网站 | 欧美日韩免费在线视频 | 夜色.com| 在线有码中文字幕 | 狠狠干狠狠艹 | 久久久久99精品成人片三人毛片 | 97香蕉久久国产在线观看 | 欧洲色综合| 国产一级在线播放 | 99久久免费看| 国产精品2区 | 亚洲播放一区 | 久久少妇| 99精品视频在线观看免费 | 欧洲精品码一区二区三区免费看 | 视频在线观看日韩 | 99久久精品国产亚洲 | av免费观看网址 | 成人午夜精品久久久久久久3d | 97碰碰精品嫩模在线播放 | 色综合狠狠干 | 色99导航| 亚洲视频在线播放 | 97成人精品区在线播放 | 狠狠操导航 | 欧美精品中文 | 日韩一级黄色大片 | 天堂av在线中文在线 | 九九av | 黄色av免费电影 | 激情五月婷婷 | 欧美色婷 | 欧洲成人免费 | 日韩三区在线观看 | 国产精品免费久久久久影院仙踪林 | 蜜臀久久99精品久久久无需会员 | 夜又临在线观看 | 国产精品免费小视频 | 日韩精品免费在线观看 | 在线免费成人 | 国产成人精品一区二区三区在线观看 | 午夜精品久久久久久久久久久久久久 | 国产精品一区二区中文字幕 | av免费网页 | 伊人狠狠| 在线亚州| 国产精品自产拍在线观看 | 狠狠躁天天躁 | 91亚洲成人| 91成人短视频在线观看 | 久久精品99国产国产 | 亚洲乱码国产乱码精品天美传媒 | 中文字幕一区2区3区 | 久草在| 三级黄色在线观看 | 久久网站最新地址 | 蜜臀av一区| 亚洲精品久久久久久久蜜桃 | 婷婷四房综合激情五月 | 日产乱码一二三区别免费 | av中文字幕在线播放 | 中文字幕在线看视频 | 99久久久久免费精品国产 | 亚洲精品乱码白浆高清久久久久久 | 在线免费观看av网站 | 久久一区国产 | 午夜久久久久久久久久影院 | 狠狠干在线播放 | 天天综合网久久 | 精品国产免费久久 | 久久久国产一区 | 久久玖 | 黄色三级免费看 | 91香蕉视频黄色 | 色国产精品一区在线观看 | 999在线观看视频 | 中文在线字幕免费观看 | 国内精品久久久久 | 免费在线色视频 | 国产精品美女久久久久久久久 | 日韩精品久久一区二区三区 | 国产精品理论片在线播放 | 免费看污网站 | 成人av网站在线观看 | 精品国产aⅴ麻豆 | 中文字幕av一区二区三区四区 | 欧美亚洲一级片 | a级成人毛片 | 伊人久久电影网 | 国产精品久久久久久久久久妇女 | 国产黄色免费观看 | 五月综合色婷婷 | 国产精品免费在线视频 | 国产美女视频一区 | 日韩手机在线 | 日日操夜夜操狠狠操 | 亚洲精品动漫久久久久 | 91理论片午午伦夜理片久久 | 国产三级国产精品国产专区50 | 精品国产一区二区三区久久影院 | 国产精品美女久久久免费 | 午夜性福利 | 国产一区二区观看 | 四虎4hu永久免费 | 国产涩图| 日韩在线视频播放 | 日韩精品一区二区三区高清免费 | 日韩特黄一级欧美毛片特黄 | 超碰公开97 | 欧美日韩精品国产 | 成人久久久久久久久久 | 黄污视频大全 | 天天爱天天射 | 97色综合| a特级毛片 | 国产一区二区视频在线播放 | 一本一本久久aa综合精品 | 奇人奇案qvod | 国产女人40精品一区毛片视频 | 亚洲综合色激情五月 | 日韩大片在线看 | a电影免费看 | 国产精品日韩精品 | 色婷婷色 | 亚洲区另类春色综合小说 | 黄色片视频在线观看 | 天天操天天干天天爱 | 97激情影院| 国产精品一区二区精品视频免费看 | 麻豆传媒电影在线观看 | 国产不卡在线观看 | 亚洲精品国产精品乱码在线观看 | 久久这里只有精品视频99 | 欧美性做爰猛烈叫床潮 | 日本乱视频 | 国产精品情侣视频 | 亚洲aⅴ免费在线观看 | 国产精品中文久久久久久久 | 在线免费观看视频a | 日本乱码在线 | 青青河边草免费观看完整版高清 | 久操中文字幕在线观看 | 18久久久久久 | 色九九影院 | 国产又粗又猛又黄视频 | 国产人在线成免费视频 | 欧美日韩一区二区三区免费视频 | 日韩欧美91| 久久精品99久久 | 欧美二区三区91 | 一区二区视频在线观看免费 | 国产精品久久久久国产精品日日 | 99精品视频观看 | 国产麻豆精品一区二区 | 久久高清免费观看 | 国产午夜精品免费一区二区三区视频 | 五月天伊人网 | 国产成人一区二区啪在线观看 | 日本一区二区免费在线观看 | av青草 | 国产亚洲人 | 欧美激情综合五月色丁香 | 日日摸日日添夜夜爽97 | 国产一级在线视频 | 国产黄a三级三级三级三级三级 | 久久深爱网| 日韩免费在线观看视频 | 日本性久久| www色婷婷com | 亚洲少妇xxxx | 精品a视频 | 91视频免费看网站 | 欧美a级在线播放 | 成人久久18免费 | 91视频国产高清 | 久久久久久久久久国产精品 | 天堂av观看 | 久草在线视频精品 | 亚洲久在线| 久久伊人国产精品 | 日日操网 | 一区二区三区电影大全 | 中文字幕在线观看免费观看 | 免费在线一区二区 | 一区精品久久 | 午夜黄色一级片 | 91精品国产成人观看 | 国产精品小视频网站 | 欧美一区免费观看 | 国产精品18久久久久久首页狼 | 国产亚洲视频中文字幕视频 | 日韩精品在线视频 | 日韩日韩日韩日韩 | 日韩国产高清在线 | 国产手机在线精品 | 亚洲理论在线观看 | 91在线看片 | 狠狠色丁香久久婷婷综合五月 | www.黄色 | 欧美在线观看视频 | 成年人在线电影 | 日韩有码中文字幕在线 | 美女黄网久久 | 97成人啪啪网 | 中文区中文字幕免费看 | 99精品在线免费视频 | 午夜成人免费电影 | 成人在线免费视频观看 | 人人舔人人爽 | 久久婷婷视频 | 一 级 黄 色 片免费看的 | 亚洲精品小区久久久久久 | 三级大片网站 | 国产成年人av | 91香蕉视频色版 | 人人插人人玩 | 久久久久久久久久久久亚洲 | 丁香花五月 | 国产精品影音先锋 | 日韩乱色精品一区二区 | 日本不卡久久 | 日韩在线观看你懂的 | 日韩精品免费专区 | 狠狠插狠狠操 | 韩日精品在线 | 欧美日韩精品网站 | 人人爽人人爽人人爽 | 一区二区免费不卡在线 | 99久久精品一区二区成人 | 国产美女精品视频免费观看 | 久久在线电影 | 亚洲成av人影院 | 午夜精品一二区 | 91高清在线看 | 久久久久亚洲精品中文字幕 | 在线观看你懂的网址 | 亚洲激情网站免费观看 | 91探花视频| 婷婷伊人网 | 婷婷丁香狠狠爱 | 91在线视频观看免费 | 国产91精品一区二区麻豆亚洲 | 91网址在线观看 | 有码视频在线观看 | 天天爱综合 | 国产精品久久久久久久久久三级 | 最近中文字幕高清字幕免费mv | 欧美视频在线观看免费网址 | 日韩午夜av电影 | 精品亚洲网 | 国产91欧美| 色资源网在线观看 | 久久久免费观看视频 | 国产午夜激情视频 | 99亚洲天堂 | 亚洲丝袜一区 | 狠色在线 | 最近在线中文字幕 | 欧美一区二区免费在线观看 | 91九色网址 | 中文字幕在线第一页 | 日韩91在线 | 毛片a级片 | 激情欧美丁香 | 日韩国产欧美在线视频 | 激情丁香综合 | 奇米影视四色8888 | 九九热精品视频在线播放 | 蜜桃传媒一区二区 | 美女视频黄,久久 | 国产精品久久久久一区二区三区 | 天天干,天天射,天天操,天天摸 | 探花视频网站 | 国产一区自拍视频 | 日韩在线一区二区免费 | 中文字幕黄网 | 午夜神马福利 | 日韩精品免费在线播放 | 国产精品12| 色综合婷婷 | 色五月情| 久久99亚洲精品 | 欧美一级性生活片 | 久草视频一区 | 最近中文字幕高清字幕在线视频 | 亚洲国产小视频在线观看 | a特级毛片 | 美女免费电影 | 国产成人精品一区二 | 日韩av午夜在线观看 | 丁香伊人网 | 中文字字幕在线 |