zoukankan      html  css  js  c++  java
  • 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/

     

     

     

  • 相关阅读:
    42. Trapping Rain Water
    223. Rectangle Area
    645. Set Mismatch
    541. Reverse String II
    675. Cut Off Trees for Golf Event
    安装 VsCode 插件安装以及配置
    向上取整 向下取整 四舍五入 产生100以内随机数
    JS 判断是否为数字 数字型特殊值
    移动端初始配置,兼容不同浏览器的渲染内核
    Flex移动布局中单行和双行布局的区别以及使用
  • 原文地址:https://www.cnblogs.com/hackpig/p/5833137.html
Copyright © 2011-2022 走看看