游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2551|回复: 5

在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

[复制链接]

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-3-12 15:50:00 | 显示全部楼层 |阅读模式
        if (SUCCEEDED(m_pSprite->Begin(D3DXSPRITE_DONOTSAVESTATE)))
        {
                D3DXMATRIX mat2DTrans;
                D3DXMatrixTranslation( &mat2DTrans, 0.0f, 0.0f, 0.0f );
                m_pSprite->SetTransform(&mat2DTrans);
                m_pSprite->Draw(m_pDXTexture->m_Texture, &rct3D1,NULL,NULL, 0xffffffff);
                m_pSprite->End();
        }

        m_pDXFont->Draw3DFont(1,&rct3D1,&mtxText2);
        m_pDXFont->Draw3DFont(2,&rct3D2,&mtxText3);

先用 SPRITE 在屏幕上贴一个图(没有占满整个屏幕),然后画两个 3D 文字,运行的时候,屏幕上只有贴图,没有 3D 文字了。。。
把 SPRITE 这段代码注释掉,3D文字正常。。。

是不是矩阵有问题啊。。
既要使用 SPRITE 绘制 2D 对象,又要绘制 3D 对象,这种情况应该注意什么??

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-3-12 17:35:00 | 显示全部楼层

Re:在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

sprite may enable alpha test and disable depth test

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-12 19:54:00 | 显示全部楼层

Re:在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

提示LZ,Depth buffer

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-3-12 21:28:00 | 显示全部楼层

Re:在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

恩。。。兄弟们的回帖都很精炼。。。
不过,我很喜欢这样,就好像玩侦探游戏一样,给点线索,自己去推敲,尝试,而不是等这别人贴代码。。。
所有的事情,自己探索过一遍之后,才会有真正的收获,哈哈。。。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
 楼主| 发表于 2009-3-13 11:57:00 | 显示全部楼层

Re:在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

兄弟们,我回来了,问题已经解决,但是不知道为什么。。。。。
其实,使用 Sprite 的时候,如果你的程序中还需要绘制其他 3D 物体的时候,就需要注意选择begin里面的参数。。。。
Sprite->Begin( 参数选项 )

这里是所有参数的解释:
//////////////////////////////////////////////////////////////////////////////
// D3DXSPRITE flags:
// -----------------
// D3DXSPRITE_DONOTSAVESTATE
//   Specifies device state is not to be saved and restored in Begin/End.
// D3DXSPRITE_DONOTMODIFY_RENDERSTATE
//   Specifies device render state is not to be changed in Begin.  The device
//   is assumed to be in a valid state to draw vertices containing POSITION0,
//   TEXCOORD0, and COLOR0 data.
// D3DXSPRITE_OBJECTSPACE
//   The WORLD, VIEW, and PROJECTION transforms are NOT modified.  The
//   transforms currently set to the device are used to transform the sprites
//   when the batch is drawn (at Flush or End).  If this is not specified,
//   WORLD, VIEW, and PROJECTION transforms are modified so that sprites are
//   drawn in screenspace coordinates.
// D3DXSPRITE_BILLBOARD
//   Rotates each sprite about its center so that it is facing the viewer.
// D3DXSPRITE_ALPHABLEND
//   Enables ALPHABLEND(SRCALPHA, INVSRCALPHA) and ALPHATEST(alpha > 0).
//   ID3DXFont expects this to be set when drawing text.
// D3DXSPRITE_SORT_TEXTURE
//   Sprites are sorted by texture prior to drawing.  This is recommended when
//   drawing non-overlapping sprites of uniform depth.  For example, drawing
//   screen-aligned text with ID3DXFont.
// D3DXSPRITE_SORT_DEPTH_FRONTTOBACK
//   Sprites are sorted by depth front-to-back prior to drawing.  This is
//   recommended when drawing opaque sprites of varying depths.
// D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
//   Sprites are sorted by depth back-to-front prior to drawing.  This is
//   recommended when drawing transparent sprites of varying depths.
// D3DXSPRITE_DO_NOT_ADDREF_TEXTURE
//   Disables calling AddRef() on every draw, and Release() on Flush() for
//   better performance.
//////////////////////////////////////////////////////////////////////////////

恩。。。说的很详细了,但是我在分别使用这些参数的时候。发现他们好像不能完全按照MS中的解释去执行。。

我最先使用的是 D3DXSPRITE_DONOTMODIFY_RENDERSTATE 。。。
解释上说,它会保留当前的渲染状态,使用默认的POSITION0, TEXCOORD0, and COLOR0 ,在执行 Sprite->end()以后,自动还原所有状态。。
但是,当我使用后,我发现 Sprite 按照指定的位置和大小贴上去了,但是我的所有 mesh 没有了光照(都变成黑色的了)。。。

其他的参数也试过了,没什么问题,最后我使用的参数是:D3DXSPRITE_ALPHABLEND
这个参数,丝毫没有提到“渲染状态”,“深度测试”,VIEWPORT,PROJECT,WORLDMETRIX,但是,使用了这个参数以后,Sprite 贴图正常,mesh 显示正常。。。。。。

兄弟们能帮我补充一下这些参数的其他细节和需要注意的地方吗??

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-13 12:22:00 | 显示全部楼层

Re:在屏幕上用 ID3DSPRITE 帖了一个图以后,MESH 不见了??

我最先使用的是 D3DXSPRITE_DONOTMODIFY_RENDERSTATE 。。。
解释上说,它会保留当前的渲染状态,使用默认的POSITION0, TEXCOORD0, and COLOR0 ,在执行 Sprite->end()以后,自动还原所有状态。。
但是,当我使用后,我发现 Sprite 按照指定的位置和大小贴上去了,但是我的所有 mesh 没有了光照(都变成黑色的了)。。。

"自动还原所有状态"只和是否使用了D3DXSPRITE_DONOTSAVESTATE有关,这个还原是指还原到dxsprite.Begin()之前的状态。

其他的参数也试过了,没什么问题,最后我使用的参数是:D3DXSPRITE_ALPHABLEND
这个参数,丝毫没有提到“渲染状态”,“深度测试”,VIEWPORT,PROJECT,WORLDMETRIX,但是,使用了这个参数以后,Sprite 贴图正常,mesh 显示正常。。。。。。

D3DXSPRITE_ALPHABLEND的作用只是设置blend相关的三个render state
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 03:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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