材质颜色
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 else 281 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/