代码之家  ›  专栏  ›  技术社区  ›  Finglas

谁能告诉我C++的这一点是什么?

  •  2
  • Finglas  · 技术社区  · 15 年前
    CUSTOMVERTEX* pVertexArray;
    
    if( FAILED( m_pVB->Lock( 0, 0, (void**)&pVertexArray, 0 ) ) ) {
        return E_FAIL;
    }
    
    
    pVertexArray[0].position = D3DXVECTOR3(-1.0, -1.0,  1.0);
    pVertexArray[1].position = D3DXVECTOR3(-1.0,  1.0,  1.0);
    pVertexArray[2].position = D3DXVECTOR3( 1.0, -1.0,  1.0);
    ...
    

    我一段时间没有接触C++——因此话题,但是这段代码让我感到困惑。调用m_pvb->锁后,数组初始化。

    这很好,但我的问题是这是怎么发生的。下面的代码使用九个元素,但我使用的另一个功能(几乎是复制/粘贴)是只访问四个元素。

    CustomVertex是一个结构,但我认为这并不重要,需要将一个结构/对象数组初始化为固定大小。

    有人能清理一下吗?

    编辑:

    给出答案,它怎么知道我需要数组中的九个元素,或者四个元素等等?

    只要缓冲区足够大,元素就合法。如果是这样的话,如果我没弄错的话,这段代码正在设置缓冲区大小。

    if( FAILED( m_pd3dDevice->CreateVertexBuffer( vertexCount * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) {
            return E_FAIL;
    }
    
    5 回复  |  直到 15 年前
        1
  •  5
  •   moonshadow    15 年前

    m_pvb指向一个图形对象,在这种情况下,可能是一个顶点缓冲区。这个对象所保存的数据通常不会在CPU可访问的内存中——它可能被保存在图形硬件的板载RAM中,或者根本没有被分配;它可能在任何特定的时间被GPU使用;因此,如果您想从中读取或写入数据,您需要告诉图形子系统这一点,这就是lock()函数所做的。-与GPU同步,确保主内存中有一个足够大的缓冲区来存储数据,并且从CPU的角度来看,它包含了您此时期望的数据,并将指向该主内存的指针返回给您。需要有一个相应的unlock()调用来告诉GPU您已经完成了对对象的读取/修改。

    要回答关于如何确定缓冲区大小的问题,请查看正在构建顶点缓冲区的位置-您应该看到顶点格式的描述以及传递给创建它的函数的元素计数。

        2
  •  1
  •   Patrick    15 年前

    您正在将指向customVertex指针(指向指针的指针)的指针压入lock函数,因此lock本身必须/需要创建customVertex对象,并将指针设置为指向它创建的对象。

        3
  •  1
  •   joshperry    15 年前

    为了在DX中修改顶点缓冲区,必须锁定它。为了实现这一点,dx api将只通过调用锁来显示vb的内部。

    您的代码正在传入pVertexArray的地址,该地址锁定了vb的内部数据。然后代码继续修改顶点数据,大概是为渲染做准备。

        4
  •  1
  •   Blindy    15 年前

    你问错了问题,不是它怎么知道你需要x个对象,而是你怎么知道它需要x个对象。在中传递指向结构的指针的指针,函数返回指向已在内存中分配的结构的指针(从首次初始化顶点缓冲区时开始)。一切都在那里,你只是请求一个指向数组的指针来处理它,然后“释放它”,这样dx就知道读取顶点缓冲区并上传到gpu。

        5
  •  1
  •   Donnie DeBoer    15 年前

    创建顶点缓冲区时,必须指定大小。当调用lock()时,将0作为要锁定的大小传递,这将告诉它锁定顶点缓冲区的整个大小。