环球观热点:泰拉瑞亚mod制作技术:顶点绘制教程①(不算太专业)

2023-04-29 19:53:48 哔哩哔哩

如果你是很想做什么花里胡哨的刀光之类的拖尾,那么这是必须的


(资料图)

1.顶点绘制介绍

在我们开始解释顶点绘制的内容之前,我们需要从零开始了解:什么是顶点绘制。更准确的说:什么是XNA(monogame)的顶点绘制。

首先强烈推荐这个网址:LearnOpenGL CN (learnopengl-cn.github.io)

https://learnopengl-cn.github.io/

虽然不是XNA的顶点绘制,但计算机图形学中的许多内容也可以通用。

接下来,下图是GPU渲染图像的流程,其中,蓝色部分是大部分着色器语言(例如opengl)可以操作的。

可惜,受限于XNA傻逼的性能,这个着色器我们无法编写:

那么,顶点着色器,就肯定是要有“点”的存在。

没有顶点,绘制个空气锤锤(

(说到这里,顺便提一嘴,SpriteBatch的实现其本质也是顶点绘制,不过只是方便你绘制封装的东西而已)

以及,片段着色器,也就是我们所说的像素着色器,同顶点着色器一样,是可以被我们所编写的。

不过接下来,我们并不会从顶点绘制的着色器开始,而是把它丢在后面去,因为我们需要先了解:“什么是顶点?怎么使用顶点绘制?”

2.如何使用顶点绘制

2.1.顶点与顶点定义

不得不说,这确实是一个最基础的东西,顶点绘制需要点。

那么接下来,我会从代码上一步步分析,顶点的定义方法,与顶点是什么。

首先,如果我们想定义顶点,就需要整一个东西,继承IVertexType。

就像下图所示:

继承了此接口,我们之后才能用这个顶点,生成顶点,调用顶点绘制。

但这个接口要求实现的属性,我们总得让它返回个东西。

于是我们建立一个静态字段,解决这个问题:

我这里不会详细去讲VertexDeclaration这个东西,你只管往里面丢入需要的VertexElement(顶点元素)即可。

new VertexElement需要的参数:

第一个参数 int offset:顶点取值偏移。

首先顶点信息均以二进制传入到GPU之类,但我总不能扔一串00100110010之类的东西给你,所以它肯定要分。

我们知道,计算机的最小单位是1bit,但通常我们是用1byte(8bit)做单位,这个玩意同上,所以它的单位是byte。

那么GPU不知道怎么给它切割byte,所以就需要我们动手告诉GPU如何处理传入的二进制。

这个东西传入的值,就是分割处。0就在传入二进制开始切(相当于不切),1就是有一个1byte长度后切割,以此类推。

接下来,我们就是去计算大小就可以了。

举例,如上图所示,第一个元素从头开始,所以为0。

第二个元素受到前面一个Vector2的影响,所以需要偏移两个float大小,也就是8(byte)

以此类推。

下一个:VertexElementFormat-顶点元素格式

它就是顶点的元素格式,让你可以使用一个顶点拥有对应的顶点元素。

它有以上格式,我们根据我们需要的顶点信息,三个元素分别选择Vector2和Color和Vector2(或者Vector3)就行了。

再下一个:VertexElementUsage-顶点元素用法

它是每个顶点元素的使用方法,可以用的如同下图所示:

我不会去讲解其它的东西,我们在tr一般是要不着的,我们目前只需要:

Position(绘制在屏幕上的位置)

Color(绘制颜色,但其实还看你的shader有没有用,一般时候是会用的)

TextureCoordinate(图片纹理坐标,这对绘制尤为重要)

最后一个参数:usageIndex-顶点元素用法索引

它的功能是:让你指定每个语义的多个版本。

举例:你有两个Position需要传入,那么你就需要用usageIndex区分Position0与Position1。

至于多个版本是什么?

这两个就是POSITIONT(位置)的不同版本。

2.2.顶点的连接种类

XNA里面的顶点绘制连线方法如下:

第一个:线的列表

它会将线连接起来,以两个点的形式。

如果你要画一个本来应该只用三个点就能画出来的折线,现在你需要定义四个点,你才可以画出折线,这就是它的不方便之处。

但这个玩意也是会有它的用武之地的,我们等下将下一个的区别就会知道。

连线数量:顶点数/2

第二个:线的条带

它会自动按顺序连接所有的顶点,十分方便。

但不好的地方也在此,你不能自由控制连接。

假如有四个点,你要画两条没有顶点不重合的线段,那么这个玩意就用不了,因为它会按照顺序连接线段,也就是:

1-2-3-4

而不是你想要的

1-2/3-4

连线数量:顶点数-1

第三个:(不清楚)点的列表。

绘制点,对,就一个点。

点数量=顶点数

第四个:三角形列表。

同第一个线的列表一样,不过它是通过3个点形成一个三角形,同样按顺序去连接,没什么可以讲的,不过我们绘制图形的时候都是需要使用三角形的,并且一个完整图形需要两个三角形

连线数量:顶点数/3

第五个:三角形条带。

这个与线的条带不大一样。

不过同样的地方在于,你不用重复定义顶点。

每次会从编号为i的位置以此取三个顶点,i/i+1/i+2为一组。

例如第一个三角形是V1V2V3,第二个就是V2V3V4,第三个就是V3V4V5,以此类推。

连线数量:顶点数-2

2.3.顶点绘制的调用

(关于调用shader,这些东西请转入:fs49.org,或者等之后有人找时间把shader篇写了)

首先,调用顶点绘制,我们得找到:GraphicsDevice。

那么的tr的GraphicsDevice在哪里呢?

我们有几种办法:

Main.graphics.GraphicsDevice    

Main.instance.GraphicsDevice

Main.spriteBatch.GraphicsDevice(不确定是不是会有什么区别,理论来说,SpriteBatch是得通过GraphicsDevice创建的,所以返回的应该也是和graphics.GraphicsDevice  与instance.GraphicsDevice同一个东西)

然后接下来,GraphicsDevice我们一律缩写为:gd

然后gd里面有几种绘制的方法:

我们最常用:

我们这期也就仅仅介绍最下面那个东西,上面那个东西讲起来比较麻烦就不想讲了(bushi)

这是DrawUserPrimitives的参数(不要理另一个重载,这玩意我也不理解)

第一个参数是啥上面讲过了,你还不知道就往上看。

第二个参数是T(泛型,这里要求继承了IVertexType)的实例。

第三个是顶点的偏移,这个玩意很奇怪,最好不动(你正常是要不着的)

第四个是绘制的数量,绘制什么与第一个参数相关联,就按连线数量的来填。

标签:

相关文章
最新发布
精彩图文
精彩推送

Copyright @  2015-2018 人人it网版权所有  备案号:粤ICP备18023326号-36   联系邮箱:8557298@qq.com