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)来禁止写入。