你的位置:首页 > ASP.net教程

[ASP.net教程]SharpGL学习笔记(十四) 材质:十二个材质球


 

材质颜色

OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。对环境光与漫反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光亮的高光将是白色的。

在真实世界中,白色物体在绿光照射下看起来是绿色而不是白色,红色物体在绿光照射下看起来是黑色,而有时同样颜色的物体在同样的光照下亮度却不同,这都是由于物体的材质不同造成的.场景中物体的颜色取决于物体材质的反射和透射属性.

 

材质RGB值与光源RGB值的关系

材质的颜色与光源的颜色有些不同。对于光源,R、G、B值等于R、G、B对其最大强度的百分比。若光源颜色的R、G、B值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;

若R=G=1.0,B=0.0,则光源为黄色。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R=1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。
同样,如果有两束光,相应的值分别为(R1、G1、B1)和(R2、G2、B2),则OpenGL将各个颜色成分相加,得到(R1+R2、G1+G2、B1+B2),若任一成分的和值大于1(超出了设备所能显示的亮度)则约简到1.0。下面一例程就说明了二者之间的关系。

材质的函数原型为:

public void Material(uint face, uint pname, float[] parameters);

face取值指明材质属性将应用于物体的哪个面:

     GL_FRONT   正面

          GL_BACK     背面

              GL_FRONT_AND_BACK  双面

pnam指出要设置的哪种材质属性,见下面表:

参数名

缺省值

说明

GL_AMBIENT

(0.2, 0.2, 0.2, 1.0)

材料的环境光颜色

GL_DIFFUSE

(0.8, 0.8, 0.8, 1.0)

材料的漫反射光颜色

GL_AMBIENT_AND_DIFFUSE

?

材料的环境光和漫反射光颜色

GL_SPECULAR

(0.0, 0.0, 0.0, 1.0)

材料的镜面反射光颜色

GL_SHINESS

0.0

镜面指数(光亮度)

GL_EMISSION

(0.0, 0.0, 0.0, 1.0)

材料的辐射光颜色

GL_COLOR_INDEXES

(0, 1, 1)

材料的环境光、漫反射光和镜面光颜色

函数glMaterial*()参数pname的缺省值

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

