游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3465|回复: 4

请教,Directx 在纹理上写字最快的方法。

[复制链接]

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-8-18 22:34:00 | 显示全部楼层 |阅读模式

这个函数用来替代游戏中的一个纹理绘制函数,在纹理上绘制文字,弹出显示纹理,类似气泡提示的效果。

所以无法自己创建纹理,只能得到游戏中的纹理指针。

实际纹理比弹出框大,函数的最后2个参数是实际显示弹出框的高和宽。

我的方法是下面这种,通过Gdi绘制文字,然后锁住纹理区域循环修改像素alpha值(GDI貌似不支持0xffffffff这种颜色)

需要知道的是有没有效率更高的方法。


void __stdcall DrawPopTexture(LPDIRECT3DTEXTURE9 lpTex,DWORD dwSrcX,DWORD dwSrcY,const PWCHAR pText,DWORD dwLen,DWORD dwColor,DWORD BoxH,DWORD BoxW)
{
        RECT rect;
       
        IDirect3DSurface9 *p_dds;

        D3DSURFACE_DESC surfaceDesc;

        D3DLOCKED_RECT lockedRect;

        HDC hdc;

        RECT box;

        //D3DXSaveTextureToFileW(L"test.dds",D3DXIFF_DDS,lpTex,NULL);


        lpTex->GetSurfaceLevel(0,&p_dds);

        p_dds->GetDesc(&surfaceDesc);

        p_dds->GetDC(&hdc);

        SelectObject(hdc, hfont);
        SetBkMode(hdc, TRANSPARENT);
        SetTextColor(hdc, 0xffffff);

        SetRect(&box,0,0,BoxW,BoxH);               

        DrawTextW(hdc,pText,dwLen,&box,DT_CENTER | DT_EDITCONTROL | DT_WORDBREAK);


        p_dds->ReleaseDC(hdc);
        p_dds->Release();

        //D3DXSaveTextureToFileW(L"test1.dds",D3DXIFF_DDS,lpTex,NULL);


        lpTex->LockRect(0,&lockedRect,0,0);

        DWORD* imageData = (DWORD*)lockedRect.pBits;
        int index;

        for(int i = 0; i < BoxH; i++)
        {
                for(int j = 0; j < BoxW; j++)
                {                       
                    index = i * lockedRect.Pitch / 4 + j;

                        if (imageData[index] == 0x00ffffff)
                                imageData[index] = 0xffffffff;

                }
        }
        lpTex->UnlockRect(0);
        //D3DXSaveTextureToFileW(L"test2.dds",D3DXIFF_DDS,lpTex,NULL);
}

0

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2010-8-19 09:26:00 | 显示全部楼层

Re:请教,Directx 在纹理上写字最快的方法。

if (imageData[index] == 0x00ffffff)
imageData[index] = 0xffffffff;
循环中的if语句会打断cpu流水线 不如用位操作吧
alpha通道纹理 alpha 1 用这个颜色0xff0000      0xff0000 << 8     ==   0xff000000
alpha通道纹理 alpha 0 用    0
这个alpha通道表面可以用gdi任意画
最后   imageData[index] = (imageData[index] &0x00ffffff) |  (imageAlpha[index] << 8)
这样原纹理每次都可以用gdi画的alpha通道显示  

0

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2010-8-19 09:28:00 | 显示全部楼层

Re:请教,Directx 在纹理上写字最快的方法。

我 对这个也不太懂  希望可以和你一起学习

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-8-19 09:55:00 | 显示全部楼层

Re:请教,Directx 在纹理上写字最快的方法。

贴图里不是只有文字,贴图里还有一块背景,上面if判断就是只修改0xffffff颜色的字体像素而不修改背景,否则背景就都给修改了。

GDI绘制文字效率比较低,我想知道有没有别的高效的方式绘制文本。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-8-20 09:08:00 | 显示全部楼层

Re:请教,Directx 在纹理上写字最快的方法。

可以搞单字的纹理buffer,然后绘制文字的时候进行再进行lock unlock 像素拷贝拼接,文字发生改变的时候重新lock unlock拼接这个合成纹理,大概思路就是这样
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-18 20:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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