所以我发现我的显卡自动将纹理大小调整为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的奇怪废话)
答案 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纹理,您将按原样加载文件。如果硬件无法处理,则方法将失败。