在D3D下,把纹理贴到对应大小的窗体上,为什么纹理比对应的BMP文件看起来更模糊?

xqhrs232 2009-07-13 10:38:45
加精
在D3D下,把纹理贴到对应大小的窗体上,为什么纹理比对应的BMP文件看起来更模糊?
...全文
2876 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
weilai1990 2010-05-19
  • 打赏
  • 举报
回复
mark
地球之子 2010-05-19
  • 打赏
  • 举报
回复
这么简单的问题,你们居然罗嗦了这么多…
不过有人说对了,模糊就是因为图片的边长不是2的n次方。自己用windows画图板把图片尺寸设置一下就可以了,比方说图片是1024x768,你就设置成1024x1024,然后保存图片。纹理坐标还要重新算一下。
hack002 2009-08-26
  • 打赏
  • 举报
回复
学习了,呵呵
yangkunjie 2009-08-24
  • 打赏
  • 举报
回复
但奇怪的是,现在无论是你的代码还是我改过的,纹理又全都正常了,这0.5像素好像没有效果了
yangkunjie 2009-08-24
  • 打赏
  • 举报
回复
to 行者
在我本机按如下定义是正常的
sVertex Verts[6] =
{

{ left, top, 0.0f, 1.0f, 0.0f, 0.0f}, // x, y, z, rhw, u, v
{ right, top, 0.0f, 1.0f, fWidth, 0.0f},
{ right, bottom, 0.0f, 1.0f, fWidth, fHeight},
{ left, top, 0.0f, 1.0f, 0.0f, 0.0f},
{ right, bottom, 0.0f, 1.0f, fWidth, fHeight},
{ left, bottom, 0.0f, 1.0f, 0.0f, fHeight},
};
按你的代码处理是一片花,我的测试环境是xpsp3+vs2005+d9
xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 axx1611 的回复:]
又研究了一下 发现一些有意思的事情。

按照D3D9 SDK文档的说法,D3DXCreateTextureFromFile(pDevice, pSrcFile, ppTexture)等价于
D3DXCreateTextureFromFileEx(pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppTexture);

我这样用(600x300是xxxx.bmp的大小):
D3DXCreateTextureFromFileEx(g_d3d_device, "xxxx.bmp",600,300, 0U, 0UL, D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,D3DX_FILTER_NONE,D3DX_FILTER_NONE, 0UL, NULL, NULL, &g_texture);

但可惜有些硬件不支持D3DX_DEFAULT_NONPOW2性能,比如我的显卡。。。在REF下很正常很清晰,HAL就不对了(这里说的是我的显卡,你的显卡不一定),HAL下的效果和高宽这两个参数用D3DX_DEFAULT是一样的,就是它会自动将其扩成2的整次方倍(多出来的部分被填黑了),这样就不得不在创建好纹理之后再去用GetLevelDesc取纹理的实际大小以便贴图的时候进行校正。。。

真是很不人性化啊。。。



[/Quote]

嗯 D3DX_FILTER_NONE 可以帮我们把贴图扩到2的幂次,要记得改贴图坐标阿。

下面摘自:http://topic.csdn.net/t/20040505/23/3035005.html
创建贴图的时候不要用任何过滤,如果贴图长宽是2的幂次的可以使用D3DXCreateTextureFromFileEx创建,否则会有拉伸。就算是600×600的贴图也要用1024×1024的文件来存储,使用时通过调整纹理坐标来显示600×600的部分。屏幕矩形的大小和贴图大小为一比一,同时屏幕坐标都要减去0.5,并且绘制时采用D3DTEXF_POINT过滤方式,就可以做到屏幕显示图片与贴图文件完全一致

xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 axx1611 的回复:]
其实我试的结果,只要图像长宽是2的整次方就是清晰的,否则不清晰
和别的都没什么关系。。。。

还有就是xingzhe2001贴的代码我显卡用HAL居然跑不起。。。 得用REF。。。

