SharpGL學習筆記(十五) 紋理映射

来源:http://www.cnblogs.com/hackpig/archive/2016/09/02/5834058.html
-Advertisement-
Play Games

紋理映射非常實用,在游戲場景中已經無所不在了. 一個較少的多邊形構成的模形,配合好的紋理貼圖進行映射,可以得到逼真的效果.游戲中的天空,地面,牆面,和植物都是紋理貼圖進行映射的. 例如最終幻想8的男女主角多邊形數量是非常少的,完全靠貼圖保證真實效果。 以前的游戲中的樹木其實就是一個四邊形加上樹木貼圖 ...


紋理映射非常實用,在游戲場景中已經無所不在了.

一個較少的多邊形構成的模形,配合好的紋理貼圖進行映射,可以得到逼真的效果.游戲中的天空,地面,牆面,和植物都是紋理貼圖進行映射的.

例如最終幻想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/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本人系統win7專業版64位。 從5月底開始就時不時有藍屏發生,而且可以說是沒有任何徵兆就“啪”的一下藍了... 有時候是隔個四五天藍屏一次,有時候一天都能藍好幾次,實在是讓人惱火。 從第一次藍屏就開始尋找原因,直到一個月前才查到元凶,竟然就是Networx。作為一個藍屏小白,我做了挺多嘗試才最終找 ...
  • 自定義標題欄 一、設計界面樣式 <UserControl x:Class="WpfApplication6.TitleListControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="htt ...
  • WPF 自定義柱狀圖 當前的Telerik控制項、DevExpress控制項在圖表控制項方面做得不錯,但是有時項目中需要特定的樣式,不是只通過修改圖表的模板和樣式就能實現的。 或者說,通過修改當前的第三方控制項以達到項目中UI的界面效果,花費的時間遠比重新自定義一個控制項要長得多! 所以直接自定義柱狀圖吧~下 ...
  • 自定義雷達圖表如下: 1、創建UserControl,名為“RadarChartControl” 前臺: <UserControl x:Class="WpfApplication2.RadarChartControl" xmlns="http://schemas.microsoft.com/winf ...
  • http://www.cnblogs.com/bluestorm/p/3432190.html 問題:欄位初始值設定項無法引用非靜態欄位、方法或屬性的問題 下麵代碼出錯的原因,在類中定義的欄位為什麼不能用? public class Test {public Test(){}public int A ...
  • 1.定義基礎實體對象 2.定義業務實體對象 3.在DbContext類里重寫SaveChanges()方法 之所以選擇此方法,經過測試後最簡便方法。其他還有: 在OnSaveChanges(object obj, CollectionChangeEventArgs args)裡面去獲取實體狀態,根據 ...
  • 不同的xml文檔構可能要用到不同的方法進行解析這裡用到的是例如<student name="張三" id="1" sex="男"/>這樣的結構進行的解析 #region Xml文件常用操作 XmlDocument doc = new XmlDocument(); //創建文檔對象 doc.Load( ...
  • 什麼是觀察者模式? 摘自百度百科的說法:觀察者模式(有時又被稱為發佈(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...