计算机图形学笔记(六)
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);
但我們要明白它作了什么
總結
以上是生活随笔為你收集整理的计算机图形学笔记(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab虚数求模,matlab计算带
- 下一篇: 如何打印复印试卷,试卷打印复印去哪里方便