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)來禁止寫入。