DirectX纹理尺寸

4

我发现我的显卡会自动调整纹理为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,我只能看到我的原始纹理的一部分。

问题是,是否有函数或其他可以调用来查找我的纹理尺寸的方法? (我已经尝试通过谷歌搜索,但总是得到一些奇怪的关于对象和HSL之类的东西)

1个回答

3
您可以使用此调用获取文件信息:
D3DXIMAGE_INFO info;
D3DXGetImageInfoFromFile(file_name, &info);

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

还有一个话题:你确定你的显卡支持任意纹理大小吗?也许事实上你的显卡确实支持任意纹理大小,但你使用的是D3DXCreateTextureFromFile(),默认情况下强制使用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);

如果您的硬件支持非2次幂纹理,您可以按原样加载文件。如果硬件无法处理,则该方法将失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接