D3DXCreateTextureFromFileEx的应用

来源:互联网 发布:002174游族网络论坛 编辑:程序博客网 时间:2024/05/29 13:08

2014/09/18

(转自:http://www.cnblogs.com/wonderKK/archive/2011/11/07/2240306.html)

D3DXCreateTextureFromFileEx

D3DXCreateTextureFromFileEx
上次在玩公告板时,用到了D3DXCreateTextureFromFileEx函数,上次的主要目的是公告板,对这个函数没太多的关心,现在发现这个函数是D3DXCreateTextureFromFile的高级板本,还是有它优势的,不然它就没有存在的意义了。D3DXCreateTextureFromFileEx这个函数有14个参数,在MSDN中的原型(后面中文解释为本人理解,仅供参考,原文请查看MSDN):

复制代码
HRESULT D3DXCreateTextureFromFileEx(
LPDIRECT3DDEVICE9 pDevice, //调入是IDirect3DDevice9对象指针
LPCTSTR pSrcFile, //文件名
UINT Width, //图像的宽
UINT Height, //图像的长
UINT MipLevels, //图片的图层,一般用D3DX_DEFAULT,但也用1的
DWORD Usage, //设定这个纹理的使用方法,这个参数可以是0,

//D3DUSAGE_RENDERTARGET,和
//D3DUSAGE_DYNAMIC。一般我用的是0,你也可以使用了D3DUSAGE_DYNAMIC,
//这样可以动态改变纹理中的数据。如果你纹理不需要动态性改变,就不需要设定这
//个参数为D3DUSAGE_DYNAMIC。
D3DFORMAT Format, // 纹理的格式,可以自己定义,也可以直接定义为D3DFMT_UNKNOWN,让程序
//在载入图像文件时定义象素深度
D3DPOOL Pool, //这是如何管理这些纹理,一般使用D3DPOOL_MANAGED
DWORD Filter, //图像像素的过滤方式
DWORD MipFilter, //MIP的像素过滤方式
D3DCOLOR ColorKey, //透明色,设定这个颜色,在显示时,这图像中的这个颜色将忽略
D3DXIMAGE_INFO * pSrcInfo, //记录载入图片信息
PALETTEENTRY * pPalette, //记录调色板信息
LPDIRECT3DTEXTURE9 * ppTexture //用来储存载入图片的纹理对象实例
);
复制代码



在上次的公告板中,调用为:

复制代码
D3DXCreateTextureFromFileEx(
Device,
"Billboard.bmp",
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
0,
D3DFMT_A1R5G5B5,
D3DPOOL_MANAGED,
D3DX_FILTER_TRIANGLE,
D3DX_FILTER_TRIANGLE,
D3DCOLOR_RGBA(0,0,0,255),
NULL,
NULL,
&BillboardTexture);
复制代码

 

在这里,关键颜色值为D3DFMT_A1R5G5B5(就是RGB都少于5的颜色),将载入的图片里面的关键颜色值设置为透明色.只要在画时加上
Device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //启用alpha测试
就可以让指定的颜色透明。在公告和粒子系统中可能常用到这个函数。

分类: Direct3D
绿色通道: 好文要顶 关注我 收藏该文与我联系 
☆A希亿
关注 - 32
粉丝 - 36
+加关注
0
0
(请您对文章做出评价)
« 上一篇:D3DLIGHT9光源
» 下一篇:D3D中材质通过D3DMATERIAL9结构说明

posted on 2011-11-07 21:03 ☆A希亿 阅读(1043) 评论(3) 编辑 收藏

评论

#1楼 2012-11-03 15:53 若然子  

想请问个问题,我用DX9画了一张PNG的图,可是该PNG图片中不透明的区域,也画出来了,还是白色的,本来只有一个椭圆的,其他部分透明,而结果就是一个正方形,除了椭圆是图形,其它地方是白色的,搞不定,求帮助,
支持(0)反对(0)
  

#2楼 2012-11-03 16:03 若然子  

楼上说的那个问题,在你这里,找到了个方法,解决了,
现在是另一个问题,
我画的PNG图,是一个椭圆,边缘有锯齿,
而我用了HGE,或者DXTEX工具,或者GDI+画来了,就没有锯齿,
比较图片我放下面了,你帮我看下,


代码就一个文件,请帮忙看下,
谢谢,
HRESULT InitDirect3D(HWND hWnd) 
{
LPDIRECT3D9 pD3D = NULL;
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (pD3D == NULL) return E_FAIL;

D3DCAPS9 caps; int vp = 0;
pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps );
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
hWnd, vp, &d3dpp, &g_pd3dDevice);
pD3D->Release();

D3DXCreateTextureFromFileEx(
g_pd3dDevice, 
L"crate.dds", 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
0, 
D3DFMT_UNKNOWN, 
D3DPOOL_MANAGED, 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
0, 
NULL, 
NULL, 
&g_pTexture);

g_pd3dDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX), 0, 
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuf, NULL); 

CUSTOMVERTEX *pVertices = NULL;
g_pVertexBuf->Lock(0, 0, (void**)&pVertices, 0);

