• [DirectX 9.0笔记] 第三章 在Direct3D中绘制


    3.1 顶点/索引缓存

    顶点缓存是一块连续的存储了顶点数据的内存。同样的,一个索引缓存是一块连续的存储了索引数据的内存。我们使用顶点和索引缓存保存我们的数据是因为他们能被放置在显存中。渲染显存中的数据要比渲染系统内存中的数据快得多。在代码中,我们用IDirect3DVertexBuffer9接口来定义顶点缓存。用IDirect3DIndexBuffer9接口来定义索引缓存。

    3.1.1创建一个顶点和索引缓存

       

     

       

    这两个方法大部分参数是相同的,因此我们一起介绍它们。

    Length —— 分配给缓存的字节大小。假如想得到一个能存储8个顶点的顶点缓存,那么我们就要在顶点结构中设置这个参数为8 * sizeof ( Vertex ) 。

    Usage —— 指定关于怎样使用缓存的额外信息。这个值可以是0,没有标记,或者是下面标记的一个或多个的组合:

    D3DUSAGE_DYNAMIC——设置这个参数可以使缓存是动态的。在下一页说明静态和动态缓存。

    D3DUSAGE_POINTS——这个参数指定缓存存储原始点。原始点将在第14章粒子系统中介绍。这个参数仅仅用在顶点缓冲中。

    D3DUSAGE_SOFTWAREPROCESSING——使用软件顶点处理

    D3DUSAGE_WRITEONLY——指定应用程序只能写缓存。它允许驱动程序分配最适合的内存地址作为写缓存。注意如果从创建好的这种缓存中读数据,将会返回错误信息。

    FVF —— 存储在缓存中的顶点格式

    Pool —— 缓存放置在哪一个内存池中

    ppVertexBuffer ——返回创建好的顶点缓存的指针。

    pSharedHandle ——没有使用;设置为0。

    Format ——指定索引的大小;使用D3DFMT_ INDEX16设置16位索引,使用D3DFMT_ INDEX32设置32位索引。注意并非所有设备都支持32位索引;请检查设备能力。

    ppIndexBuffer ——返回创建好的索引缓存的指针。

       

       

    注意:不使用D3DUSAGE_DYNAMIC参数创建的缓存被叫做静态缓存。静态缓存通常被放置在显存中,在其中的数据能被很有效的处理。然而,对于静态缓存,从中读取和写入数据是很慢的,因为访问显存是很慢的。因为这个原因我们用静态缓存存储静态数据(不需要被经常改变的数据)。对于静态缓存地形和建筑物是很好的后选例子,因为在应用程序中他们通常不需要被改变。静态缓存应该在应用程序初始话的时候就被填充好,而不是在运行时才做。

       

    注意:使用D3DUSAGE_DYNAMIC 参数创建的缓存被叫做动态缓存。动态缓存通常被放在AGP 内存中,这种内存中的数据能被很快的更新。处理动态缓存中的数据不会比处理静态缓存中的数据快,因为这些数据必须在渲染前被转移到显存中,动态缓存的好处是它们能够被稍微快点地被更新(比CPU 写快)。因此,假如你需要经常更新缓存中的数据,那么你就应该使用动态缓存。对于动态缓存粒子系统是很好的一个应用,因为它们是动态的,并且他们通常每一帧都会被更新。注意:在程序中读取显存和AGP 内存都是非常慢的。因此,假如你在运行时需要读取你的几何物体,最好的方案是指定一块系统内存,都在其中拷贝并且读取数据。

       

    3.1.2访问缓冲内存

    为了访问一个顶点/索引缓存,我们需要得到一个指针。我们通过一个指针获得缓存数据必须使用的Lock方法。当我们使用完缓存是必须对它解锁。一旦有一个指向内存的指针,我们就能对它读写。

     

    3.1.3 找回顶点和索引缓存信息

    有时候我们需要得到顶点缓存信息, 下面的例子示范了用于获得这些信息的方法:

     

    3.2 渲染状态

    Direct3D 提供了多种渲染状态,它影响几何物体怎样被渲染。渲染状态有默认值,因此假如你的应用程序需要不同于默认设置的渲染时,你仅仅改变它即可。一种渲染效果会一直起作用.

    例如,在这一章的例子中我们将使用线框模式渲染我们的物体。因此,我们设置如下的渲染状态:

     

       

    3.3 绘制准备

    一旦我们创建好一个顶点缓存以及一个索引缓存(可选的)后,我们就为渲染其中的内容准备的差不多了,但是在渲染钱我们还有3个步骤必须先做

    3.1.1设置资源流

    设置资源流与一个顶点缓存挂钩,次流就是流入渲染管线的几何信息的流,下面的方法是用于设置一个资源流:

    StreamNu mber——确定我们的顶点缓存与哪一个资源流挂钩。在这本书中我们不使用多重流;因此我们总是使用0号流。

    pStreamData——一个指向我们想与流挂钩的那个顶点缓存的指针。

    OffsetInBytes——相对流开始处的偏移量。以字节为单位,它指定被填入渲染管线的顶点数据的开始位置。通过检查D3DCAPS9结构中的D3DDEVCAPS2_STREAMOFFSET标志,假如你的设备支持,那么这个参数就有一些非0值。

    Stride——我们在顶点缓存中操作的每个部分的流的字节大小。

    3.1.2设置顶点格式

    在这里我们指定后面用来绘图调用的顶点的顶点格式。

    3.1.3设置索引缓存

    假如我们使用了索引缓存,我们必须设置后面要用于绘制操作的索引缓存。每次我们只能使用一个索引缓存;因此假如你需要用一个不同的索引缓存绘制一个物体时,你必须转换到另一个上。下面的代码设置一个索引缓存:

     

       

    3.4 用顶点/索引缓存绘制

    在我们创建好顶点/索引缓存记忆做好准备工作以后,我们就能绘制我们的几何物体了。这是通过使用DrawPrimitive或者DrawIndexedPrimitive传送几何信息到达渲染管线。这是方法从顶点刘忠获得顶点信息以及从索引缓存中获得索引信息。

    3.4.1IDirect3DDevice9::DrawPrimitive

    这个方法不使用索引信息绘制图元

    PrimitiveType——我们绘制的图元类型。比如,我们能绘制点和线以及三角形。以后我们使用三角形,用D3DPT_TRIANGLELIST参数。

    StartVertex——索引到在顶点流中的一个元素。设置渲染顶点中的开始点。这个参数给予我们一定的机动性,可以绘制一个顶点缓存中的某部分。

    PrimitiveCount——绘制图元的个数。

       

    例子:

     

    3.4.2 IDirect3DDevice9::DrawIndexedPrimitive

    这个方法使用索引信息来绘制图元

    Type——我们绘制的图元类型。比如,我们能绘制点和线以及三角形。以后我们使用三角形,用D3DPT_TRIANGLELIST参数。

    BaseVertexIndex——一个基本数字,在调用中用它去加上索引。参看下面的说明。

    MinIndex——将被引用的最小索引值。

    NumVertices——在此调用中将被引用的顶点数。

    StartIndex——索引到索引缓存中的某个位置,它标记开始渲染的开始索引点。

    PrimitiveCount——绘制图元的个数。

       

    3.4.3开始/结束场景

    最后一点就是所有绘制方法都必须在IDirect3DDevice9::BeginScene和IDirect3DDevice9::EndScene方法之间被调用。例如,我们将这样写:

     

  • 相关阅读:
    string_view暴力串串题
    字符串hash暴力串串题
    C++刷leetcode几点注意事项
    微软面试算法题(整理)
    Leetcode中的Dijkstra算法
    gdb在线调试多线程程序
    2022亚马逊校园招聘软件开发实习提前批面试题
    python模块tqdm(进度条)的使用
    解决 Failed while installing Dynamic Web Module
    最新eclipse从零开始建立SpringMVC项目(详细过程)
  • 原文地址:https://www.cnblogs.com/wangke1020/p/3655699.html
Copyright © 2020-2023  润新知