|
|
地形假如一共有64*64个顶点,64*64个顶点中,大多数点共享4个面,很小一部分共享2个面,如果我要在创建顶点缓冲时就写入法向量的话,需要写太多顶点,于是我把顶点的法向量计算和顶点缓冲区法向量的赋值放到索引缓冲中去,代码如下:
if(FAILED(Device->CreateIndexBuffer(this->num_col * this->num_row * 6 * sizeof(WORD), 0, D3DFMT_INDEX16,D3DPOOL_MANAGED,&m_pIndexBuffer,NULL)))
{
MessageBox(NULL,"","",1);
}
m_pIndexBuffer->Lock(0, 0, (void**)&v, 0);
int index = 0;
for(int i=0; i<this->num_col; i++)
{
for(int j=0; j<this->num_row; j++)
{
v[index] = i * (this->num_row+1) + j;
v[index+1] = i * (this->num_row+1) + j + 1;
v[index+2] = (i+1) * (this->num_row+1) + j;
D3DVECTOR temp;
ComputeTriNormal(v[index], v[index+1], v[index+2], temp);
vertex[i*(num_row+1) + j].nx = temp.x;
vertex[i*(num_row+1) + j].ny = temp.y;
vertex[i*(num_row+1) + j].nz = temp.z;
v[index+3] = (i+1) * (this->num_row+1) + j;
v[index+4] = i * (this->num_row+1) + j + 1;
v[index+5] = (i+1) * (this->num_row+1) + j + 1;
ComputeTriNormal(v[index+3], v[index+4], v[index+5], temp);
vertex[i*(num_row+1) + j].nx = temp.x;
vertex[i*(num_row+1) + j].ny = temp.y;
vertex[i*(num_row+1) + j].nz = temp.z;
index += 6;
}
}
m_pIndexBuffer->Unlock();
其中ComputeTriNormal()函数是计算法向量的, vertex是顶点数据指针,这段代码能够达到要求,但是很迷惑的是,顶点的数据只有在锁定了顶点缓冲区时才能修改,但是我上面的代码,只锁定了索引缓冲区,却成功修改了顶点缓冲区的数据,感觉和书上讲的有点矛盾,我想的是,可能在锁定索引缓冲的时候同样也对顶点缓冲进行了锁定,于是重新写了一个程序,在锁定索引缓冲后去修改顶点缓冲区中数据的x,y,z坐标,但是不行,感到很困惑,为什么在非锁定状态下,修改顶点缓冲区数据的法向量能成功,但是修改X,Y,Z以及纹理坐标却不行,难道是DX特许了可以在非锁定状态下对顶点缓冲中的法向量进行操作??希望高人解答~~
|
|