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

        private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
        {
            textrue = new SharpGL.SceneGraph.Assets.Texture[6];
            for (int i = 0; i < 6; i++)
                textrue[i] = new SharpGL.SceneGraph.Assets.Texture();

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

            textrue[0].Create(gl, "a1.jpg");
            textrue[1].Create(gl, "a2.jpg");
            textrue[2].Create(gl, "a3.jpg");
            textrue[3].Create(gl, "a4.jpg");
            textrue[4].Create(gl, "a1.jpg");
            textrue[5].Create(gl, "a2.jpg");

            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_TEXTURE_2D);
            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, 0.01, 100.0);
            gl.LookAt(1, 1, -1, 0, 0, 0, 0, 1, 0);
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

        private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            gl.LoadIdentity();
            gl.Translate(-0.6f, 0f, 0.7f); gl.Rotate(ang, 0, 1, 0);
            drawBox(gl, 0f, 0f, 0.5f);
            ang += 2f;
        }
        private void drawBox(OpenGL gl, float xPos, float yPos, float zPos)
        {
            gl.PushMatrix();
            gl.Translate(xPos, yPos, zPos);

            textrue[0].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //前
                gl.Normal(1, 1, 1);
                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.End();

            textrue[1].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //底
                gl.Normal(1, 1, 1);
                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.End();

            //textrue[2].Bind(gl);
            //gl.Begin(OpenGL.GL_QUADS);
            //{
            //    //左
            //    gl.Normal(1, 1, 1);
            //    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.End();

            //textrue[3].Bind(gl);
            //gl.Begin(OpenGL.GL_QUADS);
            //{
            //    //右
            //    gl.Normal(1, 1, 1);
            //    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.End();

            textrue[4].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //后
                gl.Normal(1, 1, 1);
                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.End();

            textrue[5].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //顶
                gl.Normal(1, 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();

        }
    }
}

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

时间: 2024-11-03 02:34:11

15、事例十五:纹理映射的相关文章

SharpGL学习笔记(十五) 纹理映射

纹理映射非常实用,在游戏场景中已经无所不在了. 一个较少的多边形构成的模形,配合好的纹理贴图进行映射,可以得到逼真的效果.游戏中的天空,地面,墙面,和植物都是纹理贴图进行映射的. 例如最终幻想8的男女主角多边形数量是非常少的,完全靠贴图保证真实效果. 以前的游戏中的树木其实就是一个四边形加上树木贴图和一张TGA格式的透明度贴图镂空树木之外的背景实现的,因此这种树就是一个片. 一个导入的3ds模形,是可以带有纹理贴图和贴图坐标的,直接就可显示出来,不需要我们再做映射关系. 3dsmax中输出3ds

1.15 第十五天

栈:局部变量  向下增长 堆:程序员申请内存空间  向上增长  如:p1 = (char *)malloc(10);  堆 p2 = (char *)malloc(20);  堆 堆和栈的区别:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a:系统会自动在栈上为其开辟空间.而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10):开辟十个字节的空间.由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后

15. 蛤蟆的数据结构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序 本篇名言:"谁要是游戏人生 ,他就一事无成 ; 谁不能主宰自己 ,永远是一个奴隶.--歌德" 继续来看下堆排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47733553 1.  堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树

.top域名总量15强:商务中国第十五 持续负增长

IDC评述网(idcps.com)12月29日报道:据ntldstats.com最新数据显示,截止至2015年12月28日16时,国内外.top域名注册总量十五强排名情况,与上期12月15日对比,发生变化.华夏名网以.top域名总量5,732个位居第12,环比下滑1位.另外,西部数码.易名中国.中国数据坚守三甲,市场份额均达到10%,地位稳定.下面,请看IDC评述网整理的数据分析. (图)国内外域名服务商.top域名注册总量排行榜 观察上图数据,可知在国内外.top域名总量十五强排行榜上,中国共

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10

第十五篇 Integration Services:SSIS参数

本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到SSIS 2012.在这一篇,我们将探讨SSIS变量的姊妹:SSIS参数.我们将展示参数配置,通过包参数管理动态属性值,以及在SSIS包执行期间参数是如何配置和使用的.首先在SSDT-BI打开转换过的My_First_SSIS_Project,如图15.1所示:图15.1My_First_SSIS_P

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文