• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            深度測試與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.0f3.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/41.0f1.0f100.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(00, (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(555), 1.0f0);    

                g_device
            ->BeginScene();

                setup_world_matrix();

                g_device
            ->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
                g_device
            ->SetFVF(D3DFVF_CUSTOM_VERTEX);
                g_device
            ->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02 * 50 - 2);

                
            // change all vertices's color and alpha 

                sCustomVertex
            * vertex;

                g_vertex_buffer
            ->Lock(050 * 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, 200100600500,
                                         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, 00, PM_REMOVE))
                        {
                            TranslateMessage(
            &msg);
                            DispatchMessage(
            &msg);
                        }
                            
                        render();
                        Sleep(
            10);
                    }
                }

                cleanup();
                UnregisterClass(CLASS_NAME, wc.hInstance);    

                
            return 0;
            }

             

            posted on 2008-05-10 14:25 lovedday 閱讀(1635) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久99久国产麻精品66| 久久国产亚洲精品麻豆| 久久久91人妻无码精品蜜桃HD| 久久久久久亚洲精品不卡| 思思久久99热只有频精品66| 五月丁香综合激情六月久久| 国产精品禁18久久久夂久| 色综合久久精品中文字幕首页 | 色偷偷91久久综合噜噜噜噜| 四虎影视久久久免费| 国产精品久久永久免费| 久久久亚洲欧洲日产国码是AV| 国产精品久久久久jk制服| 一级a性色生活片久久无| 99久久亚洲综合精品网站| 亚洲AV日韩精品久久久久久| 99久久综合狠狠综合久久| 婷婷五月深深久久精品| 色老头网站久久网| 青青青青久久精品国产h久久精品五福影院1421| 亚洲女久久久噜噜噜熟女| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲中文精品久久久久久不卡| 久久99国产一区二区三区| 2020最新久久久视精品爱| 久久久久成人精品无码中文字幕 | 久久国语露脸国产精品电影| 久久99精品久久久久久9蜜桃| 久久精品国产亚洲AV电影| 精品久久久无码人妻中文字幕| 午夜精品久久久久久影视riav| 久久99久久无码毛片一区二区| 久久99中文字幕久久| 99久久精品国内| 国产美女久久久| 亚洲综合精品香蕉久久网97| 久久精品一区二区国产| 中文字幕亚洲综合久久| 久久久中文字幕日本| 国产精品久久久久久久人人看| 久久无码AV一区二区三区|