有没有办法查看D3D设备当前的全部渲染状态?

mmmcd 2009-09-02 09:17:14
某种情况下渲染总是有问题,而通过PIX看到的状态并不完整
有什么方法能看清所有细节?
通过CreateStateBlock获取的状态有没有办法看到详细内容?
LPDIRECT3DSTATEBLOCK9 pSBlock;
device->CreateStateBlock(D3DSBT_ALL, &pSBlock);
...全文
406 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
凡夫与俗子 2009-09-08
  • 打赏
  • 举报
回复
学习
xingzhe2001 2009-09-04
  • 打赏
  • 举报
回复
那楼主画别的物体没有调用过SetVertexShader()?
mmmcd 2009-09-04
  • 打赏
  • 举报
回复
上图上真相

除了红圈部分,其他地方跟MS文档吻合
mmmcd 2009-09-03
  • 打赏
  • 举报
回复

m_sprite->Begin(D3DXSPRITE_DONOTSAVESTATE);
m_sprite->End();
///后面用divce画一切正常
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
This method must be called from inside a IDirect3DDevice9::BeginScene . . . IDirect3DDevice9::EndScene sequence. ID3DXSprite::Begin cannot be used as a substitute for either IDirect3DDevice9::BeginScene or ID3DXRenderToSurface::BeginScene.

张赐 2009-09-03
  • 打赏
  • 举报
回复
ID3DXSprite::Begin
就是让设备做好画精灵的准备嘛
楼主可能其他代码有问题
mmmcd 2009-09-03
  • 打赏
  • 举报
回复
甚至写成:

m_sprite->Begin(D3DXSPRITE_DONOTSAVESTATE);
m_sprite->end();
按照DX文档ID3DXSprite::Begin那块表格列出的状态,用device一条条设一遍
///后面用divce画一切正常


//注释掉m_sprite
//m_sprite->Begin(D3DXSPRITE_DONOTSAVESTATE);
//m_sprite->end();
按照DX文档ID3DXSprite::Begin那块表格列出的状态,用device一条条设一遍
///后面用divce画全不正常

不知道ID3DXSprite::Begin除了设置状态还做了什么事情?
张赐 2009-09-03
  • 打赏
  • 举报
回复
不是就在beginScene和EndScene之间画就能画出东西来吗
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
zbuffer clear得是否正确?Pixel里面点像素右键->debug 应该能看到详细的信息,为什么没画出来等。
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
Pix里有线索么?

你在d3d control panel 里把 Debug Output Level改称More, 选择 Use Debug Version of Direct3D 9, 看看调试输出窗口有什么线索。
mmmcd 2009-09-03
  • 打赏
  • 举报
回复
先谢谢各位
我的最终目的是想解决一下这个问题

HRESULT hr = m_sprite->Begin(D3DXSPRITE_DONOTSAVESTATE);
m_sprite->End();
//之后我只用device,画任何东西都正常

而如果把m_sprite->Begin和end去掉后,用device怎么都画不出来
我按照DX文档,想通过下面的设状态来取代:m_sprite->Begin(D3DXSPRITE_DONOTSAVESTATE);

m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_device->SetRenderState(D3DRS_ALPHAREF, 0x00);
m_device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
m_device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
m_device->SetRenderState(D3DRS_CLIPPING, TRUE);
m_device->SetRenderState(D3DRS_CLIPPLANEENABLE, FALSE);
m_device->SetRenderState(D3DRS_COLORWRITEENABLE,
D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
m_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
m_device->SetRenderState(D3DRS_ENABLEADAPTIVETESSELLATION, FALSE);
m_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
m_device->SetRenderState(D3DRS_FOGENABLE, FALSE);
m_device->SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
m_device->SetRenderState(D3DRS_LIGHTING, FALSE);
m_device->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
m_device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);

m_device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
m_device->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
m_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE);
m_device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
m_device->SetRenderState(D3DRS_VERTEXBLEND, FALSE);
m_device->SetRenderState(D3DRS_WRAP0, 0);

m_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
m_device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
m_device->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);

用device仍旧画不东西
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
我机器上的截图

张赐 2009-09-03
  • 打赏
  • 举报
回复
楼主,你看看那个PIX的高级应用
可能有你想要看的东西
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
拷过来一些,你看这些是固定管线光和材质的属性。
Fixed-Function Lighting States
Ambient Color D3DCOLOR_ARGB(0x00,0x00,0x00,0x00)
Color Vertex Enable True
Lighting Enable True
Local Viewer True
Normalize Normals False
Material Ambient Source D3DMCS_MATERIAL
Material Diffuse Source D3DMCS_COLOR1
Material Specular Source D3DMCS_COLOR2
Material Emissive Source D3DMCS_MATERIAL

Material
Diffuse ARGB(0.0, 0.0, 0.0, 0.0)
Ambient ARGB(0.0, 0.0, 0.0, 0.0)
Specular ARGB(0.0, 0.0, 0.0, 0.0)
Emissive ARGB(0.0, 0.0, 0.0, 0.0)
Power 0.000

Fixed-Function Lights
Index Enabled Type Ambient Diffuse Specular Position Direction Range Falloff Attenuation Theta Phi

Fixed-Function Transformation States
Indexed Vertex Blend Enable False
Vertex Blend Mode D3DVBF_DISABLE
Tween Factor 0.000
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
我这里你需要的那些状态都可以看到阿
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
在PIX里,你看到凡是IDirect3DDevice9::xxx 前面都有蓝色的pDevice的地址,你双击那个地址会弹出Device的属性页,里面不是有Input State, Tessellation Stae, Vertx State, Pixel State, Output State么,这些属性还不够么?
chogimoga 2009-09-03
  • 打赏
  • 举报
回复
每天回帖有10分可用分.
mmmcd 2009-09-03
  • 打赏
  • 举报
回复

MS文档里居然不说
最后还是用pix看出来的
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复
mmmcd 2009-09-03
  • 打赏
  • 举报
回复
搞定结贴

我的状态设置都是对的,但ID3DXSprite::Begin里还有个玄机:
SetVertexShader(NULL);
SetPixelShader(NULL);

加上即OK
加载更多回复(6)

8,303

社区成员

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

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