14、事例十四:材质:十二个材质球

namespace sharpGLTest14
{
    public partial class Form1 : Form
    {
        float[] fLightPosition = new float[4] { 0.0f, 3.0f, 2.0f, 0.0f }; //5f, 8f, -8f, 1f };// 光源位置 
        float[] fLightAmbient = new float[4] { 0f, 0f, 0f, 1f };// 环境光参数 
        float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 1f };// 漫射光参数
        float[] fLightSpecular = new float[4] { 1f, 1f, 1f, 1f }; //镜面反射

        public Form1()
        {
            InitializeComponent();
        }

        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, (double)Width / (double)Height, 1, 100.0);
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

        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 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);
            /*
             * 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的缺省值
             * 
             * */
            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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, 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, 0.5f, 30, 30, false); //(0.3f);
            Gl.PopMatrix();

            Gl.Flush();
        }

        //二次曲面球体
        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();
        }
    }
}
原文地址:https://www.cnblogs.com/lotuses/p/11360298.html