如果你是很想做什么花里胡哨的刀光之类的拖尾,那么这是必须的
(资料图)
在我们开始解释顶点绘制的内容之前,我们需要从零开始了解:什么是顶点绘制。更准确的说:什么是XNA(monogame)的顶点绘制。
首先强烈推荐这个网址:LearnOpenGL CN (learnopengl-cn.github.io)
https://learnopengl-cn.github.io/
虽然不是XNA的顶点绘制,但计算机图形学中的许多内容也可以通用。
接下来,下图是GPU渲染图像的流程,其中,蓝色部分是大部分着色器语言(例如opengl)可以操作的。
可惜,受限于XNA傻逼的性能,这个着色器我们无法编写:
那么,顶点着色器,就肯定是要有“点”的存在。
没有顶点,绘制个空气锤锤(
(说到这里,顺便提一嘴,SpriteBatch的实现其本质也是顶点绘制,不过只是方便你绘制封装的东西而已)
以及,片段着色器,也就是我们所说的像素着色器,同顶点着色器一样,是可以被我们所编写的。
不过接下来,我们并不会从顶点绘制的着色器开始,而是把它丢在后面去,因为我们需要先了解:“什么是顶点?怎么使用顶点绘制?”
不得不说,这确实是一个最基础的东西,顶点绘制需要点。
那么接下来,我会从代码上一步步分析,顶点的定义方法,与顶点是什么。
首先,如果我们想定义顶点,就需要整一个东西,继承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(位置)的不同版本。
XNA里面的顶点绘制连线方法如下:
第一个:线的列表
它会将线连接起来,以两个点的形式。
如果你要画一个本来应该只用三个点就能画出来的折线,现在你需要定义四个点,你才可以画出折线,这就是它的不方便之处。
但这个玩意也是会有它的用武之地的,我们等下将下一个的区别就会知道。
连线数量:顶点数/2
第二个:线的条带
它会自动按顺序连接所有的顶点,十分方便。
但不好的地方也在此,你不能自由控制连接。
假如有四个点,你要画两条没有顶点不重合的线段,那么这个玩意就用不了,因为它会按照顺序连接线段,也就是:
1-2-3-4
而不是你想要的
1-2/3-4
连线数量:顶点数-1
第三个:(不清楚)点的列表。
绘制点,对,就一个点。
点数量=顶点数
第四个:三角形列表。
同第一个线的列表一样,不过它是通过3个点形成一个三角形,同样按顺序去连接,没什么可以讲的,不过我们绘制图形的时候都是需要使用三角形的,并且一个完整图形需要两个三角形
连线数量:顶点数/3
第五个:三角形条带。
这个与线的条带不大一样。
不过同样的地方在于,你不用重复定义顶点。
每次会从编号为i的位置以此取三个顶点,i/i+1/i+2为一组。
例如第一个三角形是V1V2V3,第二个就是V2V3V4,第三个就是V3V4V5,以此类推。
连线数量:顶点数-2
(关于调用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