VB6编程:DirectX 2D图形学习日志13对第8课的总结

VB6编程:DirectX 2D图形学习日志12对第8课的总结如下:
教程下载地址:https://download.csdn.net/download/gosub60/13696651
首先定义顶点类型,设置顶点缓冲区等,这方面的内容参考前边的源码和分析日记。

Private Vertex_List(3) As TLVERTEX '4个顶点将构成一个正方形。 此列表将用于
                                    'D3DPT_TRIANGLESTRIP
Private Vertex_List_2(5) As TLVERTEX '6个顶点也将通过使用2来形成一个正方形
                                      '三角形。 此列表将用于D3DPT_TRIANGLELIST
                                     
Private Vertex_List_3(5) As TLVERTEX '我们将使用它来创建一些自定义形状的多边形
                                      '“此列表将用于D3DPT_TRIANGLEFAN
                                     
Private Vertex_List_4(2) As TLVERTEX '3个顶点将形成一个三角形。

然后创建多边形:

 '创建多边形1。
    '---------------------------------------------------------------
    Vertex_List(0) = Create_TLVertex(0, 0, 0, 1, D3DColorRGBA(255, 0, 0, 0), 0, 0, 0)
    Vertex_List(1) = Create_TLVertex(100, 0, 0, 1, D3DColorRGBA(0, 255, 0, 0), 0, 1, 0)
    Vertex_List(2) = Create_TLVertex(0, 100, 0, 1, D3DColorRGBA(0, 0, 255, 0), 0, 0, 1)
    Vertex_List(3) = Create_TLVertex(100, 100, 0, 1, D3DColorRGBA(255, 0, 255, 0), 0, 1, 1)
    '---------------------------------------------------------------
    
    '创建多边形2。
    '---------------------------------------------------------------
    Vertex_List_2(0) = Create_TLVertex(120, 0, 0, 1, D3DColorRGBA(255, 0, 0, 0), 0, 0, 0)
    Vertex_List_2(1) = Create_TLVertex(220, 0, 0, 1, D3DColorRGBA(0, 255, 0, 0), 0, 1, 0)
    Vertex_List_2(2) = Create_TLVertex(120, 100, 0, 1, D3DColorRGBA(0, 0, 255, 0), 0, 0, 1)
    Vertex_List_2(3) = Create_TLVertex(220, 0, 0, 1, D3DColorRGBA(0, 255, 0, 0), 0, 1, 0)
    Vertex_List_2(4) = Create_TLVertex(220, 100, 0, 1, D3DColorRGBA(255, 0, 255, 0), 0, 1, 1)
    Vertex_List_2(5) = Create_TLVertex(120, 100, 0, 1, D3DColorRGBA(0, 0, 255, 0), 0, 0, 1)
    '---------------------------------------------------------------

    '创建多边形3。
    '---------------------------------------------------------------
    Vertex_List_3(0) = Create_TLVertex(100, 155, 0, 1, D3DColorRGBA(255, 0, 0, 0), 0, 0, 0)
    Vertex_List_3(1) = Create_TLVertex(150, 105, 0, 1, D3DColorRGBA(0, 255, 0, 0), 0, 0, 0)
    Vertex_List_3(2) = Create_TLVertex(250, 105, 0, 1, D3DColorRGBA(0, 0, 255, 0), 0, 0, 0)
    Vertex_List_3(3) = Create_TLVertex(300, 155, 0, 1, D3DColorRGBA(255, 0, 255, 0), 0, 0, 0)
    Vertex_List_3(4) = Create_TLVertex(250, 205, 0, 1, D3DColorRGBA(255, 255, 0, 0), 0, 0, 0)
    Vertex_List_3(5) = Create_TLVertex(150, 205, 0, 1, D3DColorRGBA(0, 255, 255, 0), 0, 0, 0)
    '---------------------------------------------------------------
    
    '创建多边形4。
    '---------------------------------------------------------------
    Vertex_List_4(0) = Create_TLVertex(0, 150, 0, 1, D3DColorRGBA(255, 0, 0, 0), 0, 0, 0)
    Vertex_List_4(1) = Create_TLVertex(100, 175, 0, 1, D3DColorRGBA(0, 255, 0, 0), 0, 1, 1)
    Vertex_List_4(2) = Create_TLVertex(25, 200, 0, 1, D3DColorRGBA(0, 0, 255, 0), 0, 0, 1)
    '---------------------------------------------------------------

然后对创建的多边形进行渲染:

'渲染代码在这里
            
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))
                
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLELIST, 2, Vertex_List_2(0), Len(Vertex_List_2(0))
            
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLEFAN, 4, Vertex_List_3(0), Len(Vertex_List_3(0))
             
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLELIST, 1, Vertex_List_4(0), Len(Vertex_List_4(0))

