初学Direct X(5)
初学Direct X(5)
前面学习了使用表面绘制屏幕,但这种方法与另一种比较起来,有着绘图速度颇慢以及缺乏对任何透明类型的支持,这就是前面的篮框以及炸弹会有黑色背景的原因,这种方法就是纹理。他可以绘制出有透明效果的物体,即只显示对象本身的像素而没有背景。
1. 加载带有位图的纹理
应该要让纹理像表面一样有该有的功能,比如将位图加载于纹理上。要做到这个,首先得创建纹理对象,它是LPDIRECT3DTEXTURE9类型:
LPDIRECT3DTEXTURE9 texture = NULL;
接着从位图中将位图加载到纹理中,其接口如下:
D3DXCreateTextureFromFileExA(
LPDIRECT3DDEVICE9 pDevice,
LPCSTR pSrcFile,
UINT Width,
UINT Height,
UINT MipLevels,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
DWORD Filter,
DWORD MipFilter,
D3DCOLOR ColorKey,
D3DXIMAGE_INFO* pSrcInfo,
PALETTEENTRY* pPalette,
LPDIRECT3DTEXTURE9* ppTexture);
可见这里面需要知道位图的大小以及D3DXIMAGE_INFO,这个需要使用D3DXGetImageInfoFromFile提前获取:
D3DXIMAGE_INFO image_info;
HRESULT result = D3DXGetImageInfoFromFile(filename.c_str(),&image_info);
下面是一个调用D3DXCreateTextureFromFileExA示例:
D3DXCreateTextureFromFileEx(
d3ddev,
filename.c_str(),
image_info.Width,
image_info.Height,
1,
D3DPOOL_DEFAULT,
D3DFMT_UNKNOWN,
D3DPOOL_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
transcolor,
&image_info,
NULL,
&texture
);
2. 将纹理使用渲染器绘制到屏幕上
2.1 初始化
首先需要定义一个渲染器,其定义是:
LPD3DXSPRITE spriteobj;
接下来要将其初始化,作用是将纹理附着在Direct设备上,以便使得Direct设备知道如何在后台缓冲区绘制纹理,以下是接口的定义:
HRESULT D3DXCreateSprite(
LPDIRECT3DDEVICE9 pDevice,
LPD3DXSPRITE* ppSprite);
2.2 绘制前后的操作
在主Direct设备调用BeginScene之后,就可以开始绘制纹理了,但是需要将表面锁住,这仅通过渲染器使用接口即可:
HRESULT Begin (DWORD Flags)
flags是必须的,通常是D3DXSPRITE_ALPHABLEND;当然在绘制完后需要对表面解锁,以便其他进程使用:
HRESULT End (VOID)
2.3 绘制
十分简单,渲染器,即LPD3DXSPRITE,仅需要使用单一的函数Draw来处理所有的变换,通过它可以执行透明,缩放,以及旋转,以下是这个函数的定义:
HRESULT Draw(
[in] LPDIRECT3DTEXTURE9 pTexture,
[in] const RECT *pSrcRect,
[in] const D3DXVECTOR3 *pCenter, // 旋转发生的中间点
[in] const D3DXVECTOR3 *pPosition, // 指定纹理的位置
[in] D3DCOLOR Color
);
这里还有一个D3DXVECTOR3类型,它是:
typedef struct D3DXVECTOR3 {
FLOAT x;
FLOAT y;
FLOAT z;
} D3DXVECTOR3, *LPD3DXVECTOR3;
color:可以是[0xFFFFFFFF - 0x00FFFFFF]:从不透明到透明,可以使用D3DCOLOR_RGBA来生成,一般设置为D3DCOLOR_XRGB(255, 255, 255),即为不透明
3. 运行一个例子看看
3.1 绘制无alpha通道位图,无选择ColorKey
生成图1之前,有几件事需要知道:
1)在加载位图到纹理时,将ColorKey设置为D3DCOLOR_XRGB(0, 0, 0),也就是黑色
2)背景色被清空为绿色
3)原始位图是24位图像,并不包含alpha通道

图1
从结果可以看出,在对其进行绘制时,会对其ColorKey标定的颜色进行背景色填充,似乎也达到了透明的效果:)
3.2 绘制无alpha通道位图,有选择ColorKey
生成图2之前,也有几件事需要知道:
1)在加载位图到纹理时,将ColorKey设置为D3DCOLOR_XRGB(255,0,255),也就是粉色
2)背景色被清空为绿色
3)原始位图是24位图像,不包含alpha通道