源代码如下:

 

 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using SharpGL; 10  11 namespace SharpGLWinformsApplication1 12 { 13   //原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/ 14   public partial class SharpGLForm : Form 15   { 16     float[] fLightPosition = new float[4] { 0.0f, 3.0f, 2.0f, 0.0f}; //5f, 8f, -8f, 1f };// 光源位置  17     float[] fLightAmbient = new float[4] { 0f,0f, 0f, 1f };// 环境光参数  18     float[] fLightDiffuse = new float[4] { 1f,1f, 1f, 1f };// 漫射光参数 19     float[] fLightSpecular = new float[4] { 1f, 1f, 1f, 1f }; //镜面反射 20  21  22     public SharpGLForm() 23     { 24       InitializeComponent(); 25     } 26  27     private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e) 28     { 29       OpenGL gl = openGLControl.OpenGL; 30       gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 31  32       draw(gl); 33     } 34  35  36     private void openGLControl_OpenGLInitialized(object sender, EventArgs e) 37     { 38       OpenGL gl = openGLControl.OpenGL; 39       gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, fLightAmbient);//环境光源  40       gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, fLightDiffuse);//漫射光源  41       gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置  42       //gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, fLightSpecular); 43      44  45       gl.ClearColor(0.0f, 0.2f, 0.2f, 0.0f); 46       gl.ClearDepth(1f); 47       gl.DepthFunc(OpenGL.GL_LEQUAL); 48       gl.Enable(OpenGL.GL_DEPTH_TEST); 49       gl.ShadeModel(OpenGL.GL_SMOOTH); 50  51       gl.Enable(OpenGL.GL_LIGHTING);//开启光照  52       gl.Enable(OpenGL.GL_LIGHT0); 53       gl.Enable(OpenGL.GL_NORMALIZE); 54     } 55  56     private void openGLControl_Resized(object sender, EventArgs e) 57     { 58       OpenGL gl = openGLControl.OpenGL; 59       gl.MatrixMode(OpenGL.GL_PROJECTION); 60       gl.LoadIdentity(); 61       gl.Perspective(45f, (double)Width / (double)Height, 1, 100.0); 62       gl.MatrixMode(OpenGL.GL_MODELVIEW); 63     } 64  65     private void draw(OpenGL Gl) 66     { 67       ///定义材质属性值 68       float[] no_mat = new float[] { 0.0f, 0.0f, 0.0f, 1.0f };    // 无材质颜色 69       float[] mat_ambient = new float[] { 0.7f, 0.7f, 0.7f, 1.0f };  // 环境颜色 70       float[] mat_ambient_color = new float[] { 0.8f, 0.6f, 0.2f, 1.0f }; 71       float[] mat_diffuse = new float[] { 0.2f, 0.5f, 0.8f, 1.0f };  // 散射颜色 72       float[] mat_specular = new float[] { 1.0f, 1.0f, 1.0f, 1.0f }; // 镜面反射颜色 73       float[] no_shininess = new float[] { 0.0f };          // 镜面反射指数为0 74       float[] low_shininess = new float[] { 5.0f };          // 镜面反射指数为5.0 75       float[] high_shininess = new float[] { 100.0f };        // 镜面反射指数为100.0 76       float[] mat_emission = new float[] { 0.3f, 0.2f, 0.3f, 0.0f }; // 发射光颜色 77  78       //清除缓存并重置单位矩阵 79       Gl.LoadIdentity(); 80  81       // 第一行第一列绘制的球仅有漫反射光而无环境光和镜面光。 82       Gl.PushMatrix(); 83       Gl.Translate(-2.0f, 1.5f, -7.0f); 84       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); 85       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); 86       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat); 87       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess); 88       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat); 89       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f); 90       Gl.PopMatrix(); 91  92       // 第一行第二列绘制的球有漫反射光和镜面光,并有低高光,而无环境光 93       Gl.PushMatrix(); 94       Gl.Translate(-0.5f, 1.5f, -7.0f); 95       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat); 96       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse); 97       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular); 98       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess); 99       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);100       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);101       Gl.PopMatrix();102 103       // 第一行第三列绘制的球有漫反射光和镜面光,并有很亮的高光,而无环境光 。*/104       Gl.PushMatrix();105       Gl.Translate(1f, 1.5f, -7.0f);106       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);107       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);108       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);109       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);110       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);111       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);112       Gl.PopMatrix();113 114       // 第一行第四列绘制的球有漫反射光和辐射光,而无环境和镜面反射光。*/115       Gl.PushMatrix();116       Gl.Translate(2.5f, 1.5f, -7.0f);117       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);118       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);119       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);120       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);121       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);122       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);123       Gl.PopMatrix();124 125 126 127 128       // 第二行第一列绘制的球有漫反射光和环境光,而镜面反射光。*/129       Gl.PushMatrix();130       Gl.Translate(-2.0f, 0f, -7.0f);131       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);132       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);133       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);134       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);135       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);136       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);137       Gl.PopMatrix();138 139       // 第二行第二列绘制的球有漫反射光、环境光和镜面光,且有低高光。*/140       Gl.PushMatrix();141       Gl.Translate(-0.5f, 0f, -7.0f);142       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);143       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);144       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);145       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess);146       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);147       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);148       Gl.PopMatrix();149 150       // 第二行第三列绘制的球有漫反射光、环境光和镜面光,且有很亮的高光。*/151       Gl.PushMatrix();152       Gl.Translate(1f, 0f, -7.0f);153       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);154       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);155       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);156       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);157       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);158       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);159       Gl.PopMatrix();160 161       // 第二行第四列绘制的球有漫反射光、环境光和辐射光,而无镜面光。*/162       Gl.PushMatrix();163       Gl.Translate(2.5f, 0f, -7.0f);164       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);165       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);166       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);167       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);168       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);169       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);170       Gl.PopMatrix();171 172 173 174 175 176       // 第三行第一列绘制的球有漫反射光和有颜色的环境光,而无镜面光。*/177       Gl.PushMatrix();178       Gl.Translate(-2.0f, -1.5f, -7.0f);179       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);180       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);181       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);182       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);183       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);184       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);185       Gl.PopMatrix();186 187       // 第三行第二列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有低高光。*/188       Gl.PushMatrix();189       Gl.Translate(-0.5f, -1.5f, -7.0f);190       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);191       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);192       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);193       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess);194       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);195       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);196       Gl.PopMatrix();197 198       // 第三行第三列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有很亮的高光。*/199       Gl.PushMatrix();200       Gl.Translate(1f, -1.5f, -7.0f);201       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);202       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);203       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);204       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);205       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);206       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);207       Gl.PopMatrix();208 209       // 第三行第四列绘制的球有漫反射光和有颜色的环境光以及辐射光,而无镜面光。*/210       Gl.PushMatrix();211       Gl.Translate(2.5f, -1.5f, -7.0f);212       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);213       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);214       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);215       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);216       Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);217       drawSphere(Gl, 0f, 0f, 0f, 0.5f, 30, 30, false); //(0.3f);218       Gl.PopMatrix();219 220       Gl.Flush();  221     }222 223     private void drawBox(OpenGL gl, float xPos, float yPos, float zPos)224     {225       gl.PushMatrix();226       gl.Translate(xPos, yPos, zPos);227 228       gl.Begin(OpenGL.GL_QUADS);229 230       //前231       gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);232       gl.TexCoord(1, 0); gl.Vertex(-1, 0, 0);233       gl.TexCoord(1, 1); gl.Vertex(-1, -1, 0);234       gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);235 236       //底237       gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);238       gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);239       gl.TexCoord(1, 1); gl.Vertex(-1, 0, -1);240       gl.TexCoord(0, 1); gl.Vertex(-1, 0, 0);241 242       //左243       gl.TexCoord(0, 0); gl.Vertex(-1, 0, 0);244       gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);245       gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);246       gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);247 248       //右249       gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);250       gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);251       gl.TexCoord(1, 1); gl.Vertex(0, -1, -1);252       gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);253 254       //后255       gl.TexCoord(0, 0); gl.Vertex(0, 0, -1);256       gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);257       gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);258       gl.TexCoord(0, 1); gl.Vertex(0, -1, -1);259 260       //顶261       gl.TexCoord(0, 0); gl.Vertex(0, -1, 0);262       gl.TexCoord(1, 0); gl.Vertex(0, -1, -1);263       gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);264       gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);265 266 267       gl.End();268       gl.PopMatrix();269 270     }271 272     void drawSphere(OpenGL gl,float x,float y,float z, double radius, int segx, int segy, bool isLines)273     {274       gl.PushMatrix();275       gl.Translate(x, y, z);276       var sphere = gl.NewQuadric();277  278       if (isLines)279         gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES);280       else281         gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS);282       gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH);283       gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE);284       gl.QuadricTexture(sphere, (int)OpenGL.GL_FALSE);285       gl.Sphere(sphere, radius, segx, segy);286       gl.DeleteQuadric(sphere);287       gl.PopMatrix();288     }289 290     void drawSphere1(OpenGL gl, float xx, float yy, float zz, float radius, float M, float N, bool isLines)291     {292       const float PI = 3.1415926f;293       float step_z = (float)Math.PI / M;294       float step_xy = 2 * PI / N;295       float[] x = new float[4] { 0, 0, 0, 0 };296       float[] y = new float[4] { 0, 0, 0, 0 };297       float[] z = new float[4] { 0, 0, 0, 0 };298 299       float angle_z = 0.0f;300       float angle_xy = 0.0f;301       int i = 0, j = 0;302       gl.Begin(OpenGL.GL_QUADS);303 304       for (i = 0; i < M; i++)305       {306         angle_z = i * step_z;307         for (j = 0; j < N; j++)308         {309           angle_xy = j * step_xy;310 311           x[0] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy));312           y[0] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy));313           z[0] = (float)(radius * Math.Cos(angle_z));314 315           x[1] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy));316           y[1] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy));317           z[1] = (float)(radius * Math.Cos(angle_z + step_z));318 319           x[2] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy + step_xy));320           y[2] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy + step_xy));321           z[2] = (float)(radius * Math.Cos(angle_z + step_z));322 323           x[3] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy + step_xy));324           y[3] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy + step_xy));325           z[3] = (float)(radius * Math.Cos(angle_z));326 327           for (int k = 0; k < 4; k++)328           {329             gl.Normal(-1, -1, -1);330             gl.Vertex(xx + x[k], yy + y[k], zz + z[k]);331           }332         }333       }334       gl.End();335     }336 337   }338 }

 

效果如下图所示:

 

 以上程序运行结果是绘制12个球(3行4列)。第一行的球材质都没有环境反射光,第二行的都有一定的环境反射光,第三行的都有某种颜色的环境光。而第一列的球材质仅有蓝色的漫反射光;第二列的不仅有蓝漫反射光,而且还有镜面反射光,较低的高光;第三列的不仅有蓝漫反射光,而且还有镜面反射光,很亮的高光;第四列的还包括辐射光,但无镜面光。

这个程序运用矩阵堆栈多次调用glMaterialfv()来设置每个球的材质,也就是改变同一场景中的不同物体的颜色。但由于这个函数的应用有个性能开销,因此建议最好尽可能少的改变材质,以减少改变材质时所带来的性能开销,可采用另一种方式即改变材质颜色,相应函数为glColorMaterial(),说明如下:

void ColorMaterial(GLenum face,GLenummode);

函数参数face指定面,值有GL_FRONT、GL_BACK或GL_FRONT_AND_BACK(缺省值)。mode指定材质成分,值有GL_AMBIENT、GL_DIFFUSE、GL_AMBIENT_AND_DIFFUSE(缺省值)、GL_SPECULAR或GLEMISSION。

  注意:这个函数说明了两个独立的值,第一个参数说明哪一个面和哪些面被修改,而第二个参数说明这些面的哪一个或哪些材质成分要被修改。OpenGL并不为每一种face保持独立的mode变量。在调用ColorMterial()以后,首先需要用GL_COLOR_MATERIAL作为参数调用glEnable()来启动颜色材质,然后在绘图时调用glColor*()来改变当前颜色,或用Material()来改变材质成分。当不用这种方式来改变材质时,可调用Disable(GL_COLOR_MATERIAL)来关闭取消。如下面一段代码:

  ColorMaterial(GL_FRONT,GL_DIFFUSE);
  Enable(GL_COLOR_MATERIAL);
  Color(0.3,0.5,0.7);
  //这里画对象
  glcolor3f(0.0,1.0,0.0);
  //这里画对象
  Disable(GL_COLOR_MATERIAL);

 

本节源代码下载

 

原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/