关于:三角形的元素
一个三角形由三个点定义,“点”也称为“顶点”。 具有唯一位置的三个顶点定义了唯一的三角形。 为了让 GPU 渲染三角形,我们必须告诉它三角形的三个顶点的位置。 对于 2D 示例,假设我们希望渲染一个三角形,例如图1中的三角形。我们将三个顶点与位置 (0,0) (0,1) 和 (1,0) 一起传递给GPU,然后 GPU有足够的信息来渲染我们想要的三角形。
三角形点位图
以下就是程序运行的结果,可以看出由三角形构建的图形方案的不同。
实例:由三角形创建的图形
为了渲染单个三角形,应用程序需要向GPU发送三个顶点。因此,顶点缓冲区中有三个顶点。 如果我们想渲染两个三角形怎么办? 一种方法是将6个顶点发送到GPU。 前三个顶点定义第一个三角形,后三个顶点定义第二个三角形。此拓扑称为三角形列表。 三角形列表具有易于理解的优点,但在某些情况下它们效率非常低。当连续渲染的三角形共享顶点时会出现这种情况。 例如,图3a左侧显示了由两个三角形组成的正方形:ABC 和 CBD。
图3a包含一个由两个三角形组成的正方形; 图3b包含由三个三角形组成的五边形。

(按照惯例,三角形通常通过按顺时针顺序列出它们的顶点来定义。)

如果我们使用三角形列表将这两个三角形发送到GPU ,我们的顶点缓冲区会这样:

A B C C B D

请注意,B和C在顶点缓冲区中出现两次,因为它们由两个三角形共享。
如果我们可以告诉 GPU 在渲染第二个三角形时,我们可以使顶点缓冲区更小,而不是从顶点缓冲区获取所有三个顶点,使用前一个三角形中的2个顶点,并从顶点缓冲区中仅获取1个顶点。 事实证明,这是由 Direct3D 支持的,拓扑结构称为 Triangle Strip(三角形带)。 渲染三角形带时,第一个三角形由顶点缓冲区中的前三个顶点定义。 下一个三角形由前一个三角形的最后两个顶点加上顶点缓冲区中的下一个顶点定义。 以图3a中的方块为例,使用三角形条带,顶点缓冲区看起来像:

A B C D

前三个顶点 A B C 定义第一个三角形。 第二个三角形由 B 和 C 定义,即第一个三角形的最后两个顶点加上D。因此,通过使用三角形带原始拓扑,顶点缓冲区大小从6个顶点变为4个顶点。 类似地,对于三个三角形,例如图3b中的三角形,使用三角形列表将需要顶点缓冲区,例如:

A B C C B D C D E

使用三角形带,顶点缓冲区的大小显着减少:

A B C D E

您可能已经注意到,在三角形条带示例中,第二个三角形定义为 B C D。这三个顶点不形成顺时针顺序。 这是使用三角形条带的自然现象。 为了克服这个问题,GPU 会自动交换来自前一个三角形的两个顶点的顺序。 它只对第二个三角形,第四个三角形,第六个三角形,第八个三角形等执行此操作。 这确保每个三角形由顶点以正确的缠绕顺序(在这种情况下为顺时针方向)定义。

那么为什么2D或3D的游戏需要三角形来渲染呢?因为:
三角网格(Triangle Mesh),游戏开发者会使用三角形网格来建模。三角形是表面的分段线性逼近,如果用多条相连的线段分段逼近一个函数或曲线。
实时渲染之所以选用三角形,是因为三角形有以下的优点:
三角形是最简单的多边形,少于3个顶点就不能成为一个表面;
三角形必然是平坦的,含4个或以上的顶点的多边形,不一定平坦,三个点确定一个平面,多余的点可能在这个面之上或者之下;
三角形经多种转换之后,仍然是三角形,这对于仿射转换和透视转换也成立。最坏的情况下,从三角形的边去看,三角形会退化为线段。在其它角度观察,仍能维持是三角形;
几乎所有商用图形加速硬件都是为三角形光栅化而设计的。

在3D模型中,通常面数越多(也就是三角形的数量),模型越精细,反之则越粗糙(根据面数多少也就有了高模与低模之分) ——(如下图所示)
图片来源:http://www.atangeo.com/examples/horse
所以从视觉和美术的角度来看,面数当然是多多益善,但是从程序和性能的角度来看,面数是越少越好,少即意味着运算量变小,渲染速度会更快、耗电量都降低不少,所以需要平衡。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gosub60

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值