• <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游戲編程相關鏈接

            搜索

            最新評論

            国产精品日韩欧美久久综合| 欧美久久亚洲精品| 久久精品国产清高在天天线| 1000部精品久久久久久久久| 久久久久久毛片免费看| 伊人 久久 精品| 国产A级毛片久久久精品毛片| 久久久这里只有精品加勒比| 精品综合久久久久久888蜜芽| 性高湖久久久久久久久AAAAA| 精品久久久久久亚洲精品| 久久综合一区二区无码| 亚洲国产美女精品久久久久∴ | 久久亚洲精品无码aⅴ大香| 国产亚洲欧美成人久久片| 亚洲婷婷国产精品电影人久久| 久久综合中文字幕| 久久国产免费观看精品3| 亚洲日韩欧美一区久久久久我| 久久国产乱子精品免费女| 久久精品国产亚洲AV无码偷窥| 超级97碰碰碰碰久久久久最新| 国产精品久久久久乳精品爆| 久久久噜噜噜久久中文福利| 成人综合久久精品色婷婷| 欧美午夜A∨大片久久| 久久精品国产99久久丝袜| 99精品久久久久久久婷婷| 久久国产精品无码一区二区三区| 亚洲欧美日韩中文久久 | 久久精品国产亚洲精品| 精品久久久久久中文字幕| 久久ww精品w免费人成| 久久久久AV综合网成人| 久久天天躁狠狠躁夜夜躁2O2O| 欧美亚洲国产精品久久| 精品国产青草久久久久福利| 一级做a爰片久久毛片看看| 久久久www免费人成精品| 一本色综合网久久| 久久精品国产亚洲av高清漫画|