泰拉瑞亞mod制作技術:頂點繪制教程①(不算太專業(yè))
如果你是很想做什么花里胡哨的刀光之類的拖尾,那么這是必須的
1.頂點繪制介紹
在我們開始解釋頂點繪制的內容之前,我們需要從零開始了解:什么是頂點繪制。更準確的說:什么是XNA(monogame)的頂點繪制。
首先強烈推薦這個網址:LearnOpenGL CN (learnopengl-cn.github.io)
https://learnopengl-cn.github.io/
雖然不是XNA的頂點繪制,但計算機圖形學中的許多內容也可以通用。
接下來,下圖是GPU渲染圖像的流程,其中,藍色部分是大部分著色器語言(例如opengl)可以操作的。

可惜,受限于XNA傻逼的性能,這個著色器我們無法編寫:

那么,頂點著色器,就肯定是要有“點”的存在。
沒有頂點,繪制個空氣錘錘(
(說到這里,順便提一嘴,SpriteBatch的實現(xiàn)其本質也是頂點繪制,不過只是方便你繪制封裝的東西而已)
以及,片段著色器,也就是我們所說的像素著色器,同頂點著色器一樣,是可以被我們所編寫的。
不過接下來,我們并不會從頂點繪制的著色器開始,而是把它丟在后面去,因為我們需要先了解:“什么是頂點?怎么使用頂點繪制?”
2.如何使用頂點繪制
????2.1.頂點與頂點定義
不得不說,這確實是一個最基礎的東西,頂點繪制需要點。
那么接下來,我會從代碼上一步步分析,頂點的定義方法,與頂點是什么。
首先,如果我們想定義頂點,就需要整一個東西,繼承IVertexType。
就像下圖所示:

繼承了此接口,我們之后才能用這個頂點,生成頂點,調用頂點繪制。
但這個接口要求實現(xiàn)的屬性,我們總得讓它返回個東西。
于是我們建立一個靜態(tài)字段,解決這個問題:


我這里不會詳細去講VertexDeclaration這個東西,你只管往里面丟入需要的VertexElement(頂點元素)即可。
new VertexElement需要的參數(shù):
第一個參數(shù) int offset:頂點取值偏移。
首先頂點信息均以二進制傳入到GPU之類,但我總不能扔一串00100110010之類的東西給你,所以它肯定要分。
我們知道,計算機的最小單位是1bit,但通常我們是用1byte(8bit)做單位,這個玩意同上,所以它的單位是byte。
那么GPU不知道怎么給它切割byte,所以就需要我們動手告訴GPU如何處理傳入的二進制。
這個東西傳入的值,就是分割處。0就在傳入二進制開始切(相當于不切),1就是有一個1byte長度后切割,以此類推。
接下來,我們就是去計算大小就可以了。
舉例,如上圖所示,第一個元素從頭開始,所以為0。
第二個元素受到前面一個Vector2的影響,所以需要偏移兩個float大小,也就是8(byte)
以此類推。
下一個:VertexElementFormat-頂點元素格式
它就是頂點的元素格式,讓你可以使用一個頂點擁有對應的頂點元素。

它有以上格式,我們根據(jù)我們需要的頂點信息,三個元素分別選擇Vector2和Color和Vector2(或者Vector3)就行了。
再下一個:VertexElementUsage-頂點元素用法
它是每個頂點元素的使用方法,可以用的如同下圖所示:

我不會去講解其它的東西,我們在tr一般是要不著的,我們目前只需要:
Position(繪制在屏幕上的位置)
Color(繪制顏色,但其實還看你的shader有沒有用,一般時候是會用的)
TextureCoordinate(圖片紋理坐標,這對繪制尤為重要)
最后一個參數(shù):usageIndex-頂點元素用法索引
它的功能是:讓你指定每個語義的多個版本。
舉例:你有兩個Position需要傳入,那么你就需要用usageIndex區(qū)分Position0與Position1。

至于多個版本是什么?
這兩個就是POSITIONT(位置)的不同版本。

? ??2.2.頂點的連接種類
XNA里面的頂點繪制連線方法如下:

第一個:線的列表
它會將線連接起來,以兩個點的形式。
如果你要畫一個本來應該只用三個點就能畫出來的折線,現(xiàn)在你需要定義四個點,你才可以畫出折線,這就是它的不方便之處。
但這個玩意也是會有它的用武之地的,我們等下將下一個的區(qū)別就會知道。
連線數(shù)量:頂點數(shù)/2
?
第二個:線的條帶
它會自動按順序連接所有的頂點,十分方便。
但不好的地方也在此,你不能自由控制連接。
假如有四個點,你要畫兩條沒有頂點不重合的線段,那么這個玩意就用不了,因為它會按照順序連接線段,也就是:
1-2-3-4
而不是你想要的
1-2/3-4
連線數(shù)量:頂點數(shù)-1
第三個:(不清楚)點的列表。
繪制點,對,就一個點。
點數(shù)量=頂點數(shù)
?
第四個:三角形列表。
同第一個線的列表一樣,不過它是通過3個點形成一個三角形,同樣按順序去連接,沒什么可以講的,不過我們繪制圖形的時候都是需要使用三角形的,并且一個完整圖形需要兩個三角形
連線數(shù)量:頂點數(shù)/3
?
第五個:三角形條帶。
這個與線的條帶不大一樣。
不過同樣的地方在于,你不用重復定義頂點。

每次會從編號為i的位置以此取三個頂點,i/i+1/i+2為一組。
例如第一個三角形是V1V2V3,第二個就是V2V3V4,第三個就是V3V4V5,以此類推。
連線數(shù)量:頂點數(shù)-2
????2.3.頂點繪制的調用
(關于調用shader,這些東西請轉入:fs49.org,或者等之后有人找時間把shader篇寫了)
首先,調用頂點繪制,我們得找到:GraphicsDevice。
那么的tr的GraphicsDevice在哪里呢?
我們有幾種辦法:
Main.graphics.GraphicsDevice????
Main.instance.GraphicsDevice
Main.spriteBatch.GraphicsDevice(不確定是不是會有什么區(qū)別,理論來說,SpriteBatch是得通過GraphicsDevice創(chuàng)建的,所以返回的應該也是和graphics.GraphicsDevice? 與instance.GraphicsDevice同一個東西)
然后接下來,GraphicsDevice我們一律縮寫為:gd
然后gd里面有幾種繪制的方法:

我們最常用:

我們這期也就僅僅介紹最下面那個東西,上面那個東西講起來比較麻煩就不想講了(bushi)
這是DrawUserPrimitives的參數(shù)(不要理另一個重載,這玩意我也不理解)

第一個參數(shù)是啥上面講過了,你還不知道就往上看。
第二個參數(shù)是T(泛型,這里要求繼承了IVertexType)的實例。
第三個是頂點的偏移,這個玩意很奇怪,最好不動(你正常是要不著的)
第四個是繪制的數(shù)量,繪制什么與第一個參數(shù)相關聯(lián),就按連線數(shù)量的來填。