初学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 ...
随机推荐
- ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系
ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY 是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景. ...
- 记一次重装系统后恢复EFS加密文件过程
之前用了8年的win7系统被我删注册表给折腾挂了, 无法进入系统, 无法进入安全模式, 无法使用光盘修复 只能重装系统,习惯性的重装前GHOST备份了一下 今天忽然发现有好几个项目文件居然成了绿色的, ...
- java并发编程之CompletionService
应用场景当向Executor提交多个任务并且希望获得它们在完成之后的结果,如果用FutureTask,可以循环获取task,并调用get方法去获取task执行结果,但是如果task还未完成,获取结果的 ...
- 教你使用 Reflexil 反编译.NET 转
转自:http://www.wxzzz.com/711.html http://sebastien.lebreton.free.fr/reflexil/ http://www.aneasystone. ...
- 第27章 LTDC/DMA2D—液晶显示
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
- Jquery与js简单对比
//Javascript window.onload=function () { var oBtn=document.getElementById('btn1'); oBtn.onclick=func ...
- Git&GitHub-初步使用
Git 1.安装 下载安装包,安装,默认安装了 Git GUI Here 和 Git Bash Here. 需要在哪里使用 git,只需在文件夹空白处右键,选择Git Bash Here即可打开 gi ...
- POJ 3528--Ultimate Weapon(三维凸包)
Ultimate Weapon Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 2430 Accepted: 1173 ...
- 远程连接Oracle 服务器 解决Oracle查询中文乱码
Dos方法: 依托于 目录下的文件 使用plsql developer 客户端软件进行连接 需要配置一下: 就是把Dos的客户端配置进来 然后,把服务器端的文件拷贝到你的的机器 并设置TNS_ADMI ...