【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 7486|回复: 18

LPD3DXSPRITE的draw函数画出的图片比原图大

[复制链接]
发表于 2009-2-25 14:36:30 | 显示全部楼层 |阅读模式
[BR] 
[BR]而且还有比如目标位置为 D3DXVECTOR2  vPosition(100.0f,100.0f) 的时候,
[BR]pSprite->Draw(m_btBackTexture,NULL,NULL, &vCenter , 0 ,&vPosition, g_btColor[m_bColorIndex*4]);
[BR]图片在窗口中的位置就不是(100,100)的坐标.
[BR]-------
[BR]如果这样
[BR] 
[BR]pSprite->Draw(m_btBackTexture,NULL,NULL, &vCenter , 0 , NULL, g_btColor[m_bColorIndex*4]);
[BR]图片的位置就正确,就在左上角.位置为点(0,0);
[BR] 
[BR] 
 楼主| 发表于 2009-2-25 17:03:21 | 显示全部楼层
[BR]比如说要把一张图贴到窗口坐标(50,50),就是图片的左上角的窗口坐标为(50,50)
[BR]用DX9应该怎么写呢?
发表于 2009-2-25 15:48:31 | 显示全部楼层

哦。。。看来我们用的 SDK 不是一个版本啊。。。

我的 SDK 中 pSprite->Draw() 函数,只有5个参数,你的 SDK 版本中,这个函数有7个参数啊。。。

 

还有,我的 SDK 中,vPosition 这个地方,数据类型是 D3DXVECTOR3 。。。而你所用的是 D3DXVECTOR2 

 

最有可能是这样:

 

你在 pSprite->Draw() 之前,有没有使用 pSprite->SetTransform()去移动世界矩阵,如果有,那么 pSprite->Draw() 函数中的 vPosition 参数是不起作用的。。。

 

我的经验就是:pSprite->SetTransform() 和 pSprite->Draw() 函数中的 vPosition 参数 不能同时用来指定精灵的位置。

 

要么在 pSprite->Draw() 之前,用 pSprite->SetTransform()把位置指定,然后 pSprite->Draw() 里面的 vPosition 参数设置为NULL

要么,不使用 pSprite->SetTransform()指定位置,在 pSprite->Draw() 里面填写 vPosition 参数来指定位置

发表于 2009-2-25 15:51:38 | 显示全部楼层

你帖子的标题是:LPD3DXSPRITE的draw函数画出的图片比原图大

你的代码只说是,画的位置不对,到底是什么症状哦???

到底是大小不对,还是位置不对啊??还是都不对??

 楼主| 发表于 2009-2-25 15:54:58 | 显示全部楼层
大小不对,位置也不对, 我用的是DX8.1
 楼主| 发表于 2009-2-25 15:56:04 | 显示全部楼层
 pSprite->Draw() 里面的参数是D3DXVECTOR2. 你看帮助
 楼主| 发表于 2009-2-25 15:56:58 | 显示全部楼层

HRESULT Draw(     LPDIRECT3DTEXTURE9 pSrcTexture,     CONST RECT *pSrcRect,     CONST D3DXVECTOR2 *pScaling,     CONST D3DXVECTOR2 *pRotationCenter,     FLOAT Rotation,     CONST D3DVECTOR2 *pTranslation,     D3DCOLOR Color);pSrcTexture[in]指向精灵的贴图对象

pSrcRect[in]源贴图的位置结构,,若为NULL原点在(0,0)
pScaling[in]缩放矢量,,若为NULL原大小(1。0,1。0)
pRotationCenter[in]旋转中心,,若为NULL在(0,0)
Rotation[in]旋转的弧度,,逆时针
Translation[in]目标位置像素坐标,,若为NULL原点在(0,0)
Color[in]混合的颜色值,,可包括Alpha值);
简单应用:
spr->Draw(tex, //前面创建的纹理NULL, //源矩阵,就像DirectDraw中那个NULL, //一个D3DXVECTOR2结构,表明在横竖方向分别扩大多少倍NULL, //一个D3DXVECTOR2结构,绕何点旋转0, //顺时针方向旋转多少弧度&D3DXVECTOR2(397,297), //放到屏幕上何处0xFFFFFFFF); //图像的颜色,ARGB格式,这里设为不透明白色
=================================
这是我查的函数使用说明, 您看看
发表于 2009-2-25 16:26:21 | 显示全部楼层

首先说说你的图片为什么比原来大的问题

你导入图片的函数是不是D3DXCreateTextureFromFile();

那么你看看你的图片是不是2的n次幂,也就是是不是 64 ,128, 256这样2的n次方的;如果不是,哪用PS把图片改成标准尺寸的,因为D3D只认2的n次方边长的纹理;

也可以调用D3DXCreateTextureFromFileEX()这个函数看看,它支持非2的n次幂边长的纹理加载;

 

看看下面的文章:

一篇文章搞定3DXSpriet !!

 

还有

http://forum.exceedu.com/forum/dispbbs.asp?boardID=46&ID=14193&page=1

 

翻番老帖 里面都有说得

 楼主| 发表于 2009-2-25 16:34:41 | 显示全部楼层
[BR]我的纹理的大小是64*64
[BR] 
[BR]D3DXIMAGE_INFO info; HRESULT rslt = D3DXCreateTextureFromResourceEx(m_d3dAllInfo.pDevice, GetModuleHandle( NULL ), MAKEINTRESOURCE(130),  0,   0,   1,  0,  D3DFMT_UNKNOWN,   D3DPOOL_MANAGED,  D3DX_FILTER_NONE,  D3DX_DEFAULT,  D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f),  &info,  NULL,   &m_BackTexture);
[BR]加载完成后,nfo获得的长宽分别是64,64
发表于 2009-3-3 16:28:27 | 显示全部楼层

MoveWindow ??? Win32 API??

使用这个 API 会影响到你在 DirectX 中的 Sprite 贴图操作???

发表于 2009-2-25 16:58:32 | 显示全部楼层

8.1 。。。

没用过,无法解答了。。。

我只用过 DX7 和 DX9。。。

抱歉啊。。。

 

你问问鼹鼠用过 DX8 没??

 

你为啥不用 DX9 ??

 楼主| 发表于 2009-2-25 17:04:18 | 显示全部楼层
[BR]http://forum.exceedu.com/forum/dispbbs.asp?boardID=46&ID=14193&page=1
[BR]这帖子里面说的, 我照着做了, 还是图片放大
 楼主| 发表于 2009-2-25 18:05:14 | 显示全部楼层
那位大虾可以帮我脱离苦海0 
 楼主| 发表于 2009-2-25 18:42:04 | 显示全部楼层
问题已经解决, 多谢各位大大,原来我是用了movewindow
发表于 2009-2-26 00:12:07 | 显示全部楼层
什么movewindow ?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-14 18:31

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表