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

            天行健 君子當自強而不息

            DXUT源碼分析 ---- 類CDXUTMesh(5)

            最后一類是渲染函數,類CDXUTMesh重載了兩個渲染函數Render(),其作用都是用來渲染當前的網格模型。所不同的是,第一個函數用在固定函數流水線中,第二個函數用在可編程流水線技術中,這兩個函數的最后兩個參數用于指定是否渲染網格模型中的不透明和半透明部分。

            首先來看第一個Render()函數:

            HRESULT CDXUTMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice, bool bDrawOpaqueSubsets, bool bDrawAlphaSubsets )
            {
                
            if( NULL == m_pMesh )
                    
            return E_FAIL;

                
            // Frist, draw the subsets without alpha
                if( bDrawOpaqueSubsets )
                {
                    
            for( DWORD i=0; i<m_dwNumMaterials; i++ )
                    {
                        
            if( m_bUseMaterials )
                        {
                            
            if( m_pMaterials[i].Diffuse.a < 1.0f )
                                
            continue;

                            pd3dDevice
            ->SetMaterial( &m_pMaterials[i] );
                            pd3dDevice
            ->SetTexture( 0, m_pTextures[i] );
                        }

                        m_pMesh
            ->DrawSubset( i );
                    }
                }

                
            // Then, draw the subsets with alpha
                if( bDrawAlphaSubsets && m_bUseMaterials )
                {
                    
            for( DWORD i=0; i<m_dwNumMaterials; i++ )
                    {
                        
            if( m_pMaterials[i].Diffuse.a == 1.0f )
                            
            continue;

                        
            // Set the material and texture
                        pd3dDevice->SetMaterial( &m_pMaterials[i] );
                        pd3dDevice
            ->SetTexture( 0, m_pTextures[i] );
                        m_pMesh
            ->DrawSubset( i );
                    }
                }

                
            return S_OK;
            }

             

            代碼簡潔明了,首先繪制不透明的網格(alpha == 1.0f),接著繪制半透明的網格(alpha != 1.0f)。

             

            接著來看第二個Render()函數:

            HRESULT CDXUTMesh::Render( ID3DXEffect *pEffect,
                                       D3DXHANDLE hTexture,  D3DXHANDLE hDiffuse,  D3DXHANDLE hAmbient,
                                       D3DXHANDLE hSpecular, D3DXHANDLE hEmissive, D3DXHANDLE hPower,
                                       
            bool bDrawOpaqueSubsets, bool bDrawAlphaSubsets )
            {
                
            if( NULL == m_pMesh )
                    
            return E_FAIL;

                UINT cPasses;

                
            // Frist, draw the subsets without alpha
                if( bDrawOpaqueSubsets )
                {
                    pEffect
            ->Begin( &cPasses, 0 );

                    
            for( UINT p = 0; p < cPasses; ++p )
                    {
                        pEffect
            ->BeginPass( p );

                        
            for( DWORD i=0; i<m_dwNumMaterials; i++ )
                        {
                            
            if( m_bUseMaterials )
                            {
                                
            if( m_pMaterials[i].Diffuse.a < 1.0f )
                                    
            continue;

                                
            if( hTexture )
                                    pEffect
            ->SetTexture( hTexture, m_pTextures[i] );

                                
            // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical.
                                
            // No conversion is needed.

                                
            if( hDiffuse )
                                    pEffect
            ->SetVector( hDiffuse, (D3DXVECTOR4*)&m_pMaterials[i].Diffuse );

                                
            if( hAmbient )
                                    pEffect
            ->SetVector( hAmbient, (D3DXVECTOR4*)&m_pMaterials[i].Ambient );

                                
            if( hSpecular )
                                    pEffect
            ->SetVector( hSpecular, (D3DXVECTOR4*)&m_pMaterials[i].Specular );

                                
            if( hEmissive )
                                    pEffect
            ->SetVector( hEmissive, (D3DXVECTOR4*)&m_pMaterials[i].Emissive );

                                
            if( hPower )
                                    pEffect
            ->SetFloat( hPower, m_pMaterials[i].Power );

                                pEffect
            ->CommitChanges();
                            }

                            m_pMesh
            ->DrawSubset( i );
                        }

                        pEffect
            ->EndPass();
                    }

                    pEffect
            ->End();
                }

                
            // Then, draw the subsets with alpha
                if( bDrawAlphaSubsets )
                {
                    pEffect
            ->Begin( &cPasses, 0 );

                    
            for( UINT p = 0; p < cPasses; ++p )
                    {
                        pEffect
            ->BeginPass( p );

                        
            for( DWORD i=0; i<m_dwNumMaterials; i++ )
                        {
                            
            if( m_bUseMaterials )
                            {
                                
            if( m_pMaterials[i].Diffuse.a == 1.0f )
                                    
            continue;

                                
            if( hTexture )
                                    pEffect
            ->SetTexture( hTexture, m_pTextures[i] );

                                
            // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical.
                                
            // No conversion is needed.

                                
            if( hDiffuse )
                                    pEffect
            ->SetVector( hDiffuse, (D3DXVECTOR4*)&m_pMaterials[i].Diffuse );

                                
            if( hAmbient )
                                    pEffect
            ->SetVector( hAmbient, (D3DXVECTOR4*)&m_pMaterials[i].Ambient );

                                
            if( hSpecular )
                                    pEffect
            ->SetVector( hSpecular, (D3DXVECTOR4*)&m_pMaterials[i].Specular );

                                
            if( hEmissive )
                                    pEffect
            ->SetVector( hEmissive, (D3DXVECTOR4*)&m_pMaterials[i].Emissive );

                                
            if( hPower )
                                    pEffect
            ->SetFloat( hPower, m_pMaterials[i].Power );

                                pEffect
            ->CommitChanges();
                            }

                            m_pMesh
            ->DrawSubset( i );
                        }

                        pEffect
            ->EndPass();
                    }

                    pEffect
            ->End();
                }

                
            return S_OK;
            }

             

            代碼也是相當簡潔明了,首先繪制不透明網格,接著繪制半透明網格。在繪制時遍歷所有的通道,并設置紋理,材質的漫反射光、環境光、鏡面反射光、自發光、鏡面反射光指數。

            posted on 2008-05-31 11:36 lovedday 閱讀(511) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            奇米影视7777久久精品人人爽| 亚洲AV无码久久精品色欲| 狠狠色丁香久久婷婷综| 国产精品伦理久久久久久| 久久er热视频在这里精品| 久久青青草原亚洲av无码| 国色天香久久久久久久小说| 青青青青久久精品国产h| 日韩亚洲国产综合久久久| 日产精品久久久久久久性色 | 久久精品人人做人人妻人人玩| 亚洲国产精品久久久久婷婷老年| 亚洲天堂久久久| 国产午夜福利精品久久2021| 久久综合五月丁香久久激情| 久久国产亚洲高清观看| 久久乐国产综合亚洲精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久久高清免费视频| 韩国免费A级毛片久久| 亚洲v国产v天堂a无码久久| 久久99国产综合精品免费| 中文字幕精品无码久久久久久3D日动漫 | 人人狠狠综合久久88成人| 久久久久亚洲av毛片大| 久久99久久99小草精品免视看| 人妻少妇精品久久| 狠狠精品久久久无码中文字幕| 欧美熟妇另类久久久久久不卡| 国产精品99久久久久久宅男小说| 久久黄色视频| 亚洲第一永久AV网站久久精品男人的天堂AV | 青青热久久国产久精品| 国产高清美女一级a毛片久久w | 99久久国产热无码精品免费久久久久 | 久久九九兔免费精品6| 久久嫩草影院免费看夜色| 久久中文字幕视频、最近更新| 777久久精品一区二区三区无码| 97热久久免费频精品99| 91精品国产综合久久久久久|