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();
        }

    }
}

原文地址:https://www.cnblogs.com/lotuses/p/11360335.html

时间: 2024-11-13 09:01:20

16、事例十六:多重纹理映射的相关文章

15、事例十五:纹理映射

namespace sharpGLTest15 { public partial class SharpGLForm : Form { float ang = 0f; SharpGL.SceneGraph.Assets.Texture[] textrue; float[] fLightPosition = new float[4] { 0.0f, 0.0f, 0.0f, 1.0f }; //5f, 8f, -8f, 1f };// 光源位置 float[] fLightAmbient = new

16. 蛤蟆的数据结构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:"社会犹如一条船 ,每人都要有掌舵的准备.--易卜生" 我们来看下基数排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47760601 1.  基数排序 基数排序(radix sort)属于"分配式排序"(distributionsort),又称"桶子法"(bucket sort)或bin sort,顾名思义,

JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚.日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利 package Test03; import java.util.ArrayList; import java.util.List; import java.util.Random; public class

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

NeHe OpenGL教程 第四十六课:全屏反走样

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十六课:全屏反走样 全屏反走样 当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据.看看吧,驱动程序为你做完了一切. 在图形的绘制中,直线的走样是非常影响美观的,我们可以使用反走样解决这个问题.在众多的解决

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

【OpenCV十六新手教程】OpenCV角检测Harris角点检测

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中,我们一起探讨了OpenCV