深度测试与alpha混合(3)
alpha源混合系數通常設置為D3DBLEND_SRCALPHA,即當前繪制像素的alpha值。目標混合系數設置為D3DBLEND_INVSRCALPHA,即1減去當前繪制像素的alpha值。那么當前繪制像素的alpha值又是如何得到的呢?如果沒有使用材質和紋理,當前繪制像素的alpha值來自每個頂點顏色設置的alpha值;如果使用光照和材質,則當前像素的alpha值來自物體表面材質;如果為物體表面使用了紋理,則alpha值還與紋理有關。
?
頂點alpha
如果在程序中直接指定每個頂點的顏色,則可以直接給出每個頂點顏色的 alpha值,可以在定義頂點時直接聲明該頂點的alpha值,也可以在程序運行時動態地修改頂點的alpha值。有了頂點的alpha值,渲染對象中每個像素的alpha值由該對象的alpha值和著色模式決定。當著色模式為FLAT著色模式時,構成對象的各個多邊形中所有像素的alpha都等于該多邊形的第一個頂點的alpha值。當著色模式為GOURAUD著色模式時,每個多邊形面上的像素的alpha值由它的各個頂點的alpha值進行線性插值得到的。
?
示例程序:
圓筒在不斷的繞x, y, z軸旋轉。
按下數字鍵"1",啟用alpha頂點混合
?
按下數字鍵"0",禁用alpha頂點混合
?
源程序:
?
#include?<d3dx9.h>#pragma?warning(disable?:?4127)????//?disable?warning:?conditional?expression?is?constant
#define?CLASS_NAME????"GameApp"
#define?release_com(p)????do?{?if(p)?{?(p)->Release();?(p)?=?NULL;?}?}?while(0)
typedef?unsigned?char?uchar;
IDirect3D9*????????????????g_d3d;
IDirect3DDevice9*????????g_device;
IDirect3DVertexBuffer9*?g_vertex_buffer;
struct?sCustomVertex
{
????float?x,?y,?z;
????DWORD?color;
};
#define?D3DFVF_CUSTOM_VERTEX?(D3DFVF_XYZ?|?D3DFVF_DIFFUSE)?
void?setup_world_matrix()
{
????D3DXMATRIX?mat_world;
????D3DXMatrixIdentity(&mat_world);
????float?angle?=?(timeGetTime()?%?1000)?*?(2?*?D3DX_PI)?/?1000.0f;
????D3DXQUATERNION?quat;
????D3DXMATRIX?mat_rotation;
????D3DXQuaternionRotationYawPitchRoll(&quat,?angle,?angle,?angle);
????D3DXMatrixRotationQuaternion(&mat_rotation,?&quat);
????D3DXMatrixMultiply(&mat_world,?&mat_rotation,?&mat_world);
????g_device->SetTransform(D3DTS_WORLD,?&mat_world);
}
void?setup_view_proj_matrices()
{
????//?setup?view?matrix
????D3DXVECTOR3?eye(0.0f,?3.0f,?-5.0f);
????D3DXVECTOR3?at(0.0f,??0.0f,???0.0f);
????D3DXVECTOR3?up(0.0f,??1.0f,???0.0f);
????D3DXMATRIX?mat_view;
????D3DXMatrixLookAtLH(&mat_view,?&eye,?&at,?&up);
????g_device->SetTransform(D3DTS_VIEW,?&mat_view);
????//?setup?projection?matrix
????D3DXMATRIX?mat_proj;
????D3DXMatrixPerspectiveFovLH(&mat_proj,?D3DX_PI/4,?1.0f,?1.0f,?100.0f);
????g_device->SetTransform(D3DTS_PROJECTION,?&mat_proj);
}
void?init_vb()
{????
????g_device->CreateVertexBuffer(50?*?2?*?sizeof(sCustomVertex),?0,?D3DFVF_CUSTOM_VERTEX,?D3DPOOL_DEFAULT,?
?????????????????????????????????&g_vertex_buffer,?NULL);
????sCustomVertex*?vertices;
????g_vertex_buffer->Lock(0,?0,?(void**)&vertices,?0);
????for(int?i?=?0;?i?<?50;?i++)
????{
????????float?theta?=?(2?*?D3DX_PI?*?i)?/?(50?-?1);
????????vertices[2?*?i?+?0].x??????=?sin(theta);
????????vertices[2?*?i?+?0].y??????=?-1.0f;
????????vertices[2?*?i?+?0].z??????=?cos(theta);????????????
????????vertices[2?*?i?+?0].color?=?0x88FF0000;
????????vertices[2?*?i?+?1].x??????=?sin(theta);
????????vertices[2?*?i?+?1].y??????=?1.0f;
????????vertices[2?*?i?+?1].z??????=?cos(theta);????????????
????????vertices[2?*?i?+?1].color?=?0x8844FF00;
????}
????
????g_vertex_buffer->Unlock();
}
bool?init_d3d(HWND?hwnd)
{
????g_d3d?=?Direct3DCreate9(D3D_SDK_VERSION);
????if(g_d3d?==?NULL)
????????return?false;
????D3DPRESENT_PARAMETERS?d3dpp;
????ZeroMemory(&d3dpp,?sizeof(d3dpp));
????d3dpp.Windowed????????????=?TRUE;
????d3dpp.SwapEffect????????=?D3DSWAPEFFECT_DISCARD;
????d3dpp.BackBufferFormat????=?D3DFMT_UNKNOWN;
????if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT,?D3DDEVTYPE_HAL,?hwnd,?D3DCREATE_SOFTWARE_VERTEXPROCESSING,
??????????????????????????????????&d3dpp,?&g_device)))
????{
????????return?false;
????}
????init_vb();
????setup_view_proj_matrices();
????g_device->SetRenderState(D3DRS_CULLMODE,?D3DCULL_NONE);
????g_device->SetRenderState(D3DRS_LIGHTING,?FALSE);
????g_device->SetRenderState(D3DRS_ALPHABLENDENABLE,?TRUE);
????g_device->SetRenderState(D3DRS_SRCBLEND,??D3DBLEND_SRCALPHA);
????g_device->SetRenderState(D3DRS_DESTBLEND,?D3DBLEND_INVSRCALPHA);
????return?true;
}
void?cleanup()
{
????release_com(g_vertex_buffer);
????release_com(g_device);
????release_com(g_d3d);
}
inline?void?extract_argb(D3DCOLOR?color,?uchar*?alpha,?uchar*?red,?uchar*?green,?uchar*?blue)
{
????//?Extract?alpha,?red,?green,?blue?from?D3D?color?value.
????if(alpha?!=?NULL)?*alpha?=?uchar((color?>>?24)?&?0xff);
????if(red???!=?NULL)?*red???=?uchar((color?>>?16)?&?0xff);
????if(green?!=?NULL)?*green?=?uchar((color?>>?8)?&?0xff);
????if(blue??!=?NULL)?*blue??=?uchar(color?&?0xff);
}
void?render()
{
????g_device->Clear(0,?NULL,?D3DCLEAR_TARGET,?D3DCOLOR_XRGB(5,?5,?5),?1.0f,?0);????
????g_device->BeginScene();
????setup_world_matrix();
????g_device->SetStreamSource(0,?g_vertex_buffer,?0,?sizeof(sCustomVertex));
????g_device->SetFVF(D3DFVF_CUSTOM_VERTEX);
????g_device->DrawPrimitive(D3DPT_TRIANGLESTRIP,?0,?2?*?50?-?2);
????//?change?all?vertices's?color?and?alpha?
????sCustomVertex*?vertex;
????g_vertex_buffer->Lock(0,?50?*?2?*?sizeof(sCustomVertex),?(void**)&vertex,?0);
????for(int?i?=?0;?i?<?50?*?2;?i++)
????{????
????????uchar?alpha,?red,?green,?blue;
????????extract_argb(vertex->color,?&alpha,?&red,?&green,?&blue);
????????if(++alpha?>?255)????alpha?=?0;
????????if(++red?>?255)????????red?=?0;
????????if(++green?>?255)????green?=?0;
????????if(++blue?>?255)????blue?=?0;
????????vertex->color?=?D3DCOLOR_RGBA(red,?green,?blue,?alpha);
????????vertex++;
????}????
????g_vertex_buffer->Unlock();
????g_device->EndScene();
????g_device->Present(NULL,?NULL,?NULL,?NULL);
}
LRESULT?WINAPI?WinProc(HWND?hwnd,?UINT?msg,?WPARAM?wParam,?LPARAM?lParam)
{
????switch(msg)
????{
????case?WM_KEYDOWN:
????????switch(wParam)
????????{
????????case?VK_ESCAPE:
????????????DestroyWindow(hwnd);
????????????break;
????????case?48:????//?press?key?"0",?disable?alpha?blend.
????????????g_device->SetRenderState(D3DRS_ALPHABLENDENABLE,?FALSE);
????????????break;
????????case?49:????//?press?key?"1",?enable?alpha?blend.
????????????g_device->SetRenderState(D3DRS_ALPHABLENDENABLE,?TRUE);
????????????break;
????????}????????
????????????
????????break;
????case?WM_DESTROY:????????
????????PostQuitMessage(0);
????????return?0;
????}
????return?DefWindowProc(hwnd,?msg,?wParam,?lParam);
}
int?WINAPI?WinMain(HINSTANCE?inst,?HINSTANCE,?LPSTR,?INT)
{
????WNDCLASSEX?wc;
????wc.cbSize????????????=?sizeof(WNDCLASSEX);
????wc.style????????????=?CS_CLASSDC;
????wc.lpfnWndProc????????=?WinProc;
????wc.cbClsExtra????????=?0;
????wc.cbWndExtra????????=?0;
????wc.hInstance????????=?inst;
????wc.hIcon????????????=?NULL;
????wc.hCursor????????????=?NULL;
????wc.hbrBackground????=?NULL;
????wc.lpszMenuName????????=?NULL;
????wc.lpszClassName????=?CLASS_NAME;
????wc.hIconSm????????????=?NULL;
????if(!?RegisterClassEx(&wc))
????????return?-1;
????HWND?hwnd?=?CreateWindow(CLASS_NAME,?"Direct3D?App",?WS_OVERLAPPEDWINDOW,?200,?100,?600,?500,
?????????????????????????????NULL,?NULL,?wc.hInstance,?NULL);
????if(hwnd?==?NULL)
????????return?-1;
????if(init_d3d(hwnd))
????{
????????ShowWindow(hwnd,?SW_SHOWDEFAULT);
????????UpdateWindow(hwnd);
????????MSG?msg;
????????ZeroMemory(&msg,?sizeof(msg));
????????while(msg.message?!=?WM_QUIT)
????????{
????????????if(PeekMessage(&msg,?NULL,?0,?0,?PM_REMOVE))
????????????{
????????????????TranslateMessage(&msg);
????????????????DispatchMessage(&msg);
????????????}
????????????????
????????????render();
????????????Sleep(10);
????????}
????}
????cleanup();
????UnregisterClass(CLASS_NAME,?wc.hInstance);????
????return?0;
}
轉載于:https://www.cnblogs.com/wonderKK/archive/2011/11/28/2266808.html
總結
以上是生活随笔為你收集整理的深度测试与alpha混合(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html 长文本 截断 jquery 扩
- 下一篇: opencv3编程入门-毛星云