谁能告诉我这个C ++的作用是什么?

时间:2009-12-07 20:53:40

标签: c++ directx

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-> Lock之后,初始化数组。

这很棒,但我遇到的问题就是这种情况。下面的代码使用了9个元素,但是我正在使用的代码的另一个函数(几乎是复制/粘贴)只有四个元素。

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

任何人都可以解决这个问题吗?

修改

鉴于回复,它如何知道我需要数组中的9个元素,或者等等...?

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

if( FAILED( m_pd3dDevice->CreateVertexBuffer( vertexCount * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) {
        return E_FAIL;
}

5 个答案:

答案 0 :(得分:5)

m_pVB指向图形对象,在这种情况下可能是顶点缓冲区。此对象保存的数据通常不在CPU可访问的内存中 - 它可能保存在图形硬件的板载RAM中,或者根本不分配;它可能在任何特定时间由GPU使用;因此,如果您想要从中读取或写入它,您需要告诉您的图形子系统,这就是Lock()函数的作用 - 与GPU同步,确保主存储器中有一个足够大的缓冲区用于数据它从CPU的角度包含您当前所期望的数据,并返回指向该主存储器的指针。需要进行相应的Unlock()调用,以告诉GPU您已完成读取/变异对象。

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

答案 1 :(得分:1)

您正在将指向CUSTOMVERTEX指针(指向指针的指针)的指针设置到锁定函数中,因此锁定本身必须/需要创建CUSTOMVERTEX对象并将指针设置为指向它创建的对象。

答案 2 :(得分:1)

为了修改DX中的顶点缓冲区,您必须将其锁定。为了强制执行此操作,DX API只会通过调用Lock来显示VB的内容。

您的代码传递的是pVertexArray的地址,Lock指向VB的内部数据。然后代码继续修改顶点数据,可能是为了渲染。

答案 3 :(得分:1)

你问的是错误的问题,它不是如何知道你需要x对象,而是你知道IT需要x对象的方式。您将指针传递给指向结构的指针,该函数返回指向已在内存中分配的结构的指针(从您第一次初始化顶点缓冲区时开始)。一切都在那里,你只需要一个指向数组的指针来处理它,然后“释放它”,所以dx知道读取顶点缓冲区并将其上传到gpu。

答案 4 :(得分:1)

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