材质颜色

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的缺省值

  

源代码如下:

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using SharpGL;

 namespace SharpGLWinformsApplication1
 {
   //原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/
     public partial class SharpGLForm : Form
     {
         ] { 0.0f, 3.0f, 2.0f, 0.0f}; //5f, 8f, -8f, 1f };// 光源位置
         ] { 0f,0f, 0f, 1f };// 环境光参数
         ] { 1f,1f, 1f, 1f };// 漫射光参数
         ] { 1f, 1f, 1f, 1f }; //镜面反射

         public SharpGLForm()
         {
             InitializeComponent();
         }

         private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
         {
             OpenGL gl = openGLControl.OpenGL;
             gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

             draw(gl);
         }

         private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
         {
             OpenGL gl = openGLControl.OpenGL;
             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, fLightAmbient);//环境光源
             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, fLightDiffuse);//漫射光源
             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置
             //gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, fLightSpecular);

             gl.ClearColor(0.0f, 0.2f, 0.2f, 0.0f);
             gl.ClearDepth(1f);
             gl.DepthFunc(OpenGL.GL_LEQUAL);
             gl.Enable(OpenGL.GL_DEPTH_TEST);
             gl.ShadeModel(OpenGL.GL_SMOOTH);

             gl.Enable(OpenGL.GL_LIGHTING);//开启光照
             gl.Enable(OpenGL.GL_LIGHT0);
             gl.Enable(OpenGL.GL_NORMALIZE);
         }

         private void openGLControl_Resized(object sender, EventArgs e)
         {
             OpenGL gl = openGLControl.OpenGL;
             gl.MatrixMode(OpenGL.GL_PROJECTION);
             gl.LoadIdentity();
             gl.Perspective(45f, (, 100.0);
             gl.MatrixMode(OpenGL.GL_MODELVIEW);
         }

         private void draw(OpenGL Gl)
         {
             ///定义材质属性值
             float[] no_mat = new float[] { 0.0f, 0.0f, 0.0f, 1.0f };        // 无材质颜色
             float[] mat_ambient = new float[] { 0.7f, 0.7f, 0.7f, 1.0f };   // 环境颜色
             float[] mat_ambient_color = new float[] { 0.8f, 0.6f, 0.2f, 1.0f };
             float[] mat_diffuse = new float[] { 0.2f, 0.5f, 0.8f, 1.0f };   // 散射颜色
             float[] mat_specular = new float[] { 1.0f, 1.0f, 1.0f, 1.0f };  // 镜面反射颜色
             float[] no_shininess = new float[] { 0.0f };                    // 镜面反射指数为0
             float[] low_shininess = new float[] { 5.0f };                   // 镜面反射指数为5.0
             float[] high_shininess = new float[] { 100.0f };                // 镜面反射指数为100.0
             float[] mat_emission = new float[] { 0.3f, 0.2f, 0.3f, 0.0f };  // 发射光颜色

             //清除缓存并重置单位矩阵
             Gl.LoadIdentity();

             // 第一行第一列绘制的球仅有漫反射光而无环境光和镜面光。
             Gl.PushMatrix();
             Gl.Translate(-2.0f, 1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第一行第二列绘制的球有漫反射光和镜面光,并有低高光,而无环境光
             Gl.PushMatrix();
             Gl.Translate(-0.5f, 1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第一行第三列绘制的球有漫反射光和镜面光,并有很亮的高光,而无环境光 。*/
             Gl.PushMatrix();
             Gl.Translate(1f, 1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第一行第四列绘制的球有漫反射光和辐射光,而无环境和镜面反射光。*/
             Gl.PushMatrix();
             Gl.Translate(2.5f, 1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第二行第一列绘制的球有漫反射光和环境光,而镜面反射光。*/
             Gl.PushMatrix();
             Gl.Translate(-2.0f, 0f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第二行第二列绘制的球有漫反射光、环境光和镜面光,且有低高光。*/
             Gl.PushMatrix();
             Gl.Translate(-0.5f, 0f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第二行第三列绘制的球有漫反射光、环境光和镜面光,且有很亮的高光。*/
             Gl.PushMatrix();
             Gl.Translate(1f, 0f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第二行第四列绘制的球有漫反射光、环境光和辐射光,而无镜面光。*/
             Gl.PushMatrix();
             Gl.Translate(2.5f, 0f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第三行第一列绘制的球有漫反射光和有颜色的环境光,而无镜面光。*/
             Gl.PushMatrix();
             Gl.Translate(-2.0f, -1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第三行第二列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有低高光。*/
             Gl.PushMatrix();
             Gl.Translate(-0.5f, -1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, low_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第三行第三列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有很亮的高光。*/
             Gl.PushMatrix();
             Gl.Translate(1f, -1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, high_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, no_mat);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             // 第三行第四列绘制的球有漫反射光和有颜色的环境光以及辐射光,而无镜面光。*/
             Gl.PushMatrix();
             Gl.Translate(2.5f, -1.5f, -7.0f);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT, mat_ambient_color);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_DIFFUSE, mat_diffuse);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, no_mat);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, no_shininess);
             Gl.Material(OpenGL.GL_FRONT, OpenGL.GL_EMISSION, mat_emission);
             drawSphere(Gl, 0f, 0f, 0f, , , false); //(0.3f);
             Gl.PopMatrix();

             Gl.Flush();
         }

         private void drawBox(OpenGL gl, float xPos, float yPos, float zPos)
         {
             gl.PushMatrix();
             gl.Translate(xPos, yPos, zPos);

             gl.Begin(OpenGL.GL_QUADS);

             //前
             gl.TexCoord(, ); gl.Vertex(, , );
             gl.TexCoord(, ); gl.Vertex(-, , );
             gl.TexCoord(, ); gl.Vertex(-, -, );
             gl.TexCoord(, ); gl.Vertex(, -, );

             //底
             gl.TexCoord(, ); gl.Vertex(, , );
             gl.TexCoord(, ); gl.Vertex(, , -);
             gl.TexCoord(, ); gl.Vertex(-, , -);
             gl.TexCoord(, ); gl.Vertex(-, , );

             //左
             gl.TexCoord(, ); gl.Vertex(-, , );
             gl.TexCoord(, ); gl.Vertex(-, , -);
             gl.TexCoord(, ); gl.Vertex(-, -, -);
             gl.TexCoord(, ); gl.Vertex(-, -, );

             //右
             gl.TexCoord(, ); gl.Vertex(, , );
             gl.TexCoord(, ); gl.Vertex(, , -);
             gl.TexCoord(, ); gl.Vertex(, -, -);
             gl.TexCoord(, ); gl.Vertex(, -, );

             //后
             gl.TexCoord(, ); gl.Vertex(, , -);
             gl.TexCoord(, ); gl.Vertex(-, , -);
             gl.TexCoord(, ); gl.Vertex(-, -, -);
             gl.TexCoord(, ); gl.Vertex(, -, -);

             //顶
             gl.TexCoord(, ); gl.Vertex(, -, );
             gl.TexCoord(, ); gl.Vertex(, -, -);
             gl.TexCoord(, ); gl.Vertex(-, -, -);
             gl.TexCoord(, ); gl.Vertex(-, -, );

             gl.End();
             gl.PopMatrix();

         }

         void drawSphere(OpenGL gl,float x,float y,float z, double radius, int segx, int segy, bool isLines)
         {
             gl.PushMatrix();
             gl.Translate(x, y, z);
             var sphere = gl.NewQuadric();

             if (isLines)
                 gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES);
             else
                 gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS);
             gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH);
             gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE);
             gl.QuadricTexture(sphere, (int)OpenGL.GL_FALSE);
             gl.Sphere(sphere, radius, segx, segy);
             gl.DeleteQuadric(sphere);
             gl.PopMatrix();
         }

         void drawSphere1(OpenGL gl, float xx, float yy, float zz, float radius, float M, float N, bool isLines)
         {
             const float PI = 3.1415926f;
             float step_z = (float)Math.PI / M;
              * PI / N;
             ] { , , ,  };
             ] { , , ,  };
             ] { , , ,  };

             float angle_z = 0.0f;
             float angle_xy = 0.0f;
             , j = ;
             gl.Begin(OpenGL.GL_QUADS);

             ; i < M; i++)
             {
                 angle_z = i * step_z;
                 ; j < N; j++)
                 {
                     angle_xy = j * step_xy;

                     x[] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy));
                     y[] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy));
                     z[] = (float)(radius * Math.Cos(angle_z));

                     x[] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy));
                     y[] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy));
                     z[] = (float)(radius * Math.Cos(angle_z + step_z));

                     x[] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy + step_xy));
                     y[] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy + step_xy));
                     z[] = (float)(radius * Math.Cos(angle_z + step_z));

                     x[] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy + step_xy));
                     y[] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy + step_xy));
                     z[] = (float)(radius * Math.Cos(angle_z));

                     ; k < ; k++)
                     {
                         gl.Normal(-, -, -);
                         gl.Vertex(xx + x[k], yy + y[k], zz + z[k]);
                     }
                 }
             }
             gl.End();
         }

     }
 }

