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

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国产日韩欧美久久| 一本色道久久88加勒比—综合| 久久国产精品国语对白| 一本大道加勒比久久综合| 久久久精品久久久久久| 亚洲国产精品18久久久久久| 国内精品久久久久久野外| 国产精品一区二区久久精品涩爱| 久久精品人人做人人爽97| 久久精品国产精品亚洲人人| 精品久久久久久成人AV| 久久影视国产亚洲| 青青青国产成人久久111网站| 久久久久亚洲AV无码专区首JN | 久久精品卫校国产小美女| 国产成人精品久久二区二区 | 中文字幕亚洲综合久久菠萝蜜| 97热久久免费频精品99| 久久久久高潮综合影院| 久久99精品久久久久久齐齐| 久久夜色精品国产欧美乱| 一级a性色生活片久久无少妇一级婬片免费放| 伊人久久久AV老熟妇色| 性高湖久久久久久久久AAAAA | 无码人妻少妇久久中文字幕| 久久久久久久99精品免费观看| 亚洲va久久久噜噜噜久久天堂| 久久久免费观成人影院 | 狠狠色丁香久久婷婷综合蜜芽五月| 国产精品无码久久四虎| 热久久这里只有精品| 国产成人久久激情91| 97热久久免费频精品99| 久久99国产综合精品| 精品久久久久香蕉网| 久久精品国产91久久麻豆自制 | 一级女性全黄久久生活片免费 | 久久99中文字幕久久| 91麻精品国产91久久久久| 国产精品九九久久免费视频| 精品久久久无码中文字幕天天|