• 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             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/

     

     

     

  • 相关阅读:
    关于数组的算法-编程之美读后感-1
    java学习笔记之线程1
    java学习笔记之IO一()
    java学习笔记之泛型
    java学习笔记之正则表达式
    Thinking in java学习笔记之String的不可变性
    Thinking in java学习笔记之map的应用
    Thinking in java学习笔记之set
    scrapy之中间件
    Linux之Redis-redis哨兵集群详解
  • 原文地址:https://www.cnblogs.com/hackpig/p/5833137.html
Copyright © 2020-2023  润新知