2009-12-07 103 views
2
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之后,数组被初始化。谁能告诉我C++的这一点?

这是伟大的,但除了我遇到的问题是如何发生这种情况。下面的代码使用了九个元素,但是另一个函数(非常复制/粘贴)我正在使用的代码只有四个元素。

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

任何人都可以清除它吗?

编辑:

给出的答复,它是如何知道我需要数组中的九个元素,或四个等...?

所以只要缓冲区足够大,元素是合法的。如果是这样,这个代码是设置缓冲区大小,如果我没有弄错。

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

我应该补充说,这是针对我正在扩展的DirectX应用程序。 Lock方法似乎是DirectX的一部分。 – Finglas 2009-12-07 20:54:17

+0

它应该画一个三角形吗? – 2009-12-07 20:57:31

+4

那么谁把这标记为冒犯?在我看来,公然滥用标记系统。 – GManNickG 2009-12-08 01:18:35

回答

5

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

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

+0

+1,你能否确认我添加的附加代码是如何确定缓冲区的大小? – Finglas 2009-12-07 21:05:30

+0

是的。 CreateVertexBuffer()是指定顶点缓冲区大小的地方。 – 2009-12-07 21:08:57

+0

@Dockers:是的,大小由CreateVertexBuffer的参数决定。见例如http://doc.51windows.net/Directx9_SDK/?url=/Directx9_SDK/graphics/reference/d3d/interfaces/idirect3ddevice9/CreateVertexBuffer.htm了解更多信息。 – moonshadow 2009-12-07 21:09:30

1

你考取一个指向CUSTOMVERTEX指针(指针的指针)插入锁功能,因此锁定本身必须/必须创建CUSTOMVERTEX对象和设置您的指针指向对象时,它创建。

1

为了修改DX中的顶点缓冲区,你必须锁定它。为了执行此操作,DX API只会通过调用Lock来显示VB的内部特性。

您的代码正在传递pVertexArray的地址,其中锁定点位于VB的内部数据。然后代码继续修改顶点数据,大概是为渲染作准备。

1

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

1

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

相关问题