none
Dx9 纹理奇怪问题。 RRS feed

  • 问题

  • 有一张79 x 117像素图


    width = 79;
    height = 117;


    D3DXCreateTexture( pD3DDevice, width, height,
    1,         // Mip levels
    0,         // Usage
    D3DFMT_A1R5G5B5,        // Format
    D3DPOOL_MANAGED,        // Memory pool
    &pTex ) )


    创建后使用
    pTex->GetLevelDesc(0, &TDesc)
    TDesc.Width 为 79


    但是lockrect 后Pitch 为160


    问题一,D3DXCreateTexture不是自动优化吗?不应该是宽度和高度优化到128吗?如果MipLevels那里写成0会自动优化到128,但是2D游戏,不需要MIP啊。


    问题二,当lockrect时候Pitch 为160,然后按每行填充像素,我的机器显示图片正确,但是在虚拟机XP系统中,那种显卡图片就不正确了,每行像素差4个BYTE那种每行错位,把pitch换成 79*2虚拟机上就没问题了,但是在我机器上又是错位,  请问大神高手们是什么问题啊?
    2016年5月21日 8:01

全部回复

  • 大神们帮帮呀
    2016年5月22日 4:24
  • Hi

    感谢在msdn论坛发帖。

    >>问题一,D3DXCreateTexture不是自动优化吗?不应该是宽度和高度优化到128吗?如果MipLevels那里写成0会自动优化到128,但是2D游戏,不需要MIP啊。

    使用D3DXCreateTexture 函数时,会在内部使用D3DXCheckTextureRequirements调整调用的参数。如果宽度和高度都被设定为D3DX_DEFAULT,那么这两个参数都会被设定为256。如果有一个设为D3DX_DEFAULT,另一个设为数值。纹理的高度和宽度都将设定成该数值。

    详情参考:

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb172800%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

    >>问题二,当lockrect时候Pitch 160,然后按每行填充像素,我的机器显示图片正确,但是在虚拟机XP系统中,那种显卡图片就不正确了,每行像素差4BYTE那种每行错位,把pitch换成 79*2虚拟机上就没问题了,但是在我机器上又是错位,  请问大神高手们是什么问题啊?

    Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字节为单位), 不足的以0填充。建议你将宽度改为80

    Best Regards,

    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    2016年5月23日 6:50
  • 你好,感谢你的回答,

    问题一,使用D3DX_DEFAULT才能自动优化吗?我实验了一下DX8这个函数,他直接写宽度和高度就可以自动优化到128,为什么DX9不行呢?

    问题二,我这游戏比较旧,很多不是整数宽度的图片,不太好改图片,请问可有其他办法吗?

    我看其他一个游戏是DX9,然后我把他的一个资源改成了我这张图片,他在虚拟机中显示正确,我用OD跟踪了一下,也是使用的D3DXCreateTexture,对应参数也是直接用的宽度和高度,没使用D3DX_DEFAULT,但是显示正确,我不知道他是否在Pitch 上有什么判断,OD技术有限没跟踪到Pitch,请大神给点指点,谢谢。

    2016年5月25日 5:51
  • 请大神们指点下小弟
    2016年6月20日 17:50