directx纹理尺寸

时间:2012-01-20 14:34:14

标签: directx textures direct3d dimensions

所以我发现我的显卡自动将纹理大小调整为2的幂,这通常不是问题,但我只需要渲染我的纹理的一部分,这样做,必须具有它已经的尺寸调整为......

例如: 我将一个370x300像素的图片加载到我的纹理中,并尝试使用特定的源矩形

绘制它
RECT test;
    test.left = 0;
    test.top = 0;
    test.right = 370;
    test.bottom = 300;

    lpSpriteHandler->Draw(
        lpTexture,
        &test,          // srcRect
        NULL,           // center
        NULL,            // position
        D3DCOLOR_XRGB(255,255,255)
        );

但由于纹理已自动调整大小(在本例中)为512x512,因此我只看到原始纹理的一部分。

问题是, 是否有一个功能或我可以调用以找到我的纹理的尺寸? (我已经尝试使用Google搜索,但总是得到一些关于Objects和HSL的奇怪废话)

1 个答案:

答案 0 :(得分:3)

您可以使用此来电获取文件信息:

D3DXIMAGE_INFO info;
D3DXGetImageInfoFromFile(file_name, &info);

虽然知道原始纹理大小,但仍会在加载时调整大小。这显然会影响纹理质量。当你在网格上应用它时,纹理大小调整并不是什么大问题(无论如何都会调整大小)但是对于绘制精灵这可能是一个问题。为了解决这个问题,我建议创建一个表面,通过D3DXLoadSurfaceFromFile加载它,然后将其复制到“pow2”大小的纹理。

还有一个offtopic:你肯定对你的卡片功能有信心吗?可能实际上你的卡支持任意纹理大小但你使用D3DXCreateTextureFromFile()由deafult强制执行pow2大小。为避免这种情况,请尝试使用此例程的扩展版本:

D3DTexture* texture;
D3DXCreateTextureFromFileEx(
    device, file_name, D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT, 0,
    D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL,
    &texture);

如果您的硬件支持非pow2纹理,您将按原样加载文件。如果硬件无法处理,则方法将失败。