zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    Python爬虫常用之HtmlParser
    Python异常基础
    python开头——文件声明 详解
    if __name__ == '__main__' 详解
    python基础提高演练(名片管理系统的开发)
    python函数基础
    python中的运算符归类
    python中的if判断语句
    python中变量命名的基本规则,标识符和关键字
    python中变量的基本使用
  • 原文地址:https://www.cnblogs.com/lotuses/p/11360298.html
Copyright © 2011-2022 走看看