真实感球绘制

真实感球的绘制关键函数:

  glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_shininess);//设置材料反射指数

glLightfv(GL_LIGHT0, GL_POSITION, light_position);//光源位置

glShadeModel ( GL_SMOOTH ); //设置阴影模型

glViewport (0, 0, (GLsizei) w, (GLsizei) h); 视点设计

glOrtho (x1,x2,y1,y2,z1,z2); //创建平行视景体


[cpp]  view plain  copy
  1. # include < GL/glut.h >   
  2. /* 初始化材料属性、光源属性、光照模型,打开深度缓冲区等 */   
  3. void init(void)   
  4. {   
  5.     GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };   
  6.     GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
  7.     glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //设置背景色为蓝色  
  8.     glShadeModel ( GL_SMOOTH );   
  9.     //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);  
  10.      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  11.     glLightfv ( GL_LIGHT0, GL_POSITION, light_position);   
  12.     glEnable (GL_LIGHTING);   
  13.     glEnable (GL_LIGHT0);   
  14.     glEnable (GL_DEPTH_TEST);   
  15. }   
  16. /*调用 GLUT 函数,绘制一个球*/   
  17. void display ( void )   
  18. {   
  19.     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
  20.     glutSolidSphere (1.0, 40, 50);    //半径为 1,40 条纬线,50 条经线  
  21.     glFlush ();   
  22. }   
  23. /* 定义 GLUT 的 reshape 函数,w、h 分别是输出图形的窗口的宽和高*/   
  24. void reshape (int w, int h)   
  25. {   
  26.     glViewport (0, 0, (GLsizei) w, (GLsizei) h);   
  27.     glMatrixMode (GL_PROJECTION);   
  28.     glLoadIdentity ( );   
  29.     if (w <= h)   
  30.         glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,   
  31.         1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //创建平行视景体  
  32.     else   
  33.         glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )   
  34.         w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);   
  35.     glMatrixMode ( GL_MODELVIEW );   
  36.     glLoadIdentity ( ) ;   
  37. }   
  38. int main(int argc, char** argv)   
  39. {   
  40.     glutInit (&argc, argv);     // GLUT 环境初始化  
  41.     glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH); // 显示模式初始化  
  42.     glutInitWindowSize (300, 300);       // 定义窗口大小  
  43.     glutInitWindowPosition (100, 100);   // 定义窗口位置    
  44.     glutCreateWindow ( argv [ 0 ] );   // 显示窗口,窗口标题为执行函数名  
  45.     init( );  
  46.     glutDisplayFunc ( display );    // 注册 OpenGL 绘图函数(一种特殊的调用方式,下同)   
  47.     glutReshapeFunc ( reshape );   // 注册窗口大小改变时的响应函数  
  48.     glutMainLoop( );      // 进入 GLUT 消息循环,开始执行程序  
  49.     return 0;   
  50. }   

效果图:



将init( )中的

[cpp]  view plain  copy
  1. GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };   
  2.     GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
  3.     glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //设置背景色为蓝色  
  4.     glShadeModel ( GL_SMOOTH );   
  5.     //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);  
  6.      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  


改为

[cpp]  view plain  copy
  1. GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };   
  2.     GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
  3.     GLfloat mat_shininess[] = { 50.0 };  
  4.     glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //设置背景色为蓝色  
  5.     glShadeModel ( GL_SMOOTH );   
  6.     //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);  
  7.      glMaterialfv(GL_FRONT, GL_SPECULAR, mat_diffuse);  
  8.      glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//设置材料反射指数  

即将漫射光GL_DIFFUSE改为镜面光GL_SPECULAR,可得效果



相应的还有环境光GL_AMBIENT,读者可执行尝试。

-----------------------------------------------------------




上面的代码是用glut,即openGL utilizing tool做的,还有一种做法是用OpenGL的AUX,要下载glaux.lib和glaux.h, 代码如下:

[cpp]  view plain  copy
  1. #include<GL/glut.h>  
  2. #include <gl/GLAUX.H>  
  3. #pragma comment(lib, "glaux")  
  4.   
  5. void myinit(void)  
  6. {  
  7.     GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };  
  8.     GLfloat mat_shininess[] = { 50.0 };  
  9.     GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };  
  10.   
  11.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);//set material 镜面光反射  
  12.     glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//设置材料反射指数  
  13.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);//光源位置  
  14.   
  15.     glEnable(GL_LIGHTING);  
  16.     glEnable(GL_LIGHT0);  
  17.     glDepthFunc(GL_LEQUAL);  
  18.     glEnable(GL_DEPTH_TEST);  
  19. }  
  20.   
  21. void display(void)  
  22. {  
  23.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  24.     auxSolidSphere(1.0);  
  25.     glFlush();  
  26. }  
  27.   
  28. void myReshape(GLsizei w, GLsizei h)  
  29. {  
  30.     glViewport(0, 0, w, h);  
  31.     glMatrixMode(GL_PROJECTION);  
  32.     glLoadIdentity();  
  33.     if (w <= h)   
  34.         glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,   
  35.         1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);  
  36.     else   
  37.         glOrtho (-1.5*(GLfloat)w/(GLfloat)h,   
  38.         1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);  
  39.     glMatrixMode(GL_MODELVIEW);  
  40.     glLoadIdentity();  
  41. }  
  42.   
  43.   
  44. int main(int argc, char** argv)  
  45. {  
  46.     auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH);  
  47.     auxInitPosition (0, 0, 500, 500);  
  48.     auxInitWindow ((LPCWSTR)"Lighting Sphere");  
  49.     myinit();  
  50.     auxReshapeFunc ((AUXRESHAPEPROC)myReshape);  
  51.     auxMainLoop((AUXMAINPROC)display);  
  52. }  

效果如下:



最后还看到一组超全的光亮度模型结果,代码在这里

结果如图:



from: http://blog.csdn.net/abcjennifer/article/details/8591038

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值