《3D输出管道特效程式的设计ppt课件》由会员分享,可在线阅读,更多相关《3D输出管道特效程式的设计ppt课件(43页珍藏版)》请在金锄头文库上搜索。
1、12D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C#第六章第六章 3D 3D繪出管道流程、著色繪出管道流程、著色器與特效檔器與特效檔 .2本章目的n介紹3D繪出的管道流程 (rendering pipeline)、著色器(shader)、與特效檔(effect)。 .33D繪出的管道流程n是一系列的過程,描述如何將3D的模型經由頂點座標矩陣轉換、頂點顏色運算、像素顏色運算、像素貼圖運算等等一連串的處理,最後呈現成可繪出在螢幕的2D圖像 .4著色器(shader)n是將這個輸出過程的頂點運算與像素運算的部份以High-Level Shading Language (HLSL) 程式
2、語法撰寫,在繪圖卡的GPU上執行的技術 .5特效檔(effect)n是專案下的一個文字檔案,其內容包括頂點著色器程式、像素著色器程式以及相關設定的配對包裝檔案 .63D繪出的管道流程 .7頂點處理的細部流程 .8世界座標轉換n世界座標轉換是要將3D模型搬到世界舞台某個方向、位置、以及調整縮放比例的必要運算。 Matrix M1 = Matrix.CreateTranslation(1.0f, 2.0f, 3.0f); / 位移Matrix M2 = Matrix.CreateRotationX(MathHelper.PiOver2); / 旋轉Matrix M3 = Matrix.Create
3、Scale(1.5f, 2, 3); / 縮放Matrix MT = M1 * M2 * M3;.9視覺空間轉換n視覺空間轉換是當相機擺置好後,從相機看過去的景象。 Matrix ViewMatrix = Matrix.CreateLookAt( new Vector3(0.0f, 2.0f, 2.0f), / 相機觀測點 Vector3.Zero, / 相機目標點 Vector3.Up); / 相機的 上方向量.10背面剪裁n背面剪裁是預先將特定方向描述的三角面作剔除的動作,其目的是節省CPU運算量。通常我們只會要求繪出時,三角面只呈現出正面,而不呈現背面,因為背面是包藏在3D模型物體的內部
4、,正常的狀況下是看不到的 GraphicsDeviceManager graphics;graphics.GraphicsDevice.RenderState.CullMode = CullMode.CullClockwiseFace; / 將 順時間方向 的三角面剔除 或graphics.GraphicsDevice.RenderState.CullMode = CullMode.CullCounterClockwiseFace; / 將逆時間方向的三角面剔除(內定)或graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;
5、/ 三角面的正反面 都不剔除 .11燈光值計算n燈光值計算是將頂點依照頂點預設顏色、頂點法向量、光源顏色、光源向量等等因素計算後得到的頂點顏色。 BasicEffect basicEffect = new BasicEffect(graphics.GraphicsDevice, null);basicEffect.DiffuseColor = new Vector3(1.0f, 0, 0); / 紅色 擴散光basicEffect.AmbientLightColor = new Vector3(0.2f, 0.2f, 0.2f); / 環境光basicEffect.EmissiveColor
6、= new Vector3(0, 0, 1); / 自發光basicEffect.SpecularColor = new Vector3(1, 1, 1); / 反射光basicEffect.DirectionalLight0.Enabled = true;basicEffect.DirectionalLight0.DiffuseColor = new Vector3(1.0f, 1, 1); basicEffect.DirectionalLight0.Direction = new Vector3(1.0f, 0, 0); basicEffect.LightingEnabled = true
7、;.12剪輯n剪輯是將位於平頭角椎體之外的基本形狀剔除;位於平頭角椎體之內的基本形狀保留;部份位於平頭角椎體之內的基本形狀切割成保留與剔除兩部份。 .13投影空間轉換n投影空間轉換是將位於平頭角椎體之內的頂點,依照比例,壓縮成為 2 x 2 x 1 的立方體。所以離鏡頭比較遠的頂點的壓縮移動量就會比較大。 Matrix ProjectMatrix = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(45.0f), / 視角 1.333f, / 寬高比 1.0f, / 近平面 10000.0f); / 遠平面.14視口空間轉換n
8、視口空間轉換是將2 x 2 x 1 的立方體3D投影到視窗2D矩形畫面上的轉換。 .15填點處理n填點處理的部分主要是處理兩件事情n第一是依照程式的設定產生基本形狀n第二是以補插方式產生許多像素來將基本形狀填滿。 .16以補插方式填出頂點中的像素 .17紋理貼圖圖素的混合處 .18寫入後緩衝區前的幾項測試 .19頂點著色器以及像素著色器n早期遊戲3D皆使用固定的處理流程,程式終止要給予要設定的參數即可。n近年來由於繪圖卡功能的大幅提昇,繪圖卡已經取代CPU來作頂點處理以及像素處理。n我們要寫出頂點處理的小程式與像素處理的小程式來讓繪圖卡的GPU作運算。n這種可程式化,能讓GPU處理的小程式叫做
9、頂點著色器(Vertex Shader)以及像素著色器(Pixel Shader)。n著色器特效程式目前常用的有微軟的High-Level Shading Language、OpenGL Shading Language和Nvidia公司的Cg語言。.20頂點著色器以及像素著色器 .21特效檔的幾個區塊 .22特效檔透過全域變數接收主程式的參數值 .23頂點著色器函數 .24像素著色器函數 .25HLSL的基本資料型態 nBool 布林值 true、falsenint 32 位元 整數nhalf 16 位元 浮點數nfloat 32 位元 浮點數ndouble 64 位元 浮點數.26HLSL
10、的資料型態 nsampler取樣器nstruct結構ntexture紋理貼圖.27取樣器n取樣器是用來描述如何從紋理貼圖讀出圖素的方式 texture2D diffuseTexture;sampler2D diffuseSampler = sampler_stateTexture = diffuseTexture;MinFilter = Linear; / 線性取樣MagFilter = Linear;MipFilter = Linear;AddressU = Wrap; /環繞模式AddressV = Wrap;AddressW = Wrap;.28紋理貼圖的對應座標 .29紋理圖的定址模式
11、 .30HLSL的語意 .31頂點著色器的輸入語意 nPOSITION頂點座標float4nCOLOR頂點顏色float4nNORMAL頂點法向量float4nTEXCOORD頂點的紋理圖UV座標float4nTANGENT頂點的正切向量float4nBINORMAL頂點的binormal向量float4nBLENDINDICES頂點的骨骼混合索引值int4nBLENDWEIGHT頂點的骨骼混合權重float4.32頂點著色器的輸出語意 nPOSITION頂點座標float4nCOLOR頂點顏色float4nTEXCOORD頂點的紋理圖UV座標float4nFOG頂點霧化值float.33像素
12、著色器的輸入語意 nCOLOR像素顏色float4nTEXCOORD像素的紋理圖UV座標float4.34像素著色器的輸出語意 nCOLOR像素顏色float4nDEPTH像素的Z軸值(深度值)float.35HLSL語言內建函數語言內建函數ndot向量內積ncross向量外積nlerp線性內插nmul矩陣相承nnormalize向量單位化npow指數neflect反射向量nrefract折射向量nsaturate將值限制在 01 之間ntex2d2D紋理圖素採樣ntex3d3D紋理圖素採樣.363D模型、網格、網格零件、和效果的關係 .37Effects是全部網格零件的Effect的總集 .
13、38範例一:使用範例一:使用BasicEffect呈現一個呈現一個3D模型模型n加入3D模型(宣告及上載)n在LoadContent將模型內的骨架轉換矩陣拷貝出來n在Draw中一一畫出在模型中的每一個網格mesh).39範例一:使用範例一:使用BasicEffect呈現一個呈現一個3D模型模型protected override void LoadContent() / TODO: use this.Content to load your game content here myModel = this.Content.Load(“monster_01”); / 上載 / 3D 模型/ 將m
14、yModel模型內的骨轉換矩陣拷貝出來到一個矩陣 transforms = new MatrixmyModel.Bones.Count; myModel.CopyAbsoluteBoneTransformsTo(transforms); .40範例一:使用範例一:使用BasicEffect呈現一個呈現一個3D模型模型protected override void Draw(GameTime gameTime) .foreach (ModelMesh mesh in myModel.Meshes) / 設定網格的呈現效果 (世界、觀測、投影矩陣) foreach (BasicEffect eff
15、ect in mesh.Effects) effect.World = transformsmesh.ParentBone.Index * Matrix.CreateScale(0.01f); / 如果模型太大 就縮小一些 effect.World = effect.World* Matrix.CreateRotationY(modelRotation); effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 1.2f, 1.2f), Vector3.Zero, Vector3.Up); effect.Projection = Matrix.C
16、reatePerspectiveFieldOfView( MathHelper.ToRadians(45.0f), 1.333f, 1.0f, 10000.0f); / 畫出在 模型 中的 某一個 網格 mesh.Draw(); base.Draw(gameTime); .41範例一:使用範例一:使用BasicEffect呈現一個呈現一個3D模型模型n/ nprotected override void Update(GameTime gameTime)n / Allows the game to exitn if (GamePad.GetState(PlayerIndex.One).Butt
17、ons.Back = ButtonState.Pressed)n this.Exit();n/ 旋轉角度n modelRotation += 0.01f; n base.Update(gameTime);n .42範例二:使用範例二:使用BasicEffect呈現一個呈現一個3D模型模型n/ nprotected override void Update(GameTime gameTime)n / Allows the game to exitn if (GamePad.GetState(PlayerIndex.One).Buttons.Back = ButtonState.Pressed)n this.Exit();n/ 旋轉角度n modelRotation += 0.01f; n base.Update(gameTime);n .43The End.