• <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>

            天行健 君子當(dāng)自強(qiáng)而不息

            D3D中的Alpha融合技術(shù)(2)

            7.4使用DirectX紋理工具創(chuàng)建Alpha通道

                   絕大多數(shù)普通圖象文件格式?jīng)]有存儲(chǔ)alpha信息,在這一部分我們給你演示怎樣使用DirectX紋理工具來創(chuàng)建一個(gè)帶alpha通道的DDS文件。DDS文件是一個(gè)為DirectX應(yīng)用程序和紋理設(shè)置的圖象格式。DDS文件能夠利用D3DXCreateTextureFromFile函數(shù)讀進(jìn)紋理中,就象bmp和jpg文件一樣。DirectX紋理工具被放在你的DXSDK目錄下的\Bin\DXUtils文件夾下,文件名是DxTex.exe。

                   打開DirectX紋理工具,并且把crate.jpg文件用工具打開。木箱被自動(dòng)的按照24位RGB紋理被讀取。它包含8位紅色,8位綠色,以及8位藍(lán)色。我們需要將該紋理增加為32位ARGB紋理,增加的是額外的8位alpha通道。從菜單中選擇Format,選擇Change Surface Format。一個(gè)象圖7.5的對(duì)話框?qū)⒈粡棾觥_x擇A8R8G8B8格式點(diǎn)擊OK。

            圖7.5   改變紋理的格式

             

            它創(chuàng)建了一個(gè)32位顏色深度的圖象,它的每個(gè)象素都有8位alpha通道,8位紅色,8位綠色,8位藍(lán)色。我們下一步是向alpha通道中寫入數(shù)據(jù)。我們將圖7.3中的8位灰色圖片信息寫進(jìn)alpha通道中。選擇菜單中的File,選擇Open Onto Alpha Channel Of This Texture。一個(gè)對(duì)話框?qū)棾鲎屇氵x擇包含你想要寫入alpha通道中數(shù)據(jù)信息的圖片。選擇alphachannel.bmp文件。圖7.6顯示的是程序已經(jīng)插入了alpha通道數(shù)據(jù)。

            圖7.6  在Alpha通道作用下的紋理圖

            現(xiàn)在用你選擇的文件名存儲(chǔ)紋理;我們使用cratewalpha.dds文件名。

            示例程序:

            /**************************************************************************************
              Renders a semi transparent cube using alpha blending.
              In this sample, the alpha is taken from the textures alpha channel.    
             *************************************************************************************
            */

            #include 
            "d3dUtility.h"
            #include 
            "vertex.h"
            #include 
            "cube.h"

            #pragma warning(disable : 
            4100)

            const int WIDTH  = 640;
            const int HEIGHT = 480;

            IDirect3DDevice9
            *        g_d3d_device;

            IDirect3DTexture9
            *        g_crate_texture;
            cCube
            *                    g_cube;
            D3DXMATRIX                g_cube_world_matrix;

            IDirect3DVertexBuffer9
            * g_back_vb;
            IDirect3DTexture9
            *        g_back_texture;


            ////////////////////////////////////////////////////////////////////////////////////////////////////

            bool setup()
            {    
                
            // create the background quad
                g_d3d_device->CreateVertexBuffer(6 * sizeof(cTextureVertex), D3DUSAGE_WRITEONLY, TEXTURE_VERTEX_FVF,
                                                 D3DPOOL_MANAGED, 
            &g_back_vb, NULL);

                cTextureVertex
            * vertices;

                g_back_vb
            ->Lock(00, (void**)&vertices, 0);

                
            // quad built from two triangles, note texture coordinate.

                vertices[
            0= cTextureVertex(-10.0f-10.0f5.0f0.0f0.0f-1.0f0.0f1.0f);
                vertices[
            1= cTextureVertex(-10.0f,  10.0f5.0f0.0f0.0f-1.0f0.0f0.0f);
                vertices[
            2= cTextureVertex( 10.0f,  10.0f5.0f0.0f0.0f-1.0f1.0f0.0f);

                vertices[
            3= cTextureVertex(-10.0f-10.0f5.0f0.0f0.0f-1.0f0.0f1.0f);
                vertices[
            4= cTextureVertex( 10.0f,  10.0f5.0f0.0f0.0f-1.0f1.0f0.0f);
                vertices[
            5= cTextureVertex( 10.0f-10.0f5.0f0.0f0.0f-1.0f1.0f1.0f);

                g_back_vb
            ->Unlock();

                
            // create the cube
                g_cube = new cCube(g_d3d_device);

                
            // create the texture and set filters

                D3DXCreateTextureFromFile(g_d3d_device, 
            "cratewAlpha.dds",    &g_crate_texture);    
                D3DXCreateTextureFromFile(g_d3d_device, 
            "lobbyxpos.jpg",    &g_back_texture);    

                g_d3d_device
            ->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
                g_d3d_device
            ->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
                g_d3d_device
            ->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

                
            // set alpha blending states

                
            // use alhpa in material's diffuse component for alpha
                g_d3d_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
                g_d3d_device
            ->SetTextureStageState(0, D3DTSS_ALPHAOP,    D3DTOP_SELECTARG1);

                
            // set blending factors so that alpha component determines transparency
                g_d3d_device->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
                g_d3d_device
            ->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

                
            // disable lighting
                g_d3d_device->SetRenderState(D3DRS_LIGHTING, FALSE);

                
            // set camera

                D3DXVECTOR3 pos(
            0.0f0.0f-2.5f);
                D3DXVECTOR3 target(
            0.0f0.0f0.0f);
                D3DXVECTOR3 up(
            0.0f1.0f0.0f);

                D3DXMATRIX view_matrix;
                D3DXMatrixLookAtLH(
            &view_matrix, &pos, &target, &up);

                g_d3d_device
            ->SetTransform(D3DTS_VIEW, &view_matrix);

                
            // set the projection matrix
                D3DXMATRIX proj;
                D3DXMatrixPerspectiveFovLH(
            &proj, D3DX_PI * 0.5f, (float)WIDTH/HEIGHT, 1.0f1000.0f);
                g_d3d_device
            ->SetTransform(D3DTS_PROJECTION, &proj);
                
                
            return true;
            }

            void cleanup()
            {    
                safe_release
            <IDirect3DTexture9*>(g_crate_texture);    
                safe_release
            <IDirect3DVertexBuffer9*>(g_back_vb);
                safe_release
            <IDirect3DTexture9*>(g_back_texture);

                safe_delete
            <cCube*>(g_cube);    
            }

            bool display(float time_delta)
            {
                
            // update: rotate the cube.

                D3DXMATRIX x_rot;
                D3DXMatrixRotationX(
            &x_rot, D3DX_PI * 0.2f);

                
            static float y = 0.0f;
                D3DXMATRIX y_rot;
                D3DXMatrixRotationY(
            &y_rot, y);

                y 
            += time_delta;
                
            if(y >= 6.28f)
                    y 
            = 0.0f;

                g_cube_world_matrix 
            = x_rot * y_rot;

                
            // render now

                g_d3d_device
            ->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x000000001.0f0);

                g_d3d_device
            ->BeginScene();

                
            // draw the background

                D3DXMATRIX world_matrix;
                D3DXMatrixIdentity(
            &world_matrix);
                g_d3d_device
            ->SetTransform(D3DTS_WORLD, &world_matrix);

                g_d3d_device
            ->SetFVF(TEXTURE_VERTEX_FVF);
                g_d3d_device
            ->SetStreamSource(0, g_back_vb, 0sizeof(cTextureVertex));    
                g_d3d_device
            ->SetTexture(0, g_back_texture);
                g_d3d_device
            ->DrawPrimitive(D3DPT_TRIANGLELIST, 02);

                
            // draw the cube

                g_d3d_device
            ->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);    
                g_cube
            ->draw(&g_cube_world_matrix, NULL, g_crate_texture);
                g_d3d_device
            ->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
                
                g_d3d_device
            ->EndScene();

                g_d3d_device
            ->Present(NULL, NULL, NULL, NULL);

                
            return true;
            }

            LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
            {
                
            switch(msg)
                {
                
            case WM_DESTROY:
                    PostQuitMessage(
            0);
                    
            break;

                
            case WM_KEYDOWN:
                    
            if(word_param == VK_ESCAPE)
                        DestroyWindow(hwnd);
                    
            break;
                }

                
            return DefWindowProc(hwnd, msg, word_param, long_param);
            }

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
            {
                
            if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_d3d_device))
                {
                    MessageBox(NULL, 
            "init_d3d() - failed."0, MB_OK);
                    
            return 0;
                }

                
            if(! setup())
                {
                    MessageBox(NULL, 
            "Steup() - failed."0, MB_OK);
                    
            return 0;
                }

                enter_msg_loop(display);

                cleanup();
                g_d3d_device
            ->Release();

                
            return 0;
            }

             


            截圖:

            下載源程序


            posted on 2008-03-18 14:52 lovedday 閱讀(1225) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            天天综合久久久网| 久久精品国产免费观看三人同眠| 国产精品久久久久久一区二区三区 | 99久久精品国产麻豆| 狠狠精品干练久久久无码中文字幕| 欧美激情精品久久久久久| 精品伊人久久大线蕉色首页| 亚洲国产精品久久久久婷婷老年| 欧美日韩精品久久免费| 91精品国产色综久久| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久精品99久久香蕉国产色戒| 国产精品永久久久久久久久久| 伊人久久大香线蕉综合影院首页 | 精品多毛少妇人妻AV免费久久| 精品亚洲综合久久中文字幕| 免费无码国产欧美久久18| 国产精品久久久久久一区二区三区 | 国产精品久久国产精麻豆99网站| 久久国产成人午夜AV影院| 777米奇久久最新地址| 武侠古典久久婷婷狼人伊人| 国产福利电影一区二区三区久久久久成人精品综合 | 日本五月天婷久久网站| 久久久国产精品| 国产99久久久久久免费看| 国产精品99精品久久免费| 久久婷婷五月综合色高清| 无码人妻精品一区二区三区久久 | 香蕉久久夜色精品升级完成| 欧美大战日韩91综合一区婷婷久久青草| 久久96国产精品久久久| 久久99精品久久久久久hb无码 | 久久精品国产亚洲av麻豆小说| 久久久久亚洲av综合波多野结衣| 久久夜色精品国产亚洲av| 久久久国产精品| 一日本道伊人久久综合影| 2021最新久久久视精品爱| 久久人人爽人人爽人人av东京热| 久久天天躁夜夜躁狠狠|