图2
从结果可以看出,这幅图似乎是我们想要的透明图(原图的背景色就是粉色,和图1处理的原图一样),这里可以看出ColorKey这个变量的意思了,它可以使其所在区域显示背景色,达到透明效果。
3.3 绘制alpha通道位图,有/无选择ColorKey
生成图3之前,也有几件事需要知道:
1)在加载位图到纹理时,将ColorKey设置为D3DCOLOR_XRGB(0,0,0),与图1一样的处理
2)背景色被清空为绿色
3)原始位图是32位图像,包含alpha通道

图3
从结果可以看出,似乎绘制的效果不太好,但是它反应出了这几点信息,第一:如果在加载纹理时设置了有效的ColorKey,Draw将毫不留情的将其透明,这导致了显示结果中的飞机头部以及边缘部分是背景颜色;第二:由于飞机背景在alpha通道中被设置为了透明,故在Draw的绘制下,将其透明,这一点合情合理。综上分析,可以看出,在面对带有alpha通道的位图时,Draw在绘制原本就该透明的像素时,也不会忘记处理ColorKey的区域
初学Direct X(5)的更多相关文章
- 初学Direct X(7) ——位图的旋转,缩放以及平移
初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...
- 初学Direct X(10)—— D3D基础预备知识
初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...
- 初学Direct X(9) ——文字的显示
初学Direct X(9) --文字的显示 本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一 ...
- 初学Direct X(8) ——碰撞检测
初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...
- 初学Direct X(6)
初学Direct X(6) 这一文本应和上一篇放在一起的,但是上一章写着写着发现对Draw绘制透明位图的方式有感觉了,决定就单写一篇,留作笔记了. 那这一篇是记录如何使用位图表来绘制动画帧,想象一下, ...
- 初学Direct X(4)
初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...
- 初学Direct X(3)
初学Direct X(3) 1.获取外设输入--键盘以及鼠标 无论是获取鼠标还是键盘的设备,首先得初始化DirectInput,不过先把必要的环境先配置好: 所要用到的头文件以及库文件是(相比于前两次 ...
- 初学Direct X (2)
初学Direct X (2) 这一次要学习如何现实位图,尽管看过对双缓冲机制还有很多疑问,但是这并不阻碍我对他的入门了解 Direct3D提供了一个双重/后台缓冲区,在调用CreateDevice之时 ...
- 初学DirectX(1)
初学Direct X (1) Direct3D设备用于访问视频卡的帧缓冲区,以及后台缓冲区.由于IDE是vs2013,默认安装了direct 9,只需要在使用头文件(1)并像使用库文件(2)即可 #i ...
随机推荐
- 【转】spring boot web相关配置
spring boot集成了servlet容器,当我们在pom文件中增加spring-boot-starter-web的maven依赖时,不做任何web相关的配置便能提供web服务,这还得归于spri ...
- 面试准备——(二)专业知识(1)Linux
面试的问题: 腾讯: 1. 查看进程的命令 美团: 1. 常用的命令——美团/滴滴 2. 如何在性能测试的时候查看进程 3. kill -9/-15区别 滴滴: 1.如何找到一个特定文件 2. 如何替 ...
- 2018年暑假ACM个人训练题6 解题报告
A:水题 https://www.cnblogs.com/yinbiao/p/9311834.html B:考察进制的转化 https://www.cnblogs.com/yinbiao/p/9311 ...
- 【SQLSERVER学习笔记】细节记录
SQLSERVER 查询时,WHERE中使用<>时,不会把NULL值查出来. SQLSERVER子查询中不能使用 ORDER BY. SQLSERVER 使用DISTINCT时,必须把OR ...
- C# 泛型的协变和逆变 (转载)
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...
- 确保img的宽高比固定
html: <div class="wrapper"> <swiper :options="swiperOption"> <swi ...
- Knowledge Point 20180308 Dead Code
不知道有没有前辈注意过,当你编写一段“废话式的代码时”会给出一个Dead Code警告,点击警告,那么你所写的废物代码会被编译器消除,那么如果你不理睬这个警告呢?编译后会是什么样的呢?下面我们写点代码 ...
- insert插入数据
insert 语法1 --插入的值需要用单引号引起来,否则字段插入会有问题,可能造成查询的时候查询不出结果 insert into 表名 (列名1,列名2……) ] values ( '值1' ...
- 微信网页授权-公众号支付(获取openid、用户信息等)
名词解释: openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID 业务功能描述:实现H5页面可以在微信浏览器里面进行微信支付,所以需要 ...
- 纯 js 让浏览器不缓存 ajax 请求
开发「bufpay.com 个人即时到账收款平台」支付页面需要用到 ajax 轮询订单的支付状态. 现在浏览器对 ajax 的缓存策略遵循 http response header 里面的缓存设置,为 ...