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

纹理映射非常实用,在游戏场景中已经无所不在了.

一个较少的多边形构成的模形,配合好的纹理贴图进行映射,可以得到逼真的效果.游戏中的天空,地面,墙面,和植物都是纹理贴图进行映射的.

例如最终幻想8的男女主角多边形数量是非常少的,完全靠贴图保证真实效果。

以前的游戏中的树木其实就是一个四边形加上树木贴图和一张TGA格式的透明度贴图镂空树木之外的背景实现的,因此这种树就是一个片。

一个导入的3ds模形,是可以带有纹理贴图和贴图坐标的,直接就可显示出来,不需要我们再做映射关系.

3dsmax中输出3ds模形时会保存贴图的纹理坐标信息,连同贴图一起,可以直接在OpenGL中显示。

我们自己画的三维体才需要做纹理映射,如果你需要的话.

下面给出一个演示代码,它实现了在box的6个面贴上6张不同的贴图,为了节省代码下载空间,我只用了4张贴图,剩下2张重复了。

源代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using SharpGL;
 10
 11 namespace SharpGLWinformsApplication1
 12 {
 13     //原创文章,出自"博客园, 猪悟能‘S博客" : http://www.cnblogs.com/hackpig/
 14     public partial class SharpGLForm : Form
 15     {
 16         float ang = 0f;
 17         SharpGL.SceneGraph.Assets.Texture[] textrue;
 18         float[] fLightPosition = new float[4] { 0.0f, 0.0f, 0.0f, 1.0f}; //5f, 8f, -8f, 1f };// 光源位置
 19         float[] fLightAmbient = new float[4] { 0f,0f, 0f, 1f };// 环境光参数
 20         float[] fLightDiffuse = new float[4] { 1f,1f, 1f, 1f };// 漫射光参数
 21         float[] fLightSpecular = new float[4] { 1f, 1f, 1f, 1f }; //镜面反射
 22
 23
 24         public SharpGLForm()
 25         {
 26             InitializeComponent();
 27
 28         }
 29
 30         private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
 31         {
 32             OpenGL gl = openGLControl.OpenGL;
 33             gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 34             gl.LoadIdentity();
 35             gl.Translate(-0.6f, 0f, 0.7f); gl.Rotate(ang, 0, 1, 0);
 36             drawBox(gl,0f,0f,0.5f);
 37             ang += 2f;
 38         }
 39
 40
 41         private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
 42         {
 43             textrue = new SharpGL.SceneGraph.Assets.Texture[6];
 44             for (int i = 0; i < 6; i++)
 45                 textrue[i] = new SharpGL.SceneGraph.Assets.Texture();
 46
 47
 48             OpenGL gl = openGLControl.OpenGL;
 49             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, fLightAmbient);//环境光源
 50             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, fLightDiffuse);//漫射光源
 51             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置
 52             gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, fLightSpecular);
 53
 54             textrue[0].Create(gl, "a1.jpg");
 55             textrue[1].Create(gl, "a2.jpg");
 56             textrue[2].Create(gl, "a3.jpg");
 57             textrue[3].Create(gl, "a4.jpg");
 58             textrue[4].Create(gl, "a1.jpg");
 59             textrue[5].Create(gl, "a2.jpg");
 60
 61
 62             gl.ClearColor(0.0f, 0.2f, 0.2f, 0.0f);
 63             gl.ClearDepth(1f);
 64             gl.DepthFunc(OpenGL.GL_LEQUAL);
 65             gl.Enable(OpenGL.GL_DEPTH_TEST);
 66             gl.ShadeModel(OpenGL.GL_SMOOTH);
 67
 68             gl.Enable(OpenGL.GL_LIGHTING);//开启光照
 69             gl.Enable(OpenGL.GL_LIGHT0);
 70             gl.Enable(OpenGL.GL_TEXTURE_2D);
 71             gl.Enable(OpenGL.GL_NORMALIZE);
 72         }
 73
 74         private void openGLControl_Resized(object sender, EventArgs e)
 75         {
 76             OpenGL gl = openGLControl.OpenGL;
 77             gl.MatrixMode(OpenGL.GL_PROJECTION);
 78             gl.LoadIdentity();
 79             gl.Perspective(45f, (double)Width / (double)Height, 1, 100.0);
 80             gl.LookAt(1,1, -1, 0, 0, 0, 0, 1, 0);
 81             gl.MatrixMode(OpenGL.GL_MODELVIEW);
 82         }
 83
 84
 85
 86         private void drawBox(OpenGL gl, float xPos, float yPos, float zPos)
 87         {
 88             gl.PushMatrix();
 89             gl.Translate(xPos, yPos, zPos);
 90
 91             textrue[0].Bind(gl);
 92             gl.Begin(OpenGL.GL_QUADS);
 93             {
 94                 //前
 95                 gl.Normal(1, 1, 1);
 96                 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
 97                 gl.TexCoord(1, 0); gl.Vertex(-1, 0, 0);
 98                 gl.TexCoord(1, 1); gl.Vertex(-1, -1, 0);
 99                 gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
100             }
101             gl.End();
102
103
104             textrue[1].Bind(gl);
105             gl.Begin(OpenGL.GL_QUADS);
106             {
107                 //底
108                 gl.Normal(1, 1, 1);
109                 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
110                 gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
111                 gl.TexCoord(1, 1); gl.Vertex(-1, 0, -1);
112                 gl.TexCoord(0, 1); gl.Vertex(-1, 0, 0);
113             }
114             gl.End();
115
116             textrue[2].Bind(gl);
117             gl.Begin(OpenGL.GL_QUADS);
118             {
119                 //左
120                 gl.Normal(1, 1, 1);
121                 gl.TexCoord(0, 0); gl.Vertex(-1, 0, 0);
122                 gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
123                 gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
124                 gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
125             }
126             gl.End();
127
128             textrue[3].Bind(gl);
129             gl.Begin(OpenGL.GL_QUADS);
130             {
131                 //右
132                 gl.Normal(1, 1, 1);
133                 gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
134                 gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
135                 gl.TexCoord(1, 1); gl.Vertex(0, -1, -1);
136                 gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
137             }
138             gl.End();
139
140             textrue[4].Bind(gl);
141             gl.Begin(OpenGL.GL_QUADS);
142             {
143                 //后
144                 gl.Normal(1, 1, 1);
145                 gl.TexCoord(0, 0); gl.Vertex(0, 0, -1);
146                 gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
147                 gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
148                 gl.TexCoord(0, 1); gl.Vertex(0, -1, -1);
149             }
150             gl.End();
151
152             textrue[5].Bind(gl);
153             gl.Begin(OpenGL.GL_QUADS);
154             {
155                 //顶
156                 gl.Normal(1, 1, 1);
157                 gl.TexCoord(0, 0); gl.Vertex(0, -1, 0);
158                 gl.TexCoord(1, 0); gl.Vertex(0, -1, -1);
159                 gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
160                 gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
161             }
162             gl.End();
163
164             gl.PopMatrix();
165
166         }
167
168
169     }
170 }

