OpenGL学习笔记【8】——颜色材质

OpenGL学习笔记【8】——颜色材质

今天学习了颜色材质:奉上源代码:

#pragma comment(lib,  " glaux.lib " )
#include 
" gl\glaux.h "
#include 
< gl\glut.h >
float  yRot  =   0 ;
unsigned 
int  nPre  =   0 ;
void  display( void )
{
    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);    // 清楚颜色数据和深度数据(清屏)
    glColor3f(1.0,1.0,1.0);
    glLoadIdentity();        
//初始变换矩阵为单位矩阵

    GLfloat no_mat[] 
= {0.00.00.01.0};
    GLfloat mat_ambient[] 
= {1.01.01.01.0};
    GLfloat mat_diffuse[] 
= {1.00.00.01.0};
    GLfloat mat_specular[] 
=  {1.01.01.01.0};
    GLfloat no_shininess[] 
= {0.0};
    GLfloat low_shininess[] 
= {5.0};
    GLfloat hig_shininess[] 
= {100.0};
    GLfloat mat_emission[] 
= {0.3,0.80.01.0};



    glPushMatrix();            
//压入变换矩阵那

    
//材质设置有效一直保持到改变为止。
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, hig_shininess);
    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
    glColorMaterial(GL_FRONT,GL_DIFFUSE);    
//最开始颜色材质对应的是ambient的。所以要给为diffuse
    glColor4f(0,0,0,1);        
    glEnable(GL_COLOR_MATERIAL);        
//启动颜色材质


    glPushMatrix();
    glTranslatef(
-3.753.00.0);    //第一个球的位置    
    glColorMaterial(GL_FRONT, GL_SHININESS);    //这个事无效的
    glColor4f(0.00.01.01.0);        //颜色材质为蓝色
    glutSolidSphere(130,30);//利用库函数绘制一个半径为1的球体。
    glPopMatrix();            //弹出矩阵。

    glPushMatrix();
    glTranslatef(
-1.253.00.0);
    glColor4f(
1.00.01.01.0);    //颜色材质为紫色

    glutSolidSphere(
130,30);//利用库函数绘制一个半径为1的球体。
    glPopMatrix();

    glPushMatrix();        
    glTranslatef(
1.253.00.0);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    
//用设置矩阵堆栈的方式来用材质,发现他以颜色材质为准。
    glutSolidSphere(130,30);//利用库函数绘制一个半径为1的球体。
    glPopMatrix();

    
//第一行第三列绘制的球有漫反射光和镜面光,并有很亮的高光,而无环境光 
    glPushMatrix();
    glTranslatef(
1.250.00.0);
    glDisable(GL_COLOR_MATERIAL);        
//禁用颜色材质之后,就可以用堆栈方式了。
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glutSolidSphere(
130,30);//利用库函数绘制一个半径为1的球体。
    glPopMatrix();

    glPushMatrix();        
//这里会沿用以前的设置的材质。
    glTranslatef(3.750.00.0);
    glutSolidSphere(
130,30);//利用库函数绘制一个半径为1的球体。
    glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();            
//交换缓冲区。显示图形
}


// 初始化
void  init ( void
{
    glClearColor (
0.50.50.50.0);    //清理颜色,为黑色,(也可认为是背景颜色)


    GLfloat light_diffuse[]
= 1.01.01.01.0};//蓝色        //有灯光才能体现材质的效果,他的灯光的强度是与的关系。貌似是两个相乘什么的。(0-1)范围。
    GLfloat light_position[] = 032.00.0 };        //设置点光源的矩阵,这个向量也忒奇怪了,1不跟着变,0跟着变,设置为透视之后又是1跟着变,0不跟着变。
    GLfloat light_specular[] = 1.01.01.01.0 };        //反射光
    GLfloat light_ambient[] = {0.50.50.51.0};

    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);        
//,漫射光会产生漫射的效果和高光的效果
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);    //点光源没有漫射光的效果,会一直是黑色的。但会有高光反射的效果。
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);        //反射光基本没有效果。可能是我不知道吧

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);    
//如果什么都不设置,GL_LIGHT有默认的值。
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);    
    glEnable(GL_DEPTH_TEST);
}


// 当窗口大小改变时,会调用这个函数
void  reshape(GLsizei w,GLsizei h)
{
    glViewport(
0,0,w,h);        //设置视口
    glMatrixMode(GL_PROJECTION);    //设置矩阵模式为投影变换矩阵,
    glLoadIdentity();                //变为单位矩阵
    
//gluPerspective(60, (GLfloat)w / h, 0, 1000);    //设置投影矩阵
    glOrtho(-6.06.0-6.0 * h / w, 6.0* h / w, -1010);    //为了不变形,则要长和宽成比例
    glMatrixMode(GL_MODELVIEW);        //设置矩阵模式为视图矩阵(模型)
    glLoadIdentity();                //变为单位矩阵
}


int  main( int  argc,  char **  argv)
{
    glutInit(
&argc, argv);        //Opnegl初始化
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //设置显示模式为双缓冲,RGEBA

    glutInitWindowSize (
800600);            //窗口大小
    glutInitWindowPosition (100100);        //窗口位置
    glutCreateWindow ("hello");                //创建一个标题为hello的窗口
    init ();                                //初始化资源,这里一定要在创建窗口以后,不然会无效。
    glutDisplayFunc(display);                //窗口大小改变时的回调
    glutReshapeFunc(reshape);                //绘制图形时的回调
    glutMainLoop();                            //主循环。
    return 0;  
}

 

他和矩阵堆栈的材质不同,他是通过设置改变材质的什么属性,然后通过颜色来设置材质的,书上说他的效率要高一点。
相关函数;
glEnable(GL_COLOR_MATERIAL);  //启动颜色材质, 允许使用颜色材质。启动之后我们才能通过颜色来设置材质。
glDisable(GL_COLOR_MATERIAL);  //禁用颜色材质,禁用之后就不用颜色材质了。这样可以减小开销。
glColorMaterial(GL_FRONT,GL_DIFFUSE); 设置颜色改变哪个材质属性,和设置材质是差不多的,只是少了一个参数。第一个是材质面,第二个是材质类型枚举:环境光,漫反射等材质类型。
设置了之后我们通过
glColor4f(0,0,0,1); 来更改对应材质类型的材质了。
学习心得:
3.1使用颜色材质的优先级要比使用矩阵的高,也就是说使用了颜色材质设置之后,你的矩阵材质就会失效。
如果你没有设置对应的颜色材质,他才会去看是矩阵材质。所以一定程度上矩阵材质和颜色材质可以共存。他也会保存上一次的材质信息。及时你disable之后再enable,也会保存。所以要注意。
3.2开始使用glEnable(GL_COLOR_MATERIAL)的时候,改变颜色改变的是ambient材质。但是你定位改变材质类型之后,无论你多少次的disable和enable都是改变上次定位的材质属性。
3.3 glColorMaterial.设置颜色材质类型只能使有颜色的类型,例如漫反射,辐射,环境光,反射等,对于高光这种不是颜色中设置不可以的。

你可能感兴趣的:(OpenGL学习笔记【8】——颜色材质)