D3D做二维游戏的一个问题(只显示一部分图片)

rbird 2004-09-28 11:13:11
我用D3D9做一个二维游戏。图片已经显示出来了。但是我并不想全部显示出来(因为要做动画,就像DDraw那样,一幅图很多动作,一桢桢放,因为DDraw中Blt可以设原图和目标位置的大小)。
我是这样写的:
在初始化函数中:
CUSTOMVERTEX g_Vertices[] ={
{ -1.0f,-1.0f, 0.0f, 0xfffffffff, 0.0f,1.0f},
{ -1.0f, 1.0f, 0.0f, 0xffffffff, 0.0f,0.0f},
{ 1.0f,-1.0f, 0.0f, 0xffffffff, 1.0f,1.0f},
{ 1.0f,1.0f,0.0f,0xffffffff,1.0f,0.0f}, };
if( FAILED( hr = D3DUtil_CreateTexture( m_pd3dDevice, _T("09B.JPG"),&m_pTextures ) ) ) return hr;

在渲染函数中:
m_pd3dDevice->SetStreamSource( 0, m_pMyVB, 0, sizeof(CUSTOMVERTEX) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pd3dDevice->SetTexture( 0, m_pTextures );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

图片已经显示出来了。只是怎么只显示一部部分图片?没有blt,不习惯啊.55555
我知道是修改纹理坐标,但是具体怎么整?能写些具体代码吗?
...全文
229 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxxxk 2004-09-30
  • 打赏
  • 举报
回复
roger that sir, affirmative
go go go ,fire in the hole
zhangyan_qd 2004-09-30
  • 打赏
  • 举报
回复
PS当然不炒作,因为日本人是搞的封闭标准,希望知道的人越少越好。而DX和OpenGL是开放标准,希望知道的人越多越好。完全是两码事。
“如果刚把一个n年前用软件算法就实现了的图形学技术搬到硬件上来就不得了了”当然了不得!硬件实现实时的照片画质效果是技术上的多么大飞跃?尤其是在PC这样的廉价平台上!那些做了十年、二十年CG的老先生们看到这一切能不老泪纵横?这种感情只学5个月D3D当然体会不到。
孤立的怀疑一切是没有价值的。
rbird 2004-09-30
  • 打赏
  • 举报
回复
to lly20000():
LPD3DXSPRITE Sprite怎么初始化呢?
因为在用Begin出现没有初始化的错误
rbird 2004-09-30
  • 打赏
  • 举报
回复
谢谢大家,满足满足,大餐一顿,呵呵
rbird 2004-09-30
  • 打赏
  • 举报
回复
有定义,好像在D9core.h中.但是我不知道怎么初始化?想看看完整操作过程
stonepeter 2004-09-30
  • 打赏
  • 举报
回复
真奇怪我的D9下的Sprite对象没定义
lxxxk 2004-09-30
  • 打赏
  • 举报
回复
我说的是两件事情,可能没说清楚,那个2D的问题解决的方法是很多,这里的答案也很多,楼主可以满足了。:-)

现在说说shader,如果从DX8算起,到现在也有差不多5年时间了,但DX7的显卡还在横行,真搞不懂,决定下个游戏开始不再支持fixed pipeline。虽然我刚接触D3D才5个月,fix的都还没吃透,但也忍不住shader的诱惑了。

另外说说技术跟风的问题,shader其实也完全是炒作,不说远了,就看看94年SONY出的PS吧,GPU、shader什么都有,不过别人不炒作而已,换成美国就不同了,如果刚把一个n年前用软件算法就实现了的图形学技术搬到硬件上来就不得了了,非大肆宣传一番不可。总之做软件开发的随大流就行了,领跑者也有领跑者的好处,跟风者也有跟风者的好处,只要看到好处就行了。
merlinfang 2004-09-29
  • 打赏
  • 举报
回复
没有错吧
lxxxk 2004-09-29
  • 打赏
  • 举报
回复
什么文档说要少用lock啊,D3DUSAGE_DYNAMIC的vertex就是用来lock的。
另外你的FVF应该用RHW的vertex,这样才能确保图片是在你希望的屏幕位置,这时矩阵变换就无效了,必须lock,而且你是要显示图片的一部分,所以还是要先lock了再修改uv值,反正逃不了lock,sprite也是来做这些事用的,懒得自己写就用sprite好了。
zhangyan_qd 2004-09-29
  • 打赏
  • 举报
