游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3239|回复: 9

Direct3D中关于纹理的问题

[复制链接]

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2007-7-27 11:52:00 | 显示全部楼层 |阅读模式
在D3D中怎样将文字做成纹理

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2007-7-27 13:20:00 | 显示全部楼层

Re: Direct3D中关于纹理的问题


    可以参考下早期DX SDK里的例子。

    SDK里有支持英文算法,总的思路是预生成一张所有字符后备纹理,使用时在这个纹理中截取。

    如果是中文之类的文字,预生成一张所有字符后备纹理的方法是不可行,可以采用动态生成,在使用WINDOS的字体环境下,用标准备字符输出API输出到一个缓冲DC上,然后从DC里位图里转成纹理。

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-7-27 16:08:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

D3DXCreateText.
楼上的动态生成那速度...........当然要提前生成好

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2007-7-27 16:51:00 | 显示全部楼层

Re: Re:Direct3D中关于纹理的问题

OSFG: Reirect3D中关于纹理的问题

D3DXCreateText.
楼上的动态生成那速度...........当然要提前生成好


    可能你这里有个误区,纹理字体生成和显示是不同一个概念的,生成纹理后,在以后每一帧的显示中,是渲染 “已经输出好的字符纹理”,而不是在每一帧渲染时,都用DC生成纹理再去渲染,这样当然是慢,而且这个方法是不可取的。

    提前生成这个方法在汉字这类型的字体,要生成所有字符buf,这个量是非常可观的,汉字好象有四万多个吧(这个你不能省,谁能知道用户想打出什么字呢?),还不包括繁体......,你会这样做么?

    因为DX中没有自已一套底层的字体字符解决方案,而且也不值得去再定义一套,WINDOW已经做的很好了,D3DXCreate其实也是调用WINDOW的DC生成的。用D3DXCreate或者自已用DC生成,时间速度的相差无几,当然你可以选其中一种了。



7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-7-28 10:16:00 | 显示全部楼层

Re: Direct3D中关于纹理的问题

请问有没有这方面的源代码可以参考呢?

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2007-7-28 11:16:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

直接写纹理~~

  1. DWORD* CslothGXDx9::LockTexture(STEXTURE tex,int left,int top,int width,int height)
  2. {
  3.         LPDIRECT3DTEXTURE9 pTex=(LPDIRECT3DTEXTURE9)tex;
  4.         D3DSURFACE_DESC TDesc;
  5.         D3DLOCKED_RECT TRect;
  6.         RECT region, *prec;
  7.         pTex->GetLevelDesc(0, &TDesc);

  8.         if(width && height)
  9.         {
  10.                 region.left=left;
  11.                 region.top=top;
  12.                 region.right=left+width;
  13.                 region.bottom=top+height;
  14.                 prec=&region;
  15.         }
  16.         else prec=0;
  17.         pTex->LockRect(0, &TRect, prec, 0);
  18.         return (DWORD *)TRect.pBits;
  19. }
复制代码


类似于这样的函数,就能返回纹理那的指针了;)
然后就是把字的象素数据闹上去~~我是这样做的

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-7-28 14:28:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

谢谢你啊,请问怎样把字拷贝到纹理中呢?请问有完整的原代码吗?拜托了

8

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-7-28 15:25:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

试试这个行不
先创建个TEXTURE
然后把这个TEXTURE作为当前的渲染目标
然后调用ID3DXFONT::DRAWTEXT

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2007-7-28 16:59:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

太高兴了,能看到自己感兴趣的东西。
大树懒 你给的函数只是锁定纹理内存,没有拷贝像素的过程啊,如何获取window字体在内存中的像素呢?是不是通过GetGlyphOutline()?

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2007-7-28 20:02:00 | 显示全部楼层

Re:Direct3D中关于纹理的问题

基本上只要有了纹理的内存指针就能干很多事了吧~
我自己用的写字是用freetype2的,代码大约就是下面这样,因为没怎么用过,
所以写的不是很严谨,还有些问题没解决~就大概看下意思吧

  1. void CslothFTfreetype2::SetText(STEXTURE texture, char* text, DWORD color,int offsetx,int offsety)
  2. {
  3.         m_slot = m_face->glyph;
  4.         IslothGX* gxDriver=m_ownDevice->GetGXDriver();
  5.         int tex_width=gxDriver->GetTextureWidth(texture);
  6.         DWORD* color_arr=gxDriver->LockTexture(texture);

  7.         m_matrix.xx = (FT_Fixed)(    0x10000L );
  8.         m_matrix.xy = (FT_Fixed)( 0 *  0x10000L);
  9.         m_matrix.yx = (FT_Fixed)( 0 *  0x10000L);
  10.         m_matrix.yy = (FT_Fixed)( 0x10000L );
  11.         m_pen.x = 0;
  12.         m_pen.y = 0;

  13.         int src_length=strlen(text);
  14.         u16* uni_text=new u16[src_length];
  15.         memset(uni_text,0,sizeof(u16)*src_length);
  16.         GBToUnicode(text,uni_text);
  17.         int dest_length=wcslen(uni_text);
  18.         for(int n=0;n<dest_length;n++)
  19.         {
  20.                 if(uni_text[n]==0xfdfd)
  21.                         break;
  22.                 FT_Set_Transform( m_face, &m_matrix, &m_pen );
  23.                 m_error = FT_Load_Char( m_face,uni_text[n], FT_LOAD_RENDER );
  24.                 if ( m_error )
  25.                         continue;
  26.                 if(n==0)
  27.                 {
  28.                         offsety+=m_slot->bitmap_top;
  29.                         offsetx+=m_slot->bitmap_left;
  30.                 }
  31.                 for (int i=offsetx;i<offsetx+m_slot->bitmap.width;i++)
  32.                         for(int j=offsety;j<offsety+m_slot->bitmap.rows;j++)
  33.                         {
  34.                                 int alpha=m_slot->bitmap.buffer[(j-offsety)*m_slot->bitmap.width+i-offsetx];
  35.                                 color=SETA(color,alpha);
  36.                                 color_arr[tex_width*(j-m_slot->bitmap_top)+(i+m_slot->bitmap_left)]=color;
  37.                         }
  38.                 if(uni_text[n]<128)
  39.                         m_pen.x += m_slot->advance.x;
  40.                 else
  41.                         m_pen.x += m_slot->advance.x;
  42.                 m_pen.y += m_slot->advance.y;
  43.         }
  44.         gxDriver->UnlockTexture(texture);
  45.         delete []uni_text;
  46. }
复制代码

这东西对ttf字体有效~~~
楼主如果想方便的话就用asc和hzk的点阵字库吧~只要把数据读出来打点就可以了
网上一片这东西的教程和代码,比如:http://www.61ic.com/bbs/read.php?tid=2465&page=e
好象也可以用别的软件把字体文件转成点阵格式的用...


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 17:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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