pVertices[0] = CUSTOMVERTEX(-128.0f, 128.0f, -1.0f, 0.0f, 0.0f);
pVertices[1] = CUSTOMVERTEX( 128.0f, 128.0f, -1.0f, 1.0f, 0.0f);
pVertices[2] = CUSTOMVERTEX( 128.0f, -128.0f, -1.0f, 1.0f, 1.0f);
pVertices[3] = CUSTOMVERTEX(-128.0f, -128.0f, -1.0f, 0.0f, 1.0f);

g_pVertexBuf->Unlock();
g_pd3dDevice->CreateIndexBuffer(6 * sizeof(WORD), 0, 
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuf, NULL);

WORD *pIndices = NULL;
g_pIndexBuf->Lock(0, 0, (void**)&pIndices, 0);

pIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2;
pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3;

g_pIndexBuf->Unlock();
D3DMATERIAL9 mtrl;
::ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
g_pd3dDevice->SetMaterial(&mtrl);

g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));
g_pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); //抗锯齿

g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x00000000);
g_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);

D3DXMATRIX matView;
D3DXVECTOR3 vEye(0.0f, 0.0f, -7.0f);
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);

D3DXMatrixOrthoLH(&matView, 800, 600, -1.0f, 1.0f);
D3DXMATRIX iden;
D3DXMatrixIdentity(&iden);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matView);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &iden);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &iden);

return S_OK;
}
支持(0)反对(0)
  

#3楼 2012-11-03 16:06 若然子  

下面这个是render函数


VOID Direct3DRender() 
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
D3DCOLOR_XRGB(100, 200, 100), 1.0f, 0);
g_pd3dDevice->BeginScene(); // 开始绘制

// 设置世界变换矩阵
FLOAT fAngle = (float)::timeGetTime() / 360.0f;

D3DXMATRIX matWorld, Rx, Ry, Rz;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixRotationX(&Rx, fAngle);
D3DXMatrixRotationY(&Ry, fAngle);
D3DXMatrixRotationZ(&Rz, fAngle);
matWorld = Rx * Ry * Rz * matWorld;
// g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

// 绘制立方体
g_pd3dDevice->SetStreamSource(0, g_pVertexBuf, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->SetIndices(g_pIndexBuf);
g_pd3dDevice->SetTexture(0, g_pTexture);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 6, 0, 4);
// g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

g_pd3dDevice->EndScene(); // 结束绘制
g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // 翻转
}
支持(0)反对(0)
  
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
【免费课程】系列:Android攻城狮的第二门课—第2季
听云App——终结移动App性能黑洞

☆渲染吧少年☆

D3DXCreateTextureFromFileEx

D3DXCreateTextureFromFileEx
上次在玩公告板时,用到了D3DXCreateTextureFromFileEx函数,上次的主要目的是公告板,对这个函数没太多的关心,现在发现这个函数是D3DXCreateTextureFromFile的高级板本,还是有它优势的,不然它就没有存在的意义了。D3DXCreateTextureFromFileEx这个函数有14个参数,在MSDN中的原型(后面中文解释为本人理解,仅供参考,原文请查看MSDN):

复制代码
HRESULT D3DXCreateTextureFromFileEx(
LPDIRECT3DDEVICE9 pDevice, //调入是IDirect3DDevice9对象指针
LPCTSTR pSrcFile, //文件名
UINT Width, //图像的宽
UINT Height, //图像的长
UINT MipLevels, //图片的图层,一般用D3DX_DEFAULT,但也用1的
DWORD Usage, //设定这个纹理的使用方法,这个参数可以是0,

//D3DUSAGE_RENDERTARGET,和
//D3DUSAGE_DYNAMIC。一般我用的是0,你也可以使用了D3DUSAGE_DYNAMIC,
//这样可以动态改变纹理中的数据。如果你纹理不需要动态性改变,就不需要设定这
//个参数为D3DUSAGE_DYNAMIC。
D3DFORMAT Format, // 纹理的格式,可以自己定义,也可以直接定义为D3DFMT_UNKNOWN,让程序
//在载入图像文件时定义象素深度
D3DPOOL Pool, //这是如何管理这些纹理,一般使用D3DPOOL_MANAGED
DWORD Filter, //图像像素的过滤方式
DWORD MipFilter, //MIP的像素过滤方式
D3DCOLOR ColorKey, //透明色,设定这个颜色,在显示时,这图像中的这个颜色将忽略
D3DXIMAGE_INFO * pSrcInfo, //记录载入图片信息
PALETTEENTRY * pPalette, //记录调色板信息
LPDIRECT3DTEXTURE9 * ppTexture //用来储存载入图片的纹理对象实例
);
复制代码



在上次的公告板中,调用为:

复制代码
D3DXCreateTextureFromFileEx(
Device,
"Billboard.bmp",
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
0,
D3DFMT_A1R5G5B5,
D3DPOOL_MANAGED,
D3DX_FILTER_TRIANGLE,
D3DX_FILTER_TRIANGLE,
D3DCOLOR_RGBA(0,0,0,255),
NULL,
NULL,
&BillboardTexture);
复制代码

 

