OpenGL API

1. glRotatef and glTranslatef

void glTranslatef(GLfloat  x,  GLfloat  y,  GLfloat  z);

void glRotatef(GLfloat  angle,  GLfloat  x,  GLfloat  y,  GLfloat  z); // angle表示旋轉的角度(注意單位不是弧度),(x,y,z)表示轉軸的方向(從(0,0,0)到(x,y,z))


矩陣的變換是右乘

1> 先旋轉再平移

glTranslatef(-0.1*i,0,0)

glRotatef(45,0,1,0)

假設i不斷增加,則繪圖後的效果是


2> 先平移再旋轉

glRotatef(45,0,1,0)

glTranslatef(-5*i,0,0)

假設i不斷增加,則繪圖後的效果是


2. glBlendFunc

void  glBlendFunc(GLenum sfactor,GLenum dfactor);

sfactor 源混合因子, dfactor 目標混合因子

假設源顏色(r1,g1,b1,a1), 目標顏色(r2,g2,b2,a2), 源因子(x1,y1,z1,w1), 目標顏色(x2,y2,z2,w2)

則混合後顏色爲(r1*x1 + r2*x2, g1*y1 + g2*y2, b1*z1 + b2*z2 + a1*w1 + a2*w2), 即各個顏色與因子相乘,然後相同顏色相加。看着網上用Rs,Ds等表示真是頭暈常見的選項:

GL_ZERO:      表示使用0.0作爲因子,實際上相當於不使用這種顏色參與混合運算。
GL_ONE:       表示使用1.0作爲因子,實際上相當於完全的使用了這種顏色參與混合運算。
GL_SRC_ALPHA:表示使用源顏色的alpha值來作爲因子。
GL_DST_ALPHA:表示使用目標顏色的alpha值來作爲因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0減去源顏色的alpha值來作爲因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0減去目標顏色的alpha值來作爲因子。
GL_SRC_COLOR:把源顏色的四個分量分別作爲因子的四個分量

GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR

前兩個在OpenGL舊版本中只能用於設置目標因子,後兩個在OpenGL舊版本中只能用於設置源因子。新版本的OpenGL則沒有這個限制

glBlendFunc(GL_ONE, GL_ZERO) 

則表示完全使用源顏色,完全不使用目標顏色,因此畫面效果和不使用混合的時候一致(當然效率可能會低一點點)。如果沒有設置源因子和目標因子,則默認情況就是這樣的設置。

glBlendFunc(GL_ZERO, GL_ONE)

則表示完全不使用源顏色,因此無論你想畫什麼,最後都不會被畫上去了,有是有特殊用途


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 

表示源顏色乘以自身的alpha值,目標顏色乘以1.0減去源顏色的alpha值,這樣一來,源顏色的alpha值越大,則產生的新顏色中源顏色所佔比例就越大,而目標顏色所佔比例則減小。這種情況下,我們可以簡單的將源顏色的alpha值理解爲“不透明度”。這也是混合時最常用的方式。

glBlendFunc(GL_ONE, GL_ONE)

則表示完全使用源顏色和目標顏色,最終的顏色實際上就是兩種顏色的簡單相加。例如紅色(1, 0, 0)和綠色(0, 1, 0)相加得到(1, 1, 0),結果爲黃色。


所謂源顏色和目標顏色,是跟繪製的順序有關的。假如先繪製了一個紅色的物體,再在其上繪製綠色的物體。則綠色是源顏色,紅色是目標顏色。


3. void glDepthMask(GLboolean  flag)

enable or disable writing into the depth buffer

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); 打開深度緩衝

只要存在深度緩衝區,無論是否啓用深度測試,OpenGL在像素被繪製時都會嘗試將深度數據寫入到緩衝區內,除非調用了glDepthMask(GL_FALSE)來禁止寫入。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章