这里就介绍一个RGBA吧,还是要学Shader的。
RGBA模式中,每一个像素会保存以下数据:
R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha值不直接影响颜色。
glColor*系列函数可以用于设置颜色。其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。
例如:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
将浮点数作为参数,其中0.0表示不使用该种颜色,而1.0表示将该颜色用的最多。
例如:
glColor3f(1.0f, 0.0f, 0.0f); 表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。
glColor3f(0.0f, 1.0f, 1.0f); 表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。
glColor3f(0.5f, 0.5f, 0.5f); 表示各种颜色使用一半,效果为灰色。
注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。
注意:glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。
采用f和d做后缀的函数,以1.0表示最大的使用。
采用b做后缀的函数,以127表示最大的使用。
采用ub做后缀的函数,以255表示最大的使用。
采用s做后缀的函数,以32767表示最大的使用。
采用us做后缀的函数,以65535表示最大的使用。
图片来源:百度百科
RGB空间
main.cpp
#include <GL/glut.h>
//显示函数
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 1.0f, 1.0f);//0 255 255
glVertex3f(-0.5f, -0.5f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);//255 255 0
glVertex3f(0.5f, -0.5f, 0.0f);
glColor3f(1.0f, 0.0f, 1.0f);// 255 0 255
glVertex3f(0.0f, 0.5f, 0.0f);
glEnd();
glFlush();
}
//主函数
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("渐变三角形");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
结果截图
渐变三角形截图
main.cpp
#include <GL/glut.h>
//显示矩形函数
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);//清除屏幕
glColor3f(1.0f,0.0f,1.0f); //255 0 255
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();//强制刷新缓冲
}
//主函数
int main(int argc, char *argv[])
{
glutInit(&argc, argv);//初始化
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示模式
glutInitWindowPosition(100, 100);//设置位置和窗口大小
glutInitWindowSize(400, 400);
glutCreateWindow("有颜色的矩形");
glutDisplayFunc(&myDisplay);//传递函数
glutMainLoop();
return 0;
}
结果截图
单色矩形截图
为什么使用着色器类?你不感觉之前的代码很乱吗?用字符串去定义真