回复
我提的方法可是完全fixed function的。
MX 440支持SM1.x,你也不能说它完全不支持shader。
fixed pipeline被shader代替是大势所趋。到WGF的时候就完全没有fixed function了。那时候你怎么玩?做技术要看得比别人远,而不是落在别人后头。
lly20000 2004-09-29
  • 打赏
  • 举报
回复
给你一个建议 用sprite来做 就是精灵动画 dx9中提供这样的函数 不需要想你写得那么麻烦
VOID CMyD3DApplication::DrawSpritepic(LPD3DXSPRITE Sprite, LPDIRECT3DTEXTURE9 SpriteTexture, RECT SpriteRect,D3DMATRIX m_mat,D3DXCOLOR Color)
{
Sprite->Begin();
Sprite->DrawTransform(SpriteTexture,&SpriteRect,&(const D3DXMATRIX)m_mat,Color);
Sprite->End();
}
这是我写的一个2d精灵绘制函数 你可以已这个为原型来做 d3dxcolor 是keycolor
rbird 2004-09-29
  • 打赏
  • 举报
回复
但是有文档说尽量少用Lock,因为开销比较大。多用矩阵变换等...。
所以我想知道还有其它办法吗?
lxxxk 2004-09-29
  • 打赏
  • 举报
回复
原来是这种方法啊。
不是考虑到现在国内用mx440的这么多早就改用shader了。
大家干脆都响应MS,nVidia,ATI号召,放弃fixed pipeline算了,让旧显卡自动淘汰,嘿嘿,我从来都是唯恐天下不乱的。
zhangyan_qd 2004-09-29
  • 打赏
  • 举报
回复
不过你说的也没错,2D的游戏对效率的要求是没有3D那么高,不过做事情彻底一点总是好一点吧,大家研究研究,何必当真呢:)
zhangyan_qd 2004-09-29
  • 打赏
  • 举报
回复
给个例子,比如这么定义四个矩形:
1--3--5--7--9
| | | | |
0--2--4--6--8

你应该知道怎么设定DrawPrimitive的参数来任意画其中一个吧?如果把一张包含四个动作的图片整个映射到这4个矩形上,那只要初始化一次VB,以后就再也不用lock buffer了吧

这个方法当然不可能像DDraw那样任意的blit某一块,但是就在角色动画这个问题上,我觉得比动UV的脑子要好

当然还有更多的方法,比如用VS,甚至可以做出和DDraw的blit一样的功能来都不必lock buffer
lxxxk 2004-09-29
  • 打赏
  • 举报
回复
Triangle Trip的确是效率最高的,但它也没有每次可以draw不同部分的功能啊without modify uv,又不是在DDraw里面blit;static的确也比dynamic效率高,但要lock的话还是用dynamic效率高些。
总之我用D3D做2D就是整个程序就只要4个dynamic的vertices,当然3个也可以,做成trip渲染,也就是说一个rectangle拖n张图片,当然256X256的texture在D3D中处理是最快的,不过我一般为了减轻美工和写文档的负担也没那么做(其实是我偷懒),除非你对效率要求很高。很高吗,不是吧,如果很高你就给我说呀,你不说我怎么知道呢……此人已疯,有事烧钱。
另外怎么“每次draw不同的部分”可不可以说清楚些呀,可能是我没听懂就胡乱给你下结论不行了。:-)
zhangyan_qd 2004-09-29
  • 打赏
  • 举报
回复
少用lock当然是对的,几乎所有关于performance的文档都会提到能不用Dynamic Buffer就不要用。这个问题解法不止一种,lock VB改UV应该是效率比较低的解法。做一条trianglestrip,然后每次draw不同的部分就比lock VB要来得好。
Lucende 2004-09-28
  • 打赏
  • 举报
回复
UV~~~不要说不知道哪个参数是UV哦~~~~


0是起点~1是终点~~~除以图片的大小~乘以所需要的片大小~

算出四个定点的UV~就能把图片一片片的割开啦~~

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