日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度测试与alpha混合(3)

發布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度测试与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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。