D3D中,绘制文字的问题

时间:2020-12-15 23:32:11
最开始用 ID3DXFont 来绘制文字,却发现没办法像ExtTextOut那样把绘制的文字部分裁剪.

于是就想创建一块纹理,获取DC后,用ExtTextOut把文字绘制到纹理上,再将纹理中裁剪的部分进行绘制.
却找不到如何把纹理指定的底色设置透明的方法.把纹理锁定后一个像素一个像素的修改显然太慢.

请教各位大虾有什么好的解决办法?

15 个解决方案

#1


2D字体?  D3DXCreateFont?

#2


3D的话不是用三维文本网格模型吗?  不懂   学习

#3


指定文本的时候不是要裁剪矩形区域的?

#4


可以让底色为0,然后用add混合

#5


恐怕只有这样了

#6


你们的意思是先将纹理写上字,然后用多重纹理混合?

没搞过呢,有没有点伪代码给看看?

#7


不用多重纹理,绘制纹理时,帧缓冲混合add上去

#8


求具体设置代码?

#9


m_pd3dDevice->SetTexture(0, pD3DText->Image()->Texture());

m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);   

return DrawImage(pD3DText->Image(), 0xFFFFFFFF, &rSrc, &rText);

咋没见有用捏...

#10


pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
帧缓冲add混合代码

#11


还是没搞懂什么是帧缓冲混合add

我是用ID3DXSprite直接画,并没有使用三角平面

现在用2张纹理解决了透明色问题,先在一张R8G8B8纹理上获取表面并获取HDC,然后GDI写字,再用D3DXLoadSurfaceFromSurface指定透明色Load到另外一张A8R8G8B8格式的纹理上,最终再用ID3DXSprite绘制带透明的纹理.

但是实际使用上又有新问题.
1 文字边缘的衬线很难看.我用文字颜色的RGB值各减30后再用SetBkColor设置透明色,可以减轻衬线的影响,但始终看起不舒服.
2 文字比较大时,边缘有严重的黑色锯齿,看起很难看...
3 绘制速度巨慢...

#12


呃。。这个问题我也发帖问过,没有解决。。。
最后还是写在纹理上,再贴纹理。。。

#13


我将GDI绘制的纹理创建到系统内存中,绘制好了后再D3DXLoadSurfaceFromSurface到显存纹理中,速度有所提高,不过还是慢...

求问楼上,文字边缘的黑色锯齿问题你是怎么解决的呢?

#14


太久了都记不太清了。。
好像是先将文字写在内存一位图上,然后从这位图创建Texture。。。
然后将这Texture显屏。。
不过确实没有黑色锯齿这个问题。。

#15


想获取文字的灰度字形数据,然后手工设置去纹理。写了半截,突然发现我完全成猪头了。
D3D 9的ID3DXFont接口本来就是这样搞定了,我还自己去整。。。
然后才想起,我可以使用SetRenderTarget,用ID3DXFont将文字渲染到带Alpha通道的D3DCLEAR_TARGET纹理上,然后再绘制纹理。。。

我就是头猪。。。
结贴。。。


#1


2D字体?  D3DXCreateFont?

#2


3D的话不是用三维文本网格模型吗?  不懂   学习

#3


指定文本的时候不是要裁剪矩形区域的?

#4


可以让底色为0,然后用add混合

#5


恐怕只有这样了

#6


你们的意思是先将纹理写上字,然后用多重纹理混合?

没搞过呢,有没有点伪代码给看看?

#7


不用多重纹理,绘制纹理时,帧缓冲混合add上去

#8


求具体设置代码?

#9


m_pd3dDevice->SetTexture(0, pD3DText->Image()->Texture());

m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);   

return DrawImage(pD3DText->Image(), 0xFFFFFFFF, &rSrc, &rText);

咋没见有用捏...

#10


pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
帧缓冲add混合代码

#11


还是没搞懂什么是帧缓冲混合add

我是用ID3DXSprite直接画,并没有使用三角平面

现在用2张纹理解决了透明色问题,先在一张R8G8B8纹理上获取表面并获取HDC,然后GDI写字,再用D3DXLoadSurfaceFromSurface指定透明色Load到另外一张A8R8G8B8格式的纹理上,最终再用ID3DXSprite绘制带透明的纹理.

但是实际使用上又有新问题.
1 文字边缘的衬线很难看.我用文字颜色的RGB值各减30后再用SetBkColor设置透明色,可以减轻衬线的影响,但始终看起不舒服.
2 文字比较大时,边缘有严重的黑色锯齿,看起很难看...
3 绘制速度巨慢...

#12


呃。。这个问题我也发帖问过,没有解决。。。
最后还是写在纹理上,再贴纹理。。。

#13


我将GDI绘制的纹理创建到系统内存中,绘制好了后再D3DXLoadSurfaceFromSurface到显存纹理中,速度有所提高,不过还是慢...

求问楼上,文字边缘的黑色锯齿问题你是怎么解决的呢?

#14


太久了都记不太清了。。
好像是先将文字写在内存一位图上,然后从这位图创建Texture。。。
然后将这Texture显屏。。
不过确实没有黑色锯齿这个问题。。

#15


想获取文字的灰度字形数据,然后手工设置去纹理。写了半截,突然发现我完全成猪头了。
D3D 9的ID3DXFont接口本来就是这样搞定了,我还自己去整。。。
然后才想起,我可以使用SetRenderTarget,用ID3DXFont将文字渲染到带Alpha通道的D3DCLEAR_TARGET纹理上,然后再绘制纹理。。。

我就是头猪。。。
结贴。。。