颜色

来源:互联网 发布:php 异步消息队列 编辑:程序博客网 时间:2024/04/26 04:55
在Direct3D中,颜色用RGB三元组来表示,RGB数据可用两种不同的数据结构来保存,第一种是D3DCOLOR,它实际与DWORD完全相同,共有32位,D3DCOLOR类型中的各位被分成4个八位项同,每顶存放了一种颜色的分量值,
             32bit
alpha red,green,blue

typedef DWORD D3DCOLOR
#define D3DCOLOR_ARGB(a,r,g,b) \
    ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

#define D3DCOLOR_RGBA(r,g,b,a) D3DCOLOR_ARGB(a,r,g,b)

#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

//亮度,0-1
#define D3DCOLOR_COLORVALUE(r,g,b,a) \

    D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((b)*255.f),(DWORD)((a)*255.f))


着色模式 看下面测试代码

#include <windows.h>#include <d3d9.h>#include <d3dx9.h>#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")IDirect3D9* g_pD3d = NULL;IDirect3DDevice9* g_pDevice = NULL;IDirect3DVertexBuffer9 * triangle= NULL;struct ColorVertex{float x,y,z;D3DCOLOR clr;static const DWORD FVF;};const DWORD ColorVertex::FVF = D3DFVF_DIFFUSE | D3DFVF_XYZ;bool initd3d(HWND hwnd){g_pD3d = Direct3DCreate9(D3D_SDK_VERSION);D3DDISPLAYMODE display;ZeroMemory(&display,sizeof(display));g_pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display);D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.BackBufferFormat = display.Format;d3dpp.BackBufferHeight = 600;d3dpp.BackBufferWidth  = 800;d3dpp.Windowed = TRUE;d3dpp.hDeviceWindow = hwnd;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;g_pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pDevice);return true;}bool InitObject(){ColorVertex t[3]={-1.0f,0.0f,2.0f,D3DCOLOR_XRGB(255,0,0), 0.0f,1.0f,2.0f,D3DCOLOR_XRGB(0,255,0), 1.0f,0.0f,2.0f,D3DCOLOR_XRGB(0,0,255),};g_pDevice->CreateVertexBuffer(3*sizeof(ColorVertex),D3DUSAGE_WRITEONLY,ColorVertex::FVF,D3DPOOL_MANAGED,&triangle,0);void *p = NULL;triangle->Lock(0,sizeof(t),(void**)&p,0);memcpy(p,t,sizeof(t));triangle->Unlock();D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,float(800)/float(600),1.0f,1000.0f);g_pDevice->SetTransform(D3DTS_PROJECTION,&proj);g_pDevice->SetRenderState(D3DRS_LIGHTING,false);return true;}void RenderScence(){g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET,0xffffffff,1.0f,0);g_pDevice->BeginScene();g_pDevice->SetStreamSource(0,triangle,0,sizeof(ColorVertex));g_pDevice->SetFVF(ColorVertex::FVF);//draw leftD3DXMATRIX world;D3DXMatrixTranslation(&world,-1.25f,0.0f,0.0f);g_pDevice->SetTransform(D3DTS_WORLD,&world);g_pDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT);g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);/////draw rightD3DXMatrixTranslation(&world,1.25f,0.0f,0.0f);g_pDevice->SetTransform(D3DTS_WORLD,&world);g_pDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);g_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST,0,1);g_pDevice->EndScene();g_pDevice->Present(0,0,0,0);}void Shutdown(){if(g_pD3d){g_pD3d->Release();}if(g_pDevice){g_pDevice->Release();}}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){    static TCHAR szAppName[] = TEXT ("COLOR");    HWND         hwnd;    MSG          msg;    WNDCLASSEX   wndclassex = {0};    wndclassex.cbSize        = sizeof(WNDCLASSEX);    wndclassex.style         = CS_HREDRAW | CS_VREDRAW;    wndclassex.lpfnWndProc   = WndProc;    wndclassex.cbClsExtra    = 0;    wndclassex.cbWndExtra    = 0;    wndclassex.hInstance     = hInstance;    wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);    wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);    wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);    wndclassex.lpszMenuName  = NULL;    wndclassex.lpszClassName = szAppName;    wndclassex.hIconSm       = wndclassex.hIcon;    if (!RegisterClassEx (&wndclassex))    {        MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);        return 0;    }    hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,                   szAppName,                   TEXT ("WindowTitle"),                  WS_OVERLAPPEDWINDOW,                  CW_USEDEFAULT,                   CW_USEDEFAULT,                   800,                   600,                   NULL,                   NULL,                   hInstance,                  NULL); initd3d(hwnd);InitObject();      ShowWindow (hwnd, iCmdShow);    UpdateWindow (hwnd);    while (msg.message!=WM_QUIT)    {if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){TranslateMessage (&msg);DispatchMessage (&msg);}else{RenderScence();}    }Shutdown();    return msg.wParam;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)    {    case WM_DESTROY:        PostQuitMessage (0);        return (0);    }    return DefWindowProc (hwnd, message, wParam, lParam);}

原创粉丝点击