在这里,关键颜色值为D3DFMT_A1R5G5B5(就是RGB都少于5的颜色),将载入的图片里面的关键颜色值设置为透明色.只要在画时加上
Device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //启用alpha测试
就可以让指定的颜色透明。在公告和粒子系统中可能常用到这个函数。

分类: Direct3D
绿色通道: 好文要顶 关注我 收藏该文与我联系 
☆A希亿
关注 - 32
粉丝 - 36
+加关注
0
0
(请您对文章做出评价)
« 上一篇:D3DLIGHT9光源
» 下一篇:D3D中材质通过D3DMATERIAL9结构说明

posted on 2011-11-07 21:03 ☆A希亿 阅读(1043) 评论(3) 编辑 收藏

评论

#1楼 2012-11-03 15:53 若然子  

想请问个问题,我用DX9画了一张PNG的图,可是该PNG图片中不透明的区域,也画出来了,还是白色的,本来只有一个椭圆的,其他部分透明,而结果就是一个正方形,除了椭圆是图形,其它地方是白色的,搞不定,求帮助,
支持(0)反对(0)
  

#2楼 2012-11-03 16:03 若然子  

楼上说的那个问题,在你这里,找到了个方法,解决了,
现在是另一个问题,
我画的PNG图,是一个椭圆,边缘有锯齿,
而我用了HGE,或者DXTEX工具,或者GDI+画来了,就没有锯齿,
比较图片我放下面了,你帮我看下,


代码就一个文件,请帮忙看下,
谢谢,
HRESULT InitDirect3D(HWND hWnd) 
{
LPDIRECT3D9 pD3D = NULL;
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (pD3D == NULL) return E_FAIL;

D3DCAPS9 caps; int vp = 0;
pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps );
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
hWnd, vp, &d3dpp, &g_pd3dDevice);
pD3D->Release();

D3DXCreateTextureFromFileEx(
g_pd3dDevice, 
L"crate.dds", 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
0, 
D3DFMT_UNKNOWN, 
D3DPOOL_MANAGED, 
D3DX_DEFAULT, 
D3DX_DEFAULT, 
0, 
NULL, 
NULL, 
&g_pTexture);

g_pd3dDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX), 0, 
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuf, NULL); 

CUSTOMVERTEX *pVertices = NULL;
g_pVertexBuf->Lock(0, 0, (void**)&pVertices, 0);

pVertices[0] = CUSTOMVERTEX(-128.0f, 128.0f, -1.0f, 0.0f, 0.0f);
pVertices[1] = CUSTOMVERTEX( 128.0f, 128.0f, -1.0f, 1.0f, 0.0f);
pVertices[2] = CUSTOMVERTEX( 128.0f, -128.0f, -1.0f, 1.0f, 1.0f);
pVertices[3] = CUSTOMVERTEX(-128.0f, -128.0f, -1.0f, 0.0f, 1.0f);

g_pVertexBuf->Unlock();
g_pd3dDevice->CreateIndexBuffer(6 * sizeof(WORD), 0, 
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuf, NULL);

WORD *pIndices = NULL;
g_pIndexBuf->Lock(0, 0, (void**)&pIndices, 0);

pIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2;
pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3;

g_pIndexBuf->Unlock();
D3DMATERIAL9 mtrl;
::ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
g_pd3dDevice->SetMaterial(&mtrl);

g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));
g_pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); //抗锯齿

g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x00000000);
g_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);

D3DXMATRIX matView;
D3DXVECTOR3 vEye(0.0f, 0.0f, -7.0f);
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);

D3DXMatrixOrthoLH(&matView, 800, 600, -1.0f, 1.0f);
D3DXMATRIX iden;
D3DXMatrixIdentity(&iden);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matView);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &iden);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &iden);

return S_OK;
}
支持(0)反对(0)
  

#3楼 2012-11-03 16:06 若然子  

下面这个是render函数


VOID Direct3DRender() 
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
D3DCOLOR_XRGB(100, 200, 100), 1.0f, 0);
g_pd3dDevice->BeginScene(); // 开始绘制

// 设置世界变换矩阵
FLOAT fAngle = (float)::timeGetTime() / 360.0f;

D3DXMATRIX matWorld, Rx, Ry, Rz;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixRotationX(&Rx, fAngle);
D3DXMatrixRotationY(&Ry, fAngle);
D3DXMatrixRotationZ(&Rz, fAngle);
matWorld = Rx * Ry * Rz * matWorld;
// g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

// 绘制立方体
g_pd3dDevice->SetStreamSource(0, g_pVertexBuf, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->SetIndices(g_pIndexBuf);
g_pd3dDevice->SetTexture(0, g_pTexture);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 6, 0, 4);
// g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

g_pd3dDevice->EndScene(); // 结束绘制
g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // 翻转
}
支持(0)反对(0)
  
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
【免费课程】系列:Android攻城狮的第二门课—第2季
听云App——终结移动App性能黑洞

0 0