【问题标题】:DirectX9 Texture of arbitrary size (non 2^n)任意大小的 DirectX9 纹理(非 2^n)
【发布时间】:2009-07-27 17:45:17
【问题描述】:

我对 DirectX 比较陌生,必须处理现有的 C++ DX9 应用程序。该应用程序在相机图像上进行跟踪并显示一些 DirectDraw(即 2d)内容。相机的纵横比为 4:3(始终),屏幕未定义。

我想加载一个纹理并将这个纹理用作蒙版,因此内容的跟踪和显示仅在纹理的蒙版区域内完成。因此,我想加载与相机图像大小完全相同的纹理。

我已经完成了加载纹理的所有步骤,但是当我调用GetDesc() 时,D3DSURFACE_DESC 结构的字段WidthHeight 是下一个更大的2 次方大小。我不在乎纹理使用的实际内存是否针对显卡进行了优化,但我没有找到任何方法来获取硬盘上原始图像文件的尺寸。

我确实(并且确实如此,但没有成功)搜索了将图像仅加载到计算机 RAM 中的可能性(不需要显卡)而不向代码添加新的依赖项。否则我将不得不使用 OpenCV(在跟踪方面这可能是个好主意),但目前我仍然尽量避免包含 OpenCV。

感谢您的提示, 诺伯特

【问题讨论】:

    标签: c++ directx textures


    【解决方案1】:

    D3DXCreateTextureFromFileEx 参数 3 和 4 为

    D3DX_DEFAULT_NONPOW2.
    

    之后就可以使用了

    D3DSURFACE_DESC Desc;
    m_Sprite->GetLevelDesc(0, &Desc);
    

    获取高度和宽度。

    【讨论】:

    • 如果设备支持 2 种尺寸的非电源,这将起作用(据我所知,几乎所有都支持)。
    • 好吧,旧卡可能没有。但几乎所有最近的卡片都可以。
    • 如果你将一个作为倒数第三个参数传递给D3DXCreateTextureFromFileEx,实际上宽度和高度将在D3DXIMAGE_INFO中
    【解决方案2】:

    D3DXGetImageInfoFromFile 可能就是您要找的。​​p>

    我假设您使用的是 D3DX,因为我认为 Direct3D 不会自动调整任何纹理的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多