[/Quote]
是因为我没有clear z到1,所以会用默认的zbuffer中的值,不同的显卡初始化不一样吧。
axx1611 2009-08-20
  • 打赏
  • 举报
回复
这是我的测试代码的主要部分,各位看看在自己的显卡下正常不。


D3DXIMAGE_INFO d3di_info;
D3DXGetImageInfoFromFile("xxxx.bmp", &d3di_info);

float width = d3di_info.Width;
float height = d3di_info.Height;

D3DXCreateTextureFromFileEx(
g_d3d_device,
"xxxx.bmp",
D3DX_DEFAULT,
D3DX_DEFAULT,
0U,
0UL,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
0UL,
NULL,
NULL,
&g_texture);

D3DSURFACE_DESC d3ds_desc;
g_texture->GetLevelDesc(0, &d3ds_desc);

VERTEX verts[] = {
{ 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f },
{ width, 0.0f, 1.0f, 1.0f, width / d3ds_desc.Width, 0.0f },
{ 0.0f, height, 1.0f, 1.0f, 0.0f, height / d3ds_desc.Height },
{ width, height, 1.0f, 1.0f, width / d3ds_desc.Width, height / d3ds_desc.Height }
};

g_d3d_device->CreateVertexBuffer(sizeof(VERTEX) * 4, 0, VERTEX_FVF, D3DPOOL_DEFAULT, &g_vertex_buffer, NULL);

axx1611 2009-08-19
  • 打赏
  • 举报
回复
又研究了一下 发现一些有意思的事情。

按照D3D9 SDK文档的说法,D3DXCreateTextureFromFile(pDevice, pSrcFile, ppTexture)等价于
D3DXCreateTextureFromFileEx(pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppTexture);

我这样用(600x300是xxxx.bmp的大小):
D3DXCreateTextureFromFileEx(g_d3d_device, "xxxx.bmp", 600, 300, 0U, 0UL, D3DFMT_UNKNOWN,
D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0UL, NULL, NULL, &g_texture);

但可惜有些硬件不支持D3DX_DEFAULT_NONPOW2性能,比如我的显卡。。。在REF下很正常很清晰,HAL就不对了(这里说的是我的显卡,你的显卡不一定),HAL下的效果和高宽这两个参数用D3DX_DEFAULT是一样的,就是它会自动将其扩成2的整次方倍(多出来的部分被填黑了),这样就不得不在创建好纹理之后再去用GetLevelDesc取纹理的实际大小以便贴图的时候进行校正。。。

真是很不人性化啊。。。


axx1611 2009-08-19
  • 打赏
  • 举报
回复
其实我试的结果,只要图像长宽是2的整次方就是清晰的,否则不清晰
和别的都没什么关系。。。。

还有就是xingzhe2001贴的代码我显卡用HAL居然跑不起。。。 得用REF。。。
Ryan裤子 2009-07-28
  • 打赏
  • 举报
回复
只是画平面的,可以用精灵,方便很多啊
xingzhe2001 2009-07-27
  • 打赏
  • 举报
回复
你再试试吧z测试关掉。

xqhrs232 2009-07-21
  • 打赏
  • 举报
回复
有没QQ?看下我空间,我有QQ加下我看看。
xqhrs232 2009-07-21
  • 打赏
  • 举报
回复
有没QQ?看下我空间,我有QQ加下我看看。
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
崩溃阿,在我这里很好的
xqhrs232 2009-07-21
  • 打赏
  • 举报
回复
我就是把你的代码直接COPY下来的啊!!!
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
用我的代码在pC上试试 我这里很清晰阿
xqhrs232 2009-07-21
  • 打赏
  • 举报
回复
哦,那还真没办法。CSDN这点太笨了。我的图片显示的就是全花的,根本看不清楚图片的内容。
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
我传到别的地方,链接过来的
xqhrs232 2009-07-21
  • 打赏
  • 举报
回复
奇怪,你的图片是怎么上传的?
加载更多回复(70)

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