运行效果是下面这样的:

说个题外话:我抓取的Gif有1M多,怎么做可以让它小点? 请知道的朋友回帖告之,谢谢。

代码我也没什么好解释的,它非常简单。有疑问可以回贴。

本节源代码下载

原创文章,出自"博客园, 猪悟能‘S博客" : http://www.cnblogs.com/hackpig/

时间: 2024-08-22 22:01:29

SharpGL学习笔记(十五) 纹理映射的相关文章

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va

laravel3学习笔记(十五)

原作者博客:ieqi.net ==================================================================================================== 异常与日志 在应用中,我们总会遇到各种问题.各种异常,这时,记录异常发生时的状态就很重要,所以异常与日志是有着天然的关系的. 关于异常与日志的配置在文件 application/config/error.php 中. 文件中有四个配置项: 'ignore' => ar

西门子PLC学习笔记十五-(数据块及数据访问方式)

一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的. 数据块分共享数据块.背景数据块.用户自定义数据块,下面分别介绍. 1.共享数据块(全局数据块) 其用于存储全局数据,所有逻辑块(OB.FC.FB)都可以访问共享数据块中的数据. 2.背景数据块(私有存储区) 其用做功能块(FB)的"存储器".FB的参数和静态变量安排在它的背景数据块中.

SharpGL学习笔记(十八) 解析3ds模型并显示

笔者设想的3D仿真中的元件,是不可能都是“画”出来的.这样就玩复杂了,应该把任务分包出去,让善于制作模型的软件来制作三维模型,我们只需要解析并且显示它即可. 3dsmax制作三维模型的方便,快捷,专业,我想是没有人提反对意见的.它可以把制作好的模型导出为业界通用的3ds格式,如果你愿意的话,3ds格式也可以包含材质和uvw贴图坐标.这样的模型我们在opengl中导入后只用打光和显示,非常省事. 解析3ds格式比较复杂,不过读者可以拿来主义,直接用下面的代码就可以了. 代码已经加入了必要的注释,笔

SharpGL学习笔记(十九) 摄像机漫游

所谓的摄像机漫游,就是可以在场景中来回走动. 现实中,我们通过眼睛观察东西,身体移动带动眼睛移动观察身边的事物,这也是在漫游. 在OpenGL中我们使用函数LookAt()来操作摄像机在三维场景中进行漫游. LookAt(double eyex, double eyey, double eyez, double centerx, double centery, double centerz, double upx, double upy, double upz); 我们通过改变LookAt的参数

Java基础学习笔记十五 集合、迭代器、泛型

Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 集合中存储的元素必须是引用类型数据 集合继承关系图 ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口.Collec

Android学习笔记十五.深入理解fragment(三) 之《兼容多分辨率的应用》实战

深入理解fragment(三) 之<兼容多分辨率的应用>实战 在上一篇博文中介绍了如何使用Android Fragment开发适用于大屏幕应用,现在我们在上一个应用的基础上继续学习如何使用Fragment开发兼容多分辨率的应用. 1.建立/res/values-large/refs.xml引用资源文件 为了开发兼顾屏幕分辨率的应用,我们需要建立一个引用资源文件,专门用于定义各种引用项.refs.xml引用资源文件中定义了一项引用,其作用就是标明activity_book_list实际引用(@)

SharpGL学习笔记(十) 常见的光源类型,创建光源

在OpenGL中,使用光源的特性组合,如颜色,位置,方向等等,可以创建多种不同类型的灯光. 常见的几种灯光类型有: 定向光源(directonal) 定位光源(positional) 衰减光源 聚光灯 下面我们用3dsmax中的光源模拟出OpenGL对应类型的光源,渲染出效果图供大家有个快速的印象. 注意一点的是下面图片中的灯光效果,都打开了投影效果,但是在OpenGL,投影并不是灯光的一种附带效果,需要我们额外的进行一些处理工作的. OpengGL中指的定向光源,指的光源设置在无穷远处,光线照

yii2源码学习笔记(十五)

这几天有点忙今天好些了,继续上次的module来吧 1 /** 2 * Returns the directory that contains the controller classes according to [[controllerNamespace]]. 3 *根据控制器的命名空间返回控制器的目录路径 4 * Note that in order for this method to return a value, you must define 5 * an alias for th