您的位置:首页 > 其它

D3DXCreateTextureFromFileEx的应用

2015-11-07 15:58 441 查看
2014/09/18

(转自:/article/4838609.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性能黑洞
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: