D3DXCreateTextureFromFileEx的应用
2015-11-07 15:58
441 查看
2014/09/18
(转自:/article/4838609.html)
上次在玩公告板时,用到了D3DXCreateTextureFromFileEx函数,上次的主要目的是公告板,对这个函数没太多的关心,现在发现这个函数是D3DXCreateTextureFromFile的高级板本,还是有它优势的,不然它就没有存在的意义了。D3DXCreateTextureFromFileEx这个函数有14个参数,在MSDN中的原型(后面中文解释为本人理解,仅供参考,原文请查看MSDN):
在上次的公告板中,调用为:
在这里,关键颜色值为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
想请问个问题,我用DX9画了一张PNG的图,可是该PNG图片中不透明的区域,也画出来了,还是白色的,本来只有一个椭圆的,其他部分透明,而结果就是一个正方形,除了椭圆是图形,其它地方是白色的,搞不定,求帮助,
支持(0)反对(0)
#2楼 2012-11-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
下面这个是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函数,上次的主要目的是公告板,对这个函数没太多的关心,现在发现这个函数是D3DXCreateTextureFromFile的高级板本,还是有它优势的,不然它就没有存在的意义了。D3DXCreateTextureFromFileEx这个函数有14个参数,在MSDN中的原型(后面中文解释为本人理解,仅供参考,原文请查看MSDN):
在上次的公告板中,调用为:
在这里,关键颜色值为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
想请问个问题,我用DX9画了一张PNG的图,可是该PNG图片中不透明的区域,也画出来了,还是白色的,本来只有一个椭圆的,其他部分透明,而结果就是一个正方形,除了椭圆是图形,其它地方是白色的,搞不定,求帮助,
支持(0)反对(0)
#2楼 2012-11-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
下面这个是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性能黑洞
(转自:/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性能黑洞
相关文章推荐
- 用php处理百万级以上的数据提高查询速度的方法
- 随堂笔记
- [07]scanf函数、printf函数
- java随堂笔记
- 常用排序算法
- PHP iconv(): Unknown error (84)
- 抽象与封装
- asp.net fileupload控件上传图片并预览图片
- 字符分割(二)
- 图像质量评价
- PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
- poj3295 构造法
- MP3播放器团队项目
- 在一个字符串中提取子字符串
- phonegap3.4.0 创建工程
- java随堂笔记
- 创建maven项目,如何修改其jdk默认版本
- [06]常量、变量
- Qtcreator 常用快捷键总结
- PowerShell介绍 第一回 "Shell Everything"