纹理操作

转载 2017年01月03日 14:34:30

纹理操作  

2010-05-27 18:24:03|  分类: DirectX 3D学习|举报|字号 订阅

在d3d8中,创建纹理的方法有: 
1、D3DXCreateTexture   ()   
2、D3DXCreateTextureFromFile   () 
3、D3DXCreateTextureFromFileEx   ()   
4、D3DXCreateTextureFromFileInMemory   ()   
5、D3DXCreateTextureFromFileInMemoryEx   ()   
6、D3DXCreateTextureFromResource   () 
7、D3DXCreateTextureFromResourceEx   ()   
其中只有第1种是可以用自定义的纹理图片的格式(要自己编写文件读取函数,大部分游戏都是自定义格式的,很少有人直接用bmp,tag,png等末经压缩的文件,容量大不说,而且容易被别人盗用),那么现在问题出现了,用函数D3DXCreateTexture   ()   创建纹理的方法如下: 

LPDIRECT3DDEVICE8 m_pd3dDevice; 
LPDIRECT3DTEXTURE8                                     pTexture; 

//其它初始化代码略,直接跳到创建纹理处 

//读取图象(这是我自定义的格式*.shp),Load_Image(...)函数是自己写的 
if   (!Load_Image(&image, "com280001.SHP ")) 
        return; 

HRESULT   hr; 
//创建纹理表面 
hr   =   D3DXCreateTexture(m_pd3dDevice,   image.m_Width,   image.m_Height,   0,   0,   D3DFMT_R5G6B5,   D3DPOOL_MANAGED,   &pTexture); 

if(FAILED(hr)) 

        MessageBox(NULL, "Cannot   create   texture! ", "ERROR ",MB_OK); 
        return; 


D3DSURFACE_DESC   pDesc; 
pTexture-> GetLevelDesc(0,   &pDesc   ); 

D3DLOCKED_RECT   d3dlr; 
//锁定纹理表面 
pTexture-> LockRect(   0,   &d3dlr,   0,   0   ); 
WORD   *   pDst   =   (WORD   *)d3dlr.pBits; 
int   DPitch   =   d3dlr.Pitch> > 1; 

//逐个象素扫描并写进纹理表面 
for   (int   y=0;   y <m_Height;   ++y){ 
        for   (int   x=0;   x <m_Width;   ++x) 
        {   
pDst[y*DPitch   +   x]   =   image.buffer[y*shp.width   +   x]; 
        } 

//解锁 
pTexture-> UnlockRect   (0); 
//释放图片占用的资源 
Unload_Image(&image); 

到这里纹理已成功创建了,但还有一个问题:如何设定颜色关键字(即colorkey)? 
用D3DXCreateTextureFromFileEx   ()   
或D3DXCreateTextureFromFileInMemoryEx   ()   
或D3DXCreateTextureFromResourceEx   () 
这些函数可以设定colorkey,但只能用指定的几种格式文件如bmp、tga等。 
象我这种用自定义的文件格式的话如何设定colorkey? 

 

colorkey其实是surface的属性,只不过大部分texture都只有一个surface,(cube,Mip有多个,但colorkey的设置一般也一样),所以D3DX中有一些简化的用法。 

要达到你的目标可以用IDirect3DTexture9::GetSurfaceLevel(0)获得第一个表面然后设置colorkey,或者你可以先在内存里把你的格式写成位图(反正都需要这一步),然后再用D3DXCreateTextureFromFileInMemoryEx   ()   。 

我可不是高手,说错了别介意。

 

//有一种笨方法: 
//创建两个纹理,一个用于显示,设为txture1,一个用于存放图片,设为texture2, 
LPDIRECT3DTEXTURE8         texture1; 
LPDIRECT3DTEXTURE8         texture2; 

//创建texture1(略)详细见上面,不过要注意象素格式不能设为R5G6B5,而是一定要带有alpha值的,否则ColorKey没有用。我用的是A1R5G5B5格式。 

//创建texture2并将图片载入texture2(略)详细见上面,象素格式必须对应你的图片象素的格式。我的图片象素格式是R5G6B5。 

//再创建两个表面:分别用来指向两个纹理的surface; 
LPDIRECT3DSURFACE8         surface1; 
LPDIRECT3DSURFACE8         surface2; 
//用来指向两个纹理的surface 
texture1-> GetSurfaceLevel(0,   &surface1); 
texture2-> GetSurfaceLevel(0,   &surface2); 

//然后用函数D3DXLoadSurfaceFromSurface()把surface2复制到surface1 
D3DXLoadSurfaceFromSurface(surface1, 
        NULL, 
        NULL, 
        surface2, 
        NULL, 
        NULL, 
        D3DX_DEFAULT, 
        ColorKey); 
//然后自己指定参数中的ColorKey,就可以在渲染中使用texture1了。贴出来的图片果然是背景透明。 


这是我想出的笨方法,谁有更好的方法的话,望指教!

纹理操作

纹理操作   2010-05-27 18:24:03|  分类: DirectX 3D学习|举报|字号 订阅      ...
  • linuxheik
  • linuxheik
  • 2017年01月03日 14:34
  • 159

纹理(讲得比较详细的文章)

真够详细的 http://www.gesoftfactory.com/developer/Textures.htm 纹理是增强计算机生成的三维图像的真实感的有力工具。Micro...
  • buck84
  • buck84
  • 2013年05月30日 10:53
  • 1984

图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)

一:基本思想 做法非常简单,首先找到一张你想要的纹理素材图片,然后将该图片通过灰度 转换成一张灰度级别的纹理图,取得像素数据,扫描每个像素的灰度值来设置 纹理图像的每个像素的透明度。灰度值越高越...
  • jia20003
  • jia20003
  • 2013年01月11日 00:27
  • 4153

OpenGL-对纹理的理解

看了《OpenGL编程指南》第九章纹理贴图之后,一开始还对纹理的理解思路还是有点乱,后面不断的阅读别人的博客之后才慢慢的有了更加清晰的认识,于是通过博客再进一步理顺一下思路。1.关于纹理的一些基本概念...
  • yanglusheng
  • yanglusheng
  • 2016年10月06日 10:31
  • 2864

如何使用CCRenderTexture来创建动态纹理

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作...
  • yxtxiaotian
  • yxtxiaotian
  • 2016年05月08日 12:50
  • 507

用OpenGL的Image特性实现纹理数据的直接读写操作

纹理在glsl里是sampler,是只能读不能写的,以前要实现通用计算的数据输出,就得建一个FBO,绑定一张跟源纹理一样大的新纹理,把计算结果画上去。但是写入数据的位置却是不能任意指定的,只能是当前绘...
  • u010462297
  • u010462297
  • 2016年01月06日 16:26
  • 2437

Cocos2dx--纹理使用

理论要点 1,内存大小与图片大小 2,内存大小计算(只与尺寸和像素格式相关),本地磁盘大小计算? 3,纹理使用流程分析 4,android,ios纹理选择,优缺点分析 5,jpg内存中都转换...
  • u010223072
  • u010223072
  • 2017年10月19日 17:24
  • 288

OpenGL-纹理设置

纹理的使用是非常复杂的。因此即使是入门教程,在编写时我也多次进行删改,很多东西都被精简掉了,但本课的内容仍然较多。 1、启用纹理和载入纹理 就像我们曾经学习过的OpenGL光照、混合等功能...
  • dcba2014
  • dcba2014
  • 2016年09月21日 09:35
  • 399

OpenGL纹理设置

这篇博客将主要介绍OpenGL纹理的有关操作
  • stephn1996
  • stephn1996
  • 2017年06月11日 13:28
  • 127

BGRABitmap图像操作10:使用纹理映射

http://wiki.lazarus.freepascal.org/BGRABitmap_tutorial_10     第一个例子,图像不变形,需要改进。 unit Unit1; {$m...
  • bq_cui
  • bq_cui
  • 2016年09月19日 07:27
  • 158
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:纹理操作
举报原因:
原因补充:

(最多只允许输入30个字)