请问,Directx 在纹理上高效写字的方法

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

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

实际纹理比弹出框大,函数的最后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);//gdi绘制不支持 0xffffffff这种颜色

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);



//修改绘制的文字颜色0xffffff 为0xffffffff
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);
}

------解决方案--------------------
像素Shader可以么?
------解决方案--------------------
不能新建纹理,只能读回再写,带宽压力很大。你可以只lock纹理的一部分。另外可以把最近用过的字缓存起来,就不用每次用gdi了。而且也不用每贞都画字,一次写好,如果没有改变就不要去修改。
------解决方案--------------------
http://topic.****.net/u/20100707/11/61b467e8-d3db-431e-88a5-f3b62f35b659.html
------解决方案--------------------
楼主之前也问过这问题…
------解决方案--------------------
学习了。呵呵