游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1772|回复: 2

麻烦哪位对位操作比较熟悉的帮忙看下 谢谢

[复制链接]

75

主题

102

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2008-11-20 16:46:00 | 显示全部楼层 |阅读模式
简要注释一下就ok,有些地方我看的不是很懂 谢谢

这是一个从bitmap向texture 里写入数据的代码局部,这里的功能是把bitmap中黑色的通道设置为透明。。如果你看过这个将中文转成贴图的教程的人就更好了,这里我写了一些注释,肯定有不对的地方,不明白的也写到里面了,帮忙修改下,多谢


......

//初始化字体和贴图
...
        // 得到空闲位置的坐标
        tX = (at % _RowNum) * _TextSize;
        tY = (at / _RowNum) * _TextSize;

D3DLOCKED_RECT d3dlr;//要锁定的rect
        _pTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);                 //将_pTexture锁定当前的纹理(应该是吧?)
        BYTE * pDstRow = (BYTE*)( (WORD *)d3dlr.pBits + tY * _TextureSize + tX );//取出来的字节是整个纹理的矩形的第一个像素的字节??这里一个像素不应该是四个字节么?(因为有透明通道)它取出来第一个字节是什么意思?
        
        for (DWORD y=0; y<_TextSize; y++)//开始遍历文字矩形每个像素,因为每个像素是一个DWORD,所以声明一个DWORD(对么?)
        {
            WORD * pDst16 = (WORD*)pDstRow;//因为上面取出来的字节不太明白所以这里也只有猜测着理解,把该字节转换城一个“字”为什么不是双字节?
            for (DWORD x=0; x<_TextSize; x++)//因为是矩形,所以每遍历一个横向就遍历该横向的整个纵向
            {
                BYTE bAlpha = (BYTE)((_pBits[_TextSize * y + x] & 0xff) >> 4);//_pBits(一个DWORD*)按位与255,然后向右移四位,感觉是16位
                if (bAlpha > 0)//转成十进制,如果bAlpha大于0
                    *pDst16++ = (bAlpha << 12) | 0x0fff;//这里又不明白了,*pDst16++是什么意思?将bAlpha向左移12位按位或255
                else
                    *pDst16++ = 0x0000;//同上,尤其是这个“++”,这个不是一个单目运算符么?怎么还可以接“=”?
            }
            pDstRow += d3dlr.Pitch;//这里更糊涂了,pitch是什么东西?
        }
        _pTexture->UnlockRect( NULL );//释放贴图纹理

...

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 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就知道了。
指针后缀加加及接等号之类的语法问题,好好去看看书。

大概注释了下代码,不过有些细节我也不清楚。

  1. D3DLOCKED_RECT d3dlr;
  2.    
  3. //锁定缓冲区,d3dlr.pBits 会指向这段缓冲区。  
  4. _pTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
  5.      
  6. //让pDstRow指向你要处理的缓冲区首地址,至于类型,这是根据你的处理方式来定的,
  7. //不是说这里是象素就一定要用DWORD。        
  8. BYTE * pDstRow = (BYTE*)( (WORD *)d3dlr.pBits + tY * _TextureSize + tX );
  9.         
  10. //以下两个循环就是一行一行的遍历所有象素点。
  11. for (DWORD y=0; y<_TextSize; y++)//这个y会作为_pBits的下标使用
  12. {
  13.     //指向当前行首地址
  14.     WORD * pDst16 = (WORD*)pDstRow;
  15.    
  16.     for (DWORD x=0; x<_TextSize; x++)
  17.     {
  18.          //根据当前行列以及纹理大小,取出象素值(32位),然后与上0xff以保留低8
  19.          //位(alpha值),然后再右移取高4位,最后的这个只取高4位,应该是过滤
  20.          //掉较小的alpha值。

  21.          BYTE bAlpha = (BYTE)((_pBits[_TextSize * y + x] & 0xff) >> 4);
  22.          
  23.          if (bAlpha > 0)
  24.              //将上面处理后的4位左移12位,即变成16位,然后与上0xfff将低
  25.              //12位全置1。这里处理成16位,似乎是在压缩。
  26.              *pDst16++ = (bAlpha << 12) | 0x0fff;               
  27.          else
  28.              *pDst16++ = 0x0000;
  29.     }
  30.    
  31.     //指向下一行
  32.     pDstRow += d3dlr.Pitch;
  33. }
  34.    
  35. //解除锁定
  36. _pTexture->UnlockRect( NULL );
复制代码

75

主题

102

帖子

110

积分

注册会员

Rank: 2

积分
110
 楼主| 发表于 2008-11-21 10:41:00 | 显示全部楼层

Re: 麻烦哪位对位操作比较熟悉的帮忙看下 谢谢

to Enigmaya:

非常感谢,已经非常详细了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 21:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表