说明
如果非常清楚的知道物体的材质,并且能够在OpenGL的材质表中找到合乎要求的参数设置,就可以避免指定物体的颜色值,某些情况下,指定物体的渲染颜色,使得物体的实际效果大打折扣
{
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
//黄铜
GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};
GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};
GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };
GLfloat mat_shininess[] = { 76.800003}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
glPopMatrix();
glFlush ();
}
{
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
//翡翠绿
GLfloat mat_ambient[] = { 0.247250, 0.199500, 0.074500, 1.000000};
GLfloat mat_diffuse[] = { 0.751640, 0.606480, 0.226480, 1.000000};
GLfloat mat_specular[] = { 0.628281, 0.555802, 0.366065, 1.000000 };
GLfloat mat_shininess[] = { 51.200001}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
glPopMatrix();
}
材质表
//黄铜
0.329412, 0.223529, 0.027451, 1.000000,
0.780392, 0.568627, 0.113725, 1.000000,
0.992157, 0.941176, 0.807843, 1.000000,
27.897400,
//青铜
0.212500, 0.127500, 0.054000, 1.000000,
0.714000, 0.428400, 0.181440, 1.000000,
0.393548, 0.271906, 0.166721, 1.000000,
25.600000,
//亮青铜
0.250000, 0.148000, 0.064750, 1.000000,
0.400000, 0.236800, 0.103600, 1.000000,
0.774597, 0.458561, 0.200621, 1.000000,
76.800003,
//铬
0.250000, 0.250000, 0.250000, 1.000000,
0.400000, 0.400000, 0.400000, 1.000000,
0.774597, 0.774597, 0.774597, 1.000000,
76.800003,
//铜
0.191250, 0.073500, 0.022500, 1.000000,
0.703800, 0.270480, 0.082800, 1.000000,
0.256777, 0.137622, 0.086014, 1.000000,
12.800000,
//亮铜
0.229500, 0.088250, 0.027500, 1.000000,
0.550800, 0.211800, 0.066000, 1.000000,
0.580594, 0.223257, 0.069570, 1.000000,
51.200001,
//金
0.247250, 0.199500, 0.074500, 1.000000,
0.751640, 0.606480, 0.226480, 1.000000,
0.628281, 0.555802, 0.366065, 1.000000,
51.200001,
//亮金
0.247250, 0.224500, 0.064500, 1.000000,
0.346150, 0.314300, 0.090300, 1.000000,
0.797357, 0.723991, 0.208006, 1.000000,
83.199997,
//白蜡
0.105882, 0.058824, 0.113725, 1.000000,
0.427451, 0.470588, 0.541176, 1.000000,
0.333333, 0.333333, 0.521569, 1.000000,
9.846150,
//银
0.192250, 0.192250, 0.192250, 1.000000,
0.507540, 0.507540, 0.507540, 1.000000,
0.508273, 0.508273, 0.508273, 1.000000,
51.200001,
//亮银色
0.231250, 0.231250, 0.231250, 1.000000,
0.277500, 0.277500, 0.277500, 1.000000,
0.773911, 0.773911, 0.773911, 1.000000,
89.599998,
//翡翠、祖母绿
0.021500, 0.174500, 0.021500, 0.550000,
0.075680, 0.614240, 0.075680, 0.550000,
0.633000, 0.727811, 0.633000, 0.550000,
76.800003,
//碧玉
0.135000, 0.222500, 0.157500, 0.950000,
0.540000, 0.890000, 0.630000, 0.950000,
0.316228, 0.316228, 0.316228, 0.950000,
12.800000,
//黑曜石
0.053750, 0.050000, 0.066250, 0.820000,
0.182750, 0.170000, 0.225250, 0.820000,
0.332741, 0.328634, 0.346435, 0.820000,
38.400002,
//珍珠
0.250000, 0.207250, 0.207250, 0.922000,
1.000000, 0.829000, 0.829000, 0.922000,
0.296648, 0.296648, 0.296648, 0.922000,
11.264000,
//红宝石
0.174500, 0.011750, 0.011750, 0.550000,
0.614240, 0.041360, 0.041360, 0.550000,
0.727811, 0.626959, 0.626959, 0.550000,
76.800003,
//绿宝石、绿松石
0.100000, 0.187250, 0.174500, 0.800000,
0.396000, 0.741510, 0.691020, 0.800000,
0.297254, 0.308290, 0.306678, 0.800000,
12.800000,
//黑塑料
0.000000, 0.000000, 0.000000, 1.000000,
0.010000, 0.010000, 0.010000, 1.000000,
0.500000, 0.500000, 0.500000, 1.000000,
32.000000,
//黑橡胶
0.020000, 0.020000, 0.020000, 1.000000,
0.010000, 0.010000, 0.010000, 1.000000,
0.400000, 0.400000, 0.400000, 1.000000,
10.000000,
//紫罗兰
0.110000, 0.060000, 0.090000, 1.000000,
0.430000, 0.470000, 0.540000, 1.000000,
0.330000, 0.330000, 0.520000, 1.000000,
22.000000
代码
# include < GL/glut.h >
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区等 */
void init(void)
{
GLfloat light_position [ ] = { 0., 1.5, 1.5, 0.0 };
glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //设置背景色为蓝色
glShadeModel ( GL_SMOOTH );
glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
}
/*调用 GLUT 函数,绘制一个球*/
void display ( void )
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
{
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};
GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};
GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };
GLfloat mat_shininess[] = { 76.800003}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
glPopMatrix();
glFlush ();
}
{
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
GLfloat mat_ambient[] = { 0.247250, 0.199500, 0.074500, 1.000000};
GLfloat mat_diffuse[] = { 0.751640, 0.606480, 0.226480, 1.000000};
GLfloat mat_specular[] = { 0.628281, 0.555802, 0.366065, 1.000000 };
GLfloat mat_shininess[] = { 51.200001}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
glPopMatrix();
}
glFlush ();
}
/* 定义 GLUT 的 reshape 函数,w、h 分别是输出图形的窗口的宽和高*/
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
if (w <= h)
glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,
1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //创建平行视景体
else
glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )
w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( ) ;
}
int main(int argc, char** argv)
{
glutInit (&argc, argv); // GLUT 环境初始化
glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH); // 显示模式初始化
glutInitWindowSize (300, 300); // 定义窗口大小
glutInitWindowPosition (100, 100); // 定义窗口位置
glutCreateWindow ( argv [ 0 ] ); // 显示窗口,窗口标题为执行函数名
init( );
glutDisplayFunc ( display ); // 注册 OpenGL 绘图函数(一种特殊的调用方式,下同)
glutReshapeFunc ( reshape ); // 注册窗口大小改变时的响应函数
glutMainLoop( ); // 进入 GLUT 消息循环,开始执行程序
return 0;
}
注意
值得一提的是glutSolidSphere 必须在指定变换矩阵和设置好材料属性之后,才应该被调用,否则在设置各种属性之前调用glutSolidSphere ,会出现其他的异常
例如
{
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};
GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};
GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };
GLfloat mat_shininess[] = { 76.800003}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glPopMatrix();
glFlush ();
}
{
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
glutSolidSphere (1.0, 40, 50); //半径为 1,40 条纬线,50 条经线
GLfloat mat_ambient[] = { 0.247250, 0.199500, 0.074500, 1.000000};
GLfloat mat_diffuse[] = { 0.751640, 0.606480, 0.226480, 1.000000};
GLfloat mat_specular[] = { 0.628281, 0.555802, 0.366065, 1.000000 };
GLfloat mat_shininess[] = { 51.200001}; //材质RGBA镜面指数,数值在0~128范围内
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glPopMatrix();
}
左右两个球的颜色刚好换掉