DirectX学习笔记_关于Sprite.Draw2D的说明

摘要:
1TexturesrcTexture=纹理加载程序。从文件;Render()渲染方法1publiccoverridevoidRender2D()2{3splite.Begin;//开始绘制45sprite.Draw2D;//基本绘制67sprite.End();//结束绘制89}在上面的代码中,我们在50×50点绘制纹理,其他参数为默认值,测试图像的大小为100×100。但是在绘制纹理后,会发现,如果你想显示与原始图像大小相同的纹理,纹理的高度和宽度不是100×100,而是128×128,将第三个参数更改为newSizeF:1publiccoverridevoidRender2D()2{3splite.Begin;//开始绘制45sprite.Draw2D;//基本绘制67sprite.End();//结束绘制89}让我们讨论第四个参数纹理旋转轴的坐标。正确的分配应该是128的一半。

在DirectX的Sprite中提供一个Draw2D的方法,该方法绘制一个Sprite对象用于二维空间中显示,在DirectX 9.0C中,该方法有6个重载,分别是

1publicvoidDraw2D(TexturesrcTexture,PointFrotationCenter,floatrotationAngle,PointFposition,Colorcolor);
2publicvoidDraw2D(TexturesrcTexture,PointFrotationCenter,floatrotationAngle,PointFposition,intcolor);
3publicvoidDraw2D(TexturesrcTexture,RectanglesrcRectangle,SizeFdestinationSize,PointFposition,Colorcolor);
4publicvoidDraw2D(TexturesrcTexture,RectanglesrcRectangle,SizeFdestinationSize,PointFposition,intcolor);
5publicvoidDraw2D(TexturesrcTexture,Rectangle*srcRectangle,SizeF*destinationSize,PointF*center,floatrotationAngle,PointFposition,intcolor);
6publicvoidDraw2D(TexturesrcTexture,RectanglesrcRectangle,SizeFdestinationSize,PointFrotationCenter,floatrotationAngle,PointFposition,Colorcolor);
7publicvoidDraw2D(TexturesrcTexture,RectanglesrcRectangle,SizeFdestinationSize,PointFrotationCenter,floatrotationAngle,PointFposition,intcolor);

这里我将以

publicvoidDraw2D(TexturesrcTexture,RectanglesrcRectangle,SizeFdestinationSize,PointFrotationCenter,floatrotationAngle,PointFposition,Colorcolor);作为例子来说明该方法实现的效果,其余重载函数均是参数个数和类型不同。
参数说明(*注意:我们所说的纹理大小和实际图片大小不同,即纹理的高宽并不等于实际图片的高宽,稍后会有说明)
TexturesrcTexture——源纹理;
RectanglesrcRectangle——显示纹理的矩形范围,由矩形左上角坐标和宽高共4个参数描述,当矩形范围小于源纹理大小时可用于切割图片,指定Empty不使用;
SizeFdestinationSize——纹理的高宽,可用于缩放纹理,指定Empty为使用源纹理大小;PointFrotationCenter——纹理旋转轴点坐标,在给该参数赋值时需要注意两个情况,一个是轴点在纹理范围内,一个是在纹理外,两种情况下赋值不一样,稍后说明;
floatrotationAngle——旋转度数,此处使用弧度为计量单位;
PointFposition——纹理显示位置,即纹理左上角坐标,决定纹理在哪里进行绘制;
Colorcolor——颜色覆盖,取White时候透明处理;
当图片通过TextureLoader.FromFile()加载进来后,给方法把原始图片解释为一个纹理,此时纹理的大小不再是原始图片的大小,也就是说纹理的高宽和于是图片的高宽在数值上并不相等,纹理的大小为2的幂。

1TexturesrcTexture=TextureLoader.FromFile(device,imagePath//图片路径);

Render()渲染方法

1publicoverridevoidRender2D()
2{
3sprite.Begin(SpriteFlags.AlphaBlend);//开始绘制45sprite.Draw2D(srcTexture,Rectangle.Empty,SizeF.Empty,PointF.Empty,0.0f,newPointF(50,50),Color.White);//基本绘制67sprite.End();//结束绘制89}

上述代码中,我们将纹理绘制在50×50处,其他参数使用默认,测试用图片大小为100×100

DirectX学习笔记_关于Sprite.Draw2D的说明第1张


但纹理绘制出来以后会发现 此时纹理的高宽并不是100×100,而是128×128,(纹理的大小为2的幂),如果要显示与原始图片大小相同的纹理,则将第三个参数改为new SizeF(100,100)即可:(我们可以通过GetLevelDescription()方法来获取纹理的高宽)

1publicoverridevoidRender2D()
2{
3sprite.Begin(SpriteFlags.AlphaBlend);//开始绘制45sprite.Draw2D(srcTexture,Rectangle.Empty,newSizeF(100,100),PointF.Empty,0.0f,newPointF(50,50),Color.White);//基本绘制67sprite.End();//结束绘制89}

DirectX学习笔记_关于Sprite.Draw2D的说明第2张


下面我们来讨论关于第4个参数纹理旋转轴点坐标。

刚才我们说到这个参数的赋值分不同的情况考虑,如果指定为Empty则以纹理左上角坐标为轴点坐标。

DirectX学习笔记_关于Sprite.Draw2D的说明第3张


设定条件为 纹理位置(左上角坐标)为(10,10),原始图片高宽为100*100,我们想让图片以自己的中心点为轴点旋转,照常理,此时轴点坐标应该为(60,60),当我们将此作为轴点坐标传入方法运行后发现 图形并没有以自己的中心点为轴点旋转,而是偏离了一些。(如果看不清可以写一个for循环画出360张纹理即可以表示轨迹)

DirectX学习笔记_关于Sprite.Draw2D的说明第4张

此时回到最初的问题,纹理的大小并不是100*100,而是128*128,那我们传入(69,69)应该就是对的了,于是我们再次运行发现还是存在偏差 纹理的4个角并没有与轨迹相接。

DirectX学习笔记_关于Sprite.Draw2D的说明第5张


正确的赋值应该是(64,64),即128的一半。

DirectX学习笔记_关于Sprite.Draw2D的说明第6张


于是我们得到以下规律

如果需要纹理以本身纹理以外的点为轴点旋转,传入该点坐标即可,如果我们需要以纹理范围内的点为轴点则需要换算坐标信息,例如中点 比例是1/2,所以将比例系数乘以128(128可以通过GetLevelDescription()获取)!

免责声明:文章转载自《DirectX学习笔记_关于Sprite.Draw2D的说明》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇临时表与表变量深入探究[WPF] 如何调试Data Binding下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Direct3D11学习:(一)开发环境配置

转载请注明出处:http://www.cnblogs.com/Ray1024 从今天开始,开启一个新的系列:Direct3D11的学习教程。 因为一直对3D方面比较感兴趣,最近决定开始学习D3D知识。我之前也没有接触过Direct3D9,在网络上咨询过一些大神,大家都推荐直接从D3D11开始学起。我想了好久终于下决心买了一本D3D11的龙书《Introdu...

DirectX SDK版本与Visual Studio版本 [转]

DirectX SDK版本与Visual Studio版本    分类: DirectShow |  标签:sdk  directshow  directx  版本  visual  |字号 订阅     对于刚刚接触 DirectShow 的人来说,安装配置是一个令人头疼的问题,经常出现的情况是最基本的 baseclass 就无法编译。一开始我也为...

托管DirectX,从MDX到SlimDX的转换(转)

转自:http://gis4all.ru/zh-CN/net/managed-directx/ 开始迁移到托管DirectX SlimDX框架的,例如,MDX应用的帕特里克Murrisa地形的浏览器。 在托管DirectX代码所示,到新的代码,与SlimDX评论的形式。 MDX迁移项目中SlimDX 图书馆设置SlimDX“ 下载并安装“ 2010年2月S...

DirectX 官方文档

Windows 开发人员中心 https://docs.microsoft.com/zh-cn/windows/ DirectX 英文文档 https://docs.microsoft.com/en-us/windows/win32/direct3d12/directx-12-programming-environment-set-up DirectX 中...

DirectCompute & DirectX 11 计算着色器编程简介(翻译)

译者注:DirectX一直是Windows上图形和游戏开发的核心技术。DirectX提供了一种在显卡上运行的程序——着色器(Shader)。在DirectX 11之前,着色器是与具体的渲染步骤绑定的,例如像素着色器,顶点着色器等等。而从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算...

【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云邮箱:happylifemxy@qq.com 在从第一节开始看这个笔记系列的话,大家会发现,一上来就开始讲DirectX相关的内容,但是写了几节之后,又开始讲...