请问,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
------解决方案--------------------
楼主之前也问过这问题…
------解决方案--------------------
学习了。呵呵
这个函数用来替代游戏中的一个纹理绘制函数,在纹理上绘制文字,弹出显示纹理,类似气泡提示的效果。
所以无法自己创建纹理,只能得到游戏中的纹理指针。
实际纹理比弹出框大,函数的最后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
------解决方案--------------------
楼主之前也问过这问题…
------解决方案--------------------
学习了。呵呵