日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

计算机图形学笔记(六)

發布時間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机图形学笔记(六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4.2.3兩個問題

問題(1)如何讓光源運動?

glLightfv(GL_LIGHT0,GL_POSITION,vLitPosition)

直接變化vLitPosition中的值;光源可以認為是一個幾何物體,將受到其前面的幾何變換的影響。

問題(2)光照下物體的顏色由什么來決定?

光的顏色:glLightfv()…

物體的材質:glMaterialfv()…

glColor*()沒用了嗎?

glColor*()確實沒用了,但可以通過如下方式發生作用:

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT);

OpenGL中的光照明設置

1、OpenGL中的光照明模型

2、設置物體的法向

3、設置光照參數的語句

4、設置材質參數的語句

5、聚光燈參數

6、光照衰減參數

7、方向光源與位置光源

8、本地視點/無限遠視點

9、雙面光照

10、如何讓光源運動

11、光照下物體的顏色

4.3光照計算發生在圖形流水線的那個階段?

光照計算發生在那個階段?

?

在固定流水線中,光照計算默認發生在頂點處理階段。

為什么要這樣做呢?

——為了效率!

在頂點處理階段,計算出了三角形每個頂點的光照,那么三角形所覆蓋的每個像素的光照值如何得到?

——光柵化階段可得到

4.4.1常數明暗處理與Gouraud明暗處理

Shading(明暗處理、著色)

Shading->計算三角形內每個像素的顏色的過程

幾種常見處理方法

1、常數明暗處理

2、Gouraud明暗處理(Gouraud shading)

3、Phong明暗處理(Phong shading)

常數明暗處理

在默認的圖形流水線中,由于效率的原因,光照計算是為每個頂點進行的。

那么,面片內每個片元的顏色如何計算?

最簡單的方法(常數明暗處理):面片內所有像素都取同樣的顏色

1、“常數明暗處理”:即對每個多邊形只計算一個光照強度值,然后用此值作為整個多邊形平面的明暗值賦給多邊形的每個像素,使多邊形的每個點都具有相同的明暗度。

2、如何消除顏色的跳變,實現光滑明暗處理?

消除顏色的跳變,實現光滑的明暗處理:

Gouraud明暗處理

Phong明暗處理

Gouraud明暗處理

采用“雙線性插值”的方式計算面片內像素的顏色,具體做法是:

Step1:計算出多邊形各頂點的法向

(對周圍面片法向進行平均可求得此頂點的法向);----CPU

?

?

計算三角面片的法向:

Vector CaculateTriangleNormal(Point3d& p0, Point3d& p1, Point3d& p2)

{

??? Vector Normal;

??? float v1x = p1.X - p0.X;

??? float v1y = p1.Y - p0.Y;

??? float v1z = p1.Z - p0.Z;

??? float v2x = p2.X - p1.X;

??? float v2y = p2.Y - p1.Y;

??? float v2z = p2.Z - p1.Z;

??? Normal.X= v1y * v2z - v1z * v2y;

??? Normal.Y = v1z * v2x - v1x * v2z;

??? Normal.Z = v1x * v2y - v1y * v2x;

??? float len = (float)sqrt(Normal.X * Normal.X + Normal.Y * Normal.Y + Normal.Z * Normal.Z);

??? if (len == 0)

??? {

??????? //throw Exception();

??? }

??? else

??? {

??????? Normal.X /= len;

??????? Normal.Y /= len;

??????? Normal.Z /= len;

??? }

??? return Normal;

}

Step2:計算出多邊形各頂點處的光亮度值;----Vertex operation

Step3:然后再對多邊形頂點的光亮度值進行“雙線性插值”計算出多邊形內任一片元的光亮度。----Rasterization

雙線性插值

沿當前掃描線進行雙線性插值

先插值計算出a,b兩點的光亮度

再由a,b兩點的光亮度插值計算出P點的光亮度值

?

這種插值計算發生在什么時候?

?

在“光柵化”過程中,會對多邊形進行掃描轉換,此時正好就可在掃描轉換過程中對每個片元進行雙線性插值。

?

OpenGL中的Shading

Flat Shading 與Smooth Shading

?

4.4.2Phong明暗處理

Gouraud明暗處理

Gouraud明暗處理的問題

曲面分割過粗可能產生錯誤效果

高光的丟失

馬赫帶效應(即光亮度變化率不連續的邊界處呈現亮帶或黑帶)

?

Phong明暗處理

Phong明暗處理的思想:

不是插值光亮度顏色,而是插值法向量。故而也稱為“法向量插值明暗處理”

對多邊形頂點處法向量做雙線性插值,將插值計算得到的多邊形內各片元的法向量代入光亮度計算公式,得到各片元的光亮度。

Step1:計算出多邊形各頂點的法向;

Step2:對多邊形中的某個片元,雙線性插值計算其法向;

?

Step3:計算出多邊形內該片元的光亮度。

不同明暗處理效果比較:

?

?

Phong明暗處理的缺點是計算量大。以往圖形硬件中不常采用。

Phong明暗處理:

先插值得到法向量,再代入光照模型計算得到光亮度顏色。

?

Gouraud明暗處理:

直接插值得到光亮度顏色

?

Phong shading計算發生在哪里?

?

Step1:計算出多邊形各頂點的法向;----CPU

Step2:對多邊形中的某個片元,雙線性插值計算其法向;---- Rasterization

Step3:計算出多邊形內該片元的光亮度。----Fragment operation

三種明暗處理方法

常數明暗處理

Gouraud明暗處理

Phong明暗處理

1、三種方法效果越來越好

2、但計算量也越來越大

3前兩者是頂點級別的光照計算;而Phong Shading則是像素級別的光照計算。

凹凸紋理映射

?

OpenGL中的相關函數

glShadeModel(GLenum mode)

GL_FLAT即常數明暗處理

GL_SMOOTH即采用Gouraud明暗處理

?

4.5圖形流水線三個階段的進一步理解

頂點處理---光柵化---片元處理

?

頂點處理---光柵化---片元處理三個階段的進一步理解

Vertex operations的處理對象是頂點;而Fragment operations的處理對象是片元。

數據的流轉:

頂點數據---光柵化---片元數據

光柵化作了什么

1、以三角面片為處理單位,輸入是三個頂點的數據,輸出是三角形所覆蓋的所有像素的數據。

2、對頂點數據(顏色、法向量、三維坐標、紋理坐標……)進行計算得到每個片元的數據

3、計算方式:雙線性插值、常數明暗處理……

光柵化模塊沒有直接的接口函數

glShaderMode(GL_FLAT/GL_SMOOTH);

glPolygonMode(GLenum face,GLenum mode);

但我們要明白它作了什么

總結

以上是生活随笔為你收集整理的计算机图形学笔记(六)的全部內容,希望文章能夠幫你解決所遇到的問題。

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