初学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 ...
随机推荐
- easyui分页的使用方法
使用: $("#tt").datagrid("getPager").pagination(option); 例子: $("#tb").dat ...
- Servlet是线程安全的吗
Servlet默认是单例模式,在web容器中只创建一个实例,所以多个线程同时访问Servlet是不安全的. 解决此类问题的办法是: 只要Servlet实现 SingleThreadModel 接口
- 二十五、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
在我们用 IntelliJ IDEA 向 SVN 或者 Git 提交代码的时候,IntelliJ IDEA 提供了一个自动分析代码的功能,即Perform code analysis: 如上图所示,当 ...
- Notes 20180306 : 变量与常量
1.1 变量与常量 我们在开发中会经常听到常量和变量,那么常量和变量指的又是什么呢?顾名思义,在程序执行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量.变量与常量的命名都必须使用合法的标 ...
- HP-UNIX平台修改Oracle processes参数报错:ORA-27154、ORA-27300、ORA-27301、ORA-27302
OS 版本 :HP-UX B.11.31Oracle版本:11.2.0.4 (RAC) (一)问题描述 最近发现无法连接上数据库,报错信息为“ORA-00020:maximum number ...
- iOS:网络请求(17-12-26更)
先开一篇,以后再补充... 1.判断请求数据是否为空. 参考简书<解决NSNull对象的烦恼> --ma772528138 之前使用网络请求没丢包,而使用 socket 的时候丢过包.如果 ...
- 产品 | What's产品经理
如果想知道什么是产品,首先需要知道什么是缔造者.其名曰:"产品经理". PS:产品经理一词在国内大多时候泛指"互联网产品经理". 对于产品经理这一职位,说实在很 ...
- RabbitMQ初学之踩坑记录
1:账号或密码错误 com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused usi ...
- AtomicReference 原子引用
AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,底层采用的是compareAndSwapInt实现CAS,比较的是数值是否相 ...
- Linux sed命令用法
概述 sed命令是一个面向字符流的非交互式编辑器,不允许用户与它进行交互操作.sed是以行为单位处理文本内容的.在shell中,可以批量修改文本内容. 用法 sed [选项] [动作] 选项与参数:- ...