• 12、事例十二:光源场景————光照、材质纹理(一)



    OpenGLControl控件属性中:
    DrawFPS:true、false 控制页面左下角显示draw Time
    RenderContextType:修改为FBO
    Dock:OpenGL窗口显示相对位置
    纹理使用:
    1、类中定义:
    SharpGL.SceneGraph.Assets.Texture textureBox = new SharpGL.SceneGraph.Assets.Texture();
    2、初始化OpenGL时创建:
    textureBox.Create(gl, "image.bmp");
    3、drawOpenGL时使用
    textureBox.Bind(gl);
    gl.Enable(OpenGL.GL_TEXTURE_2D); //启用纹理
    gl.Disable(OpenGL.GL_TEXTURE_2D); //关闭纹理

    namespace sharpGLTest12
    {
        public partial class Form1 : Form
        {
            private float rotation = 0.0f, rotation2 = 0f, rotation3 = 0f;
            SharpGL.SceneGraph.Assets.Texture textureBox = new SharpGL.SceneGraph.Assets.Texture();   //(1)纹理定义
    
            float[] fLightPosition = new float[4] { 16f, 9f, -18f, 0f };// 光源位置 
            float[] fLightAmbient = new float[4] { 1f, 1f, 1f, 0f };// 环境光参数 
            float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 0f };// 漫射光参数
    
            float[] fLightPosition2 = new float[4] { -7f, 5f, 2f, 0f };// 光源位置 
            float[] fLightAmbient2 = new float[4] { 0f, 0f, 1f, 0f };// 环境光参数 
            float[] fLightDiffuse2 = new float[4] { 0f, 0f, 1f, 0f };// 漫射光参数
    
            bool f1 = false;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
            {
                OpenGL gl = openGLControl.OpenGL;
                textureBox.Create(gl, "image.bmp");                                                     //(2)纹理创建  
    
                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_LIGHT1, OpenGL.GL_AMBIENT, fLightAmbient2);//环境光源 
                gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_DIFFUSE, fLightDiffuse2);//漫射光源 
                gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION, fLightPosition2);//光源位置 
    
                gl.Enable(OpenGL.GL_LIGHTING);//开启光照 
                gl.Enable(OpenGL.GL_LIGHT0);
                gl.Enable(OpenGL.GL_LIGHT1);
    
                //必须有,它用来自动归一化法线方向,因为光照效果由顶点和法线方向决定.
                gl.Enable(OpenGL.GL_NORMALIZE);
    
                gl.ClearColor(0, 0, 0, 0);
            }
    
            private void openGLControl_Resized(object sender, EventArgs e)
            {
                OpenGL gl = openGLControl.OpenGL;
                gl.MatrixMode(OpenGL.GL_PROJECTION);
                gl.LoadIdentity();
                gl.Perspective(60.0f, (double)Width / (double)Height, 0.01, 100.0);
                gl.LookAt(-2, 3, -7, -2, 0, 0, 0, 1, 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);
                gl.LoadIdentity();
                gl.Rotate(rotation3, 0, 1, 0);
                drawGrid(gl);                     //网格 —— 先画网格时,关闭灯光和纹理,否则网格和后续作图会受到影响,需要再开启
                drawLightPT(gl);                    //小正方体(慢)
                drawLightPT2(gl);                   //小正方体(快)
                drawTextrueBox(gl, 1, 0, 2);        //大正方体
                drawSphere(gl, 2, 20, 20, false);   //圆 —— 关闭纹理,否会受到Box材质设置状态的影响
    
                moveLightA(gl);
                rotation3 += 0.1f;
            }
    
            void drawSphere(OpenGL gl, double radius, int segx, int segy, bool isLines)
            {
    
                gl.PushMatrix();
                gl.Disable(OpenGL.GL_TEXTURE_2D);
                gl.Translate(-7f, -1f, 2f);
                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.GLU_FALSE);
                gl.Sphere(sphere, radius, segx, segy);
                gl.DeleteQuadric(sphere);
                gl.PopMatrix();
    
            }
    
            private void moveLightA(OpenGL gl)
            {
                if (!f1)
                    --fLightPosition[0];
                else
                    ++fLightPosition[0];
                if (fLightPosition[0] > 15f)
                {
                    f1 = !f1;
                }
                else if (fLightPosition[0] < -25f)
                {
                    f1 = !f1;
                }
                gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置 
            }
    
            private void drawTextrueBox(OpenGL gl, float xPos, float yPos, float zPos)
            {
                rotation += 3.0f;
                gl.PushMatrix();
                {
                    textureBox.Bind(gl);                                                          //(3)纹理在绘图时使用
                    gl.Enable(OpenGL.GL_TEXTURE_2D);
                    gl.Rotate(rotation, 0, 1, 0);
                    gl.Translate(-1, 2, -5);
                    gl.Scale(3, 3, 3);
                    drawBox(gl, xPos, yPos, zPos);
                }
                gl.PopMatrix();
            }
    
            private void drawLightPT2(OpenGL gl)
            {
    
                rotation2 += 4f;
                gl.PushMatrix();
                {
                    gl.LoadIdentity();
                    gl.Disable(OpenGL.GL_TEXTURE_2D);
                    gl.Color(0f, 1f, 1f);
                    gl.Scale(0.2, 0.2, 0.2);
                    gl.Rotate(rotation2, 0, 1, 0);
                    gl.Translate(-28, 8, 5);
    
                    drawBox(gl, 0, 0, 0);
                }
                gl.PopMatrix();
            }
    
            private void drawLightPT(OpenGL gl)
            {
                gl.PushMatrix();
                {
                    gl.Disable(OpenGL.GL_TEXTURE_2D);
                    gl.Color(0f, 1f, 1f);
                    gl.Scale(0.2, 0.2, 0.2);
                    gl.Translate(fLightPosition[0] - 5, fLightPosition[1] + 5, fLightPosition[2]);
                    drawBox(gl, 0, 0, 0);
                }
                gl.PopMatrix();
            }
    
            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(0, 0); gl.Vertex(0, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(-1, 0, 0);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, 0);
                gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
    
                //
                gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, 0, -1);
                gl.TexCoord(0, 1); gl.Vertex(-1, 0, 0);
    
                //
                gl.TexCoord(0, 0); gl.Vertex(-1, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
    
                //
                gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(0, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
    
                //
                gl.TexCoord(0, 0); gl.Vertex(0, 0, -1);
                gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(0, -1, -1);
    
                //
                gl.TexCoord(0, 0); gl.Vertex(0, -1, 0);
                gl.TexCoord(1, 0); gl.Vertex(0, -1, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
    
    
                gl.End();
                gl.PopMatrix();
    
            }
    
            void drawGrid(OpenGL gl)
            {
                /*
                 *   必须要关闭纹理和光照,否则画栅格时受到场景中灯光,或者材质设定的影响,栅格原来的颜色就没有了,
                 * 这个其实就是因为OpenGL是个状态机,其它部分代码改变了某些状态,画栅格就会继承改变
                 * */
                //关闭纹理和光照
                gl.Disable(OpenGL.GL_TEXTURE_2D);
                gl.Disable(OpenGL.GL_LIGHTING);
    
                //绘制过程
                gl.PushAttrib(OpenGL.GL_CURRENT_BIT);  //保存当前属性
                gl.PushMatrix();                        //压入堆栈
                gl.Translate(0f, -2f, 0f);
                gl.Color(0f, 0f, 1f);
    
                //在X,Z平面上绘制网格
                for (float i = -50; i <= 50; i += 1)
                {
                    //绘制线
                    gl.Begin(OpenGL.GL_LINES);
                    {
                        if (i == 0)
                            gl.Color(0f, 1f, 0f);
                        else
                            gl.Color(0f, 0f, 1f);
    
                        //X轴方向
                        gl.Vertex(-50f, 0f, i);
                        gl.Vertex(50f, 0f, i);
                        //Z轴方向 
                        gl.Vertex(i, 0f, -50f);
                        gl.Vertex(i, 0f, 50f);
    
                    }
                    gl.End();
                }
                gl.PopMatrix();
                gl.PopAttrib();
                gl.Enable(OpenGL.GL_LIGHTING);
            }
        }
    }
  • 相关阅读:
    你一定想知道的关于FPGA的那些事
    浅谈乘法器的用法
    “FPGA+云"助力高性能计算
    Lattice并购案&我国FPGA发展路径
    双口RAM,值得研究
    FPGA图像加速解决方案来了
    中断中需要面对的问题(二)
    中断中需要面对的问题(一)
    Spring MVC 笔记--配置基于JavaConfig
    Spring IOC/ AOP 笔记
  • 原文地址:https://www.cnblogs.com/lotuses/p/11360285.html
Copyright © 2020-2023  润新知