效果如下图所示:

以上程序运行结果是绘制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/

SharpGL学习笔记(十四) 材质:十二个材质球的更多相关文章

  1. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  2. SharpGL学习笔记(十一) 光源创建的综合例子:光源参数可调节的测试场景

    灯光的测试例子:光源参数可以调节的测试场景 先看一下测试场景和效果. 场景中可以切换视图, 以方便观察三维体和灯光的位置.环境光,漫射光,镜面反射光都可以在四种颜色间切换. 灯光位置和摄像机位置(Lo ...

  3. SharpGL学习笔记(七) OpenGL的变换总结

    笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...

  4. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  5. C++Primer第5版学习笔记(四)

    C++Primer第5版学习笔记(四) 第六章的重难点内容         你可以点击这里回顾第四/五章的内容       第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...

  6. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

  7. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. 【转】Pandas学习笔记(四)处理丢失值

    Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...

  9. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  10. VSTO学习笔记(四)从SharePoint 2010中下载文件

    原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...

随机推荐

  1. Java备份约9亿条数据

    需求:有一张表9亿多条数据,数据加索引总数据量61GB.考虑到这张表的大部分数据都不会再被使用并且大数据量可能影响整库的性能,所以决定将表里某一个时刻之前的数据备份到一张新表中,待备份完成后将旧表中已 ...

  2. 看过的bootstrap书籍(附下载地址)

    http://yun.baidu.com/share/link?shareid=3820784617&uk=1008683945 以下书籍下载地址. <BootStrap入门教程> ...

  3. Reso | liunx下longeneQQ和搜狗拼音

    sogoupinyin_2.0.0.0078_amd64.deb:   http://pan.baidu.com/s/1eSDLvEU WineQQ7.8-20151109-Longene .deb: ...

  4. SQL约束脚本的用法

    1.主键约束:要对一个列加主键约束的话,这列就必须要满足的条件就是分空因为主键约束:就是对一个列进行了约束,约束为(非空.不重复)以下是代码   要对一个列加主键,列名为id,表名为emp 格式为:a ...

  5. windows-install-python-and-sphinx(*.rst file)

    http://sphinx-doc.org/install.html#windows-install-python-and-sphinx

  6. date,datetime,timestamp 的区别

    date 表示年月日,如YY-MM-DD datetime 表示年月日和时间信息,如YY-MM-DD HH:MM:SS datestamp 和datetime表示的信息相同,但时间范围不同 时间范围 ...

  7. 统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

     一.程序思路及相关代码 首先打开文件,代码如下 FILE *fp; char fname[10]; printf("请输入要分析的文件名:\n"); scanf("%s ...

  8. python3 - 通过BeautifulSoup 4抓取百度百科人物相关链接

    导入需要的模块 需要安装BeautifulSoup from urllib.request import urlopen, HTTPError, URLError from bs4 import Be ...

  9. rails应用ajax之一:使用纯js方法

    考虑如下需求: 1. 用户输入一个用户名,当焦点跳出文本框时,检查该用户名是否有效 2. 动态更新检查的结果 我们使用ajax的方式来实现这个简单的功能,首先建立view:check.html.erb ...

  10. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...