|
|
发表于 2008-11-20 22:27:00
|
显示全部楼层
Re: 麻烦哪位对位操作比较熟悉的帮忙看下 谢谢
typedef struct D3DLOCKED_RECT {
INT Pitch;
void * pBits;
} D3DLOCKED_RECT, *LPD3DLOCKED_RECT;
Pitch
Number of bytes in one row of the surface.
结构体,函数的定义查msdn就知道了。
指针后缀加加及接等号之类的语法问题,好好去看看书。
大概注释了下代码,不过有些细节我也不清楚。
- D3DLOCKED_RECT d3dlr;
-
- //锁定缓冲区,d3dlr.pBits 会指向这段缓冲区。
- _pTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
-
- //让pDstRow指向你要处理的缓冲区首地址,至于类型,这是根据你的处理方式来定的,
- //不是说这里是象素就一定要用DWORD。
- BYTE * pDstRow = (BYTE*)( (WORD *)d3dlr.pBits + tY * _TextureSize + tX );
-
- //以下两个循环就是一行一行的遍历所有象素点。
- for (DWORD y=0; y<_TextSize; y++)//这个y会作为_pBits的下标使用
- {
- //指向当前行首地址
- WORD * pDst16 = (WORD*)pDstRow;
-
- for (DWORD x=0; x<_TextSize; x++)
- {
- //根据当前行列以及纹理大小,取出象素值(32位),然后与上0xff以保留低8
- //位(alpha值),然后再右移取高4位,最后的这个只取高4位,应该是过滤
- //掉较小的alpha值。
- BYTE bAlpha = (BYTE)((_pBits[_TextSize * y + x] & 0xff) >> 4);
-
- if (bAlpha > 0)
- //将上面处理后的4位左移12位,即变成16位,然后与上0xfff将低
- //12位全置1。这里处理成16位,似乎是在压缩。
- *pDst16++ = (bAlpha << 12) | 0x0fff;
- else
- *pDst16++ = 0x0000;
- }
-
- //指向下一行
- pDstRow += d3dlr.Pitch;
- }
-
- //解除锁定
- _pTexture->UnlockRect( NULL );
复制代码 |
|