• <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 閱讀(1639) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            伊人久久综合无码成人网| 国产成人精品久久一区二区三区| 精品久久久无码中文字幕天天| 热re99久久6国产精品免费| 亚洲综合伊人久久综合| 久久久噜噜噜久久| 日本强好片久久久久久AAA| 国产精品久久国产精麻豆99网站| 精品国产乱码久久久久久郑州公司 | 中文字幕精品久久| 奇米影视7777久久精品人人爽| 久久精品国产久精国产| AV无码久久久久不卡蜜桃| 97久久精品人人做人人爽| 99精品国产在热久久| 久久99国产精品久久99| 久久久久一本毛久久久| 色婷婷综合久久久久中文一区二区| 久久精品中文騷妇女内射| 亚洲国产日韩欧美综合久久| 久久综合综合久久97色| 久久精品免费观看| 色8久久人人97超碰香蕉987| 性欧美大战久久久久久久| 亚洲精品乱码久久久久久| 久久午夜夜伦鲁鲁片免费无码影视| 精品欧美一区二区三区久久久| 97香蕉久久夜色精品国产| 久久久久久精品成人免费图片| 狠狠色丁香久久婷婷综合图片| 国产真实乱对白精彩久久| 久久久久99精品成人片三人毛片| 日韩十八禁一区二区久久| 狠狠色丁香久久婷婷综合图片| 精品久久无码中文字幕| 久久久精品久久久久特色影视| 很黄很污的网站久久mimi色 | 无码人妻久久一区二区三区免费| 亚洲日韩中文无码久久| 久久无码一区二区三区少妇| 久久久久99这里有精品10|