• 16、事例十六:多重纹理映射


    //自动生成出现问题,推荐采用传统新建winform形式
    namespace sharpGLTest16_1
    {
        public partial class Form1 : Form
        {
            static float wrap = 0;      // 用于雾的流动
            SharpGL.SceneGraph.Assets.Texture[] textureAry = new SharpGL.SceneGraph.Assets.Texture[4];
            float[] fLightPosition = new float[4] { 0.0f, 0.0f, 8.0f, 1.0f }; // 光源位置 
            float[] fLightAmbient = new float[4] { 1f, 1f, 1f, 1f };         // 环境光参数 
            float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 1f };         // 漫射光参数
    
            bool multitexturing = true;  
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
            {
                OpenGL gl = openGLControl.OpenGL;
                String[] fileName = new String[4] { "wall.bmp", "lightmap.bmp", "bitmap.bmp", "fog.bmp" };
                for (int i = 0; i < fileName.Length; i++)
                {
                    textureAry[i] = new SharpGL.SceneGraph.Assets.Texture();
                    if (textureAry[i].Create(gl, fileName[i]))
                    {
                        textureAry[i].Id = i;
                        textureAry[i].Name = fileName[i];
    
                    }
                }
    
                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.Enable(OpenGL.GL_LIGHTING);//开启光照 
                gl.Enable(OpenGL.GL_LIGHT0);
    
                gl.ClearColor(0.0f, 0.0f, 0.0f, 0.5f);
                gl.ClearDepth(1.0f);
                gl.DepthFunc(OpenGL.GL_LEQUAL);
                gl.Enable(OpenGL.GL_DEPTH_TEST);
                gl.ShadeModel(OpenGL.GL_SMOOTH);
    
                gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST);
                gl.Enable(OpenGL.GL_NORMALIZE);
    
                if (!initMultiTexture(gl))
                {
                    MessageBox.Show("您的硬件和驱动不支持多重纹理");
                    return;
                }
            }
    
    
            /// <summary>
            /// 检查多重纹理支持
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            bool isExtensionSupported(OpenGL gl, string input)
            {
                string extension = gl.GetString(OpenGL.GL_EXTENSIONS);
                return extension.IndexOf(input) >= 0;
            }
    
            bool initMultiTexture(OpenGL gl)
            {
                //检查是否支持扩展
                if (isExtensionSupported(gl, "GL_ARB_multitexture"))
                {
                    return true;
                }
                else
                    return false;
            }
    
            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);
                draw(gl);
            }
    
            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();
                draw(gl);
            }
    
            private void draw(OpenGL Gl)
            {
                Gl.LoadIdentity();
                Gl.Translate(0.0f, 0.0f, -10.0f);
    
                //激活纹理0,并绑定纹理
                Gl.ActiveTextureARB(OpenGL.GL_TEXTURE0_ARB);
                Gl.Enable(OpenGL.GL_TEXTURE_2D);
                textureAry[0].Bind(Gl);
    
                Gl.ActiveTextureARB(OpenGL.GL_TEXTURE1_ARB);
                //如果多重纹理启用,则启用该纹理
                if (multitexturing)
                    Gl.Enable(OpenGL.GL_TEXTURE_2D);
                else
                    Gl.Disable(OpenGL.GL_TEXTURE_2D);
                textureAry[1].Bind(Gl);
    
                // 绘制一个四方形墙面
                Gl.PushMatrix();
                {
                    Gl.Translate(-2.5f, 0f, 0f);
                    Gl.Scale(2.0f, 2.0f, 2.0f);
                    Gl.Begin(OpenGL.GL_QUADS);
                    {
                        //左上点
    
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 1.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f + wrap, 1.0f);
                        Gl.Vertex(-1, 1, 0);
    
                        // 左下点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 0.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f + wrap, 0.0f);
                        Gl.Vertex(-1, -1, 0);
    
                        // 右下点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 0.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f + wrap, 0.0f);
                        Gl.Vertex(1, -1, 0);
    
                        // 右上点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 1.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f + wrap, 1.0f);
                        Gl.Vertex(1, 1, 0);
                    }
                    Gl.End();
                }
                Gl.PopMatrix();
    
    
    
                Gl.ActiveTextureARB(OpenGL.GL_TEXTURE0_ARB);
                Gl.Enable(OpenGL.GL_TEXTURE_2D);
                textureAry[2].Bind(Gl);
    
                Gl.ActiveTextureARB(OpenGL.GL_TEXTURE1_ARB);
                if (multitexturing)
                    Gl.Enable(OpenGL.GL_TEXTURE_2D);
                else
                    Gl.Disable(OpenGL.GL_TEXTURE_2D);
                textureAry[3].Bind(Gl);
    
    
                Gl.PushMatrix();
                {
                    Gl.Translate(2.5f, 0, 0);
                    Gl.Scale(2.0f, 2.0f, 2.0f);
                    Gl.Begin(OpenGL.GL_QUADS);
                    {
                        // 左上点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 1.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f - wrap, 1.0f);
                        Gl.Vertex(-1, 1, 0);
    
                        // 左下点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 0.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f - wrap, 0.0f);
                        Gl.Vertex(-1, -1, 0);
    
                        // 右下点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 0.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f - wrap, 0.0f);
                        Gl.Vertex(1, -1, 0);
    
                        // 右上点
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 1.0f);
                        Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f - wrap, 1.0f);
                        Gl.Vertex(1, 1, 0);
                    }
                    Gl.End();
                    wrap += 0.01f;
                }
                Gl.PopMatrix();
    
                Gl.Flush();
            }
    
        }
    }
  • 相关阅读:
    WEB 3D SVG CAD 向量 几个实施(转)
    Dos.Common
    dos.orm
    php程序员招聘
    python之禅
    Electron
    MongoDB主从复制
    OSG开发概览
    从1-100中隔5个数去掉一个数,最后去掉的哪个数(如果数过一遍了从前端接着开始)?
    django/python日志logging 的配置以及处理
  • 原文地址:https://www.cnblogs.com/lotuses/p/11360335.html
Copyright © 2020-2023  润新知