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

            D3D與OpenGL常用API對譯

            作為一個3D程序員, 我用了OpenGL兩年多, 最近在搞一個項目, 從OpenGL轉到D3D, 雖然工程外在的框架都封裝得不錯, 但想完全地從OpenGL轉換到D3D, 看起來還是有難度的, 花了我兩個星期的時間, 我終于轉換過來了。
            D3D與OpenGL的幾點比較明顯不同的地方:
            (一)、正交投影時:OpenGL以屏幕左上角為(0,0), 而D3D卻以屏幕中心為(0,0)
            (二)、OpenGL使用右手坐標系, 而D3D使用左手坐標系
            (三)、OpenGL使用旋轉操作等轉入的角度參數是 角度, 而D3D是 弧度,所以注意要PI * Angle / 180

            下面我把具體地API對照關系列出來(不是很全,以后添加中.......)


            1. 坐標變換
             pos = D3DXVECTOR3(0,2,-1.5);
             at  = D3DXVECTOR3(0,0,0);
             up  = D3DXVECTOR3(0,1,0);
             D3DXMatrixLookAtLH(&view,&pos,&at,&up);
             pd3dDevice->SetTransform(D3DTS_VIEW,&view);

            2. 繪制
             pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

                DrawPrimitive()
             DrawIndexedPrimitive()
             
             DrawPrimitiveUP()
             DrawIndexedPrimitiveUP()
            3. 顏色


            4. 片段測試

             (1) 深度測試
             g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE);           //glEnable(GL_DEPTH_TEST);  
             g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);    //glDepthFunc(GL_LEQUAL);
             //--------------------------------------------------------------------------------------------------------
             g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);      //glEnable(GL_CULL_FACE);

             
             (2) Alpha測試
             //-------------------------------------------------------------------------------------------------------- 
             g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);                //glEnable(GL_ALPHA_TEST);
             g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);    //glAlphaFunc(GL_GREATER, 0.1f);
             g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0.1 * 255); //取值范圍 0 ~ 255
             
             (3) 剪裁測試 (平面剪切)
             //--------------------------------------------------------------------------------------------------------
             // Enable clip plane for reflection map
             CMatrix44f pWorldViewProjIT=m_pWorldViewProj;
             //pWorldViewProjIT.Transpose();
             pWorldViewProjIT.Invert();   

             // Transform plane to clip-space
             float pClipSpacePlane[4];
             float pClipPlane[]= { 0, 0, 1, 0};   

             // Check if camera is below water surface, if so invert clip plane
             CVector3f pEye=(CVector3f)m_pCamera.GetPosition();
             if(-pEye.m_fZ<0.0)
             {
              pClipPlane[2]=-pClipPlane[2];
             }

             MatrixTransformPlane(pClipSpacePlane, pClipPlane, pWorldViewProjIT);

             // enable clip plane now
             g_pDevice->SetClipPlane(0, pClipSpacePlane);  
             g_pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1);
             
             
             
             (4) 模板測試
             //--------------------------------------------------------------------------------------------------------
             g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
                g_pDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_ALWAYS);
                g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //取值范圍 0 ~ 255
               
                Device->SetRenderState(D3DRS_STENCILPASS,  D3DSTENCILOP_KEEP);
             
            5. 紋理操作
             
             g_pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
               g_pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
               g_pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
               
             g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
              g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

            6. 緩沖區操作
              
             (1) 顏色緩沖
             //--------------------------------------------------------------------------------------------------------
             g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
             g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0x000000F);
             
             (2) 深度緩沖
             //--------------------------------------------------------------------------------------------------------
             g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE);           //glEnable(GL_DEPTH_TEST);
             g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);        //glDepthMask(GL_TRUE);

             (3) 模板緩沖
             //--------------------------------------------------------------------------------------------------------
             
             (4) 渲染到紋理
             //--------------------------------------------------------------------------------------------------------
             // Render targets
             IDirect3DSurface9 *m_plD3DBackbufferSurf,
              *m_plD3DDepthStencilSurfAA,
              *m_plD3DDepthStencilSurf;

             CRenderTarget *m_pRTRefraction, *m_pRTReflection; //(自定義紋理類)

             //-----------------------------------------------------------------------------------

             // Get backbuffer
             g_pDevice->GetRenderTarget(0, &m_plD3DBackbufferSurf);
             
             // Get depthstencil
             g_pDevice->GetDepthStencilSurface(&m_plD3DDepthStencilSurfAA);
             

             // Restore previous states
             g_pDevice->SetRenderTarget(0, m_plD3DBackbufferSurf);
             g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurfAA);
             
             // (1)折射圖--------------------------------------------------------------------------
             
             //下面的語句調用了 g_pDevice->CreateRenderTarget(iWidth, iHeight, (D3DFORMAT) iFormat, (D3DMULTISAMPLE_TYPE)iAASamples, 0, 0, &m_plD3Surf, 0));
             if(FAILED(m_pRTRefraction->Create(m_fWidth>>1, m_fHeight>>1, D3DFMT_A8R8G8B8)))
             {
              return APP_ERR_INITFAIL;
             }
             
             // Create depthstencil withouth multisampling
             g_pDevice->CreateDepthStencilSurface(m_fWidth, m_fHeight, D3DFMT_D24X8, (D3DMULTISAMPLE_TYPE)0, 0, 0, &m_plD3DDepthStencilSurf, 0);
             
             
             g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
             
             g_pDevice->StretchRect(m_plD3DBackbufferSurf, 0, m_pRTRefraction->GetSurface(), 0, D3DTEXF_NONE);
             
             // (2)反射圖-----------------------------------------------------------------------------------
             m_pRTReflection=new CRenderTarget;
             if(FAILED(m_pRTReflection->Create(m_fWidth>>2, m_fHeight>>2, D3DFMT_A8R8G8B8)))
             {
              return APP_ERR_INITFAIL;
             }
             
             g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
             
             
             //-----------------------------------------------------------------------------------
             g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
             g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurf);
             g_pDevice->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 128), 1.0f, 0);  
             SetViewport(m_pRTReflection->GetWidth(), m_pRTReflection->GetHeight());
             //-----------------------------------------------------------------------------------
             
             D3DXSaveTextureToFile("imageTex.jpg",D3DXIFF_JPG,(IDirect3DTexture9*)m_pWavesBump->GetTexture(),NULL);
             
            7. 混合操作
             g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);    //glDisable(GL_BLEND);
             g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);  //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
             g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
             

            8. 燈光與材質
             g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //glDisable(GL_LIGHTING);
             
             D3DMATERIAL9 mtrl;
             mtrl.Ambient  = a;
             mtrl.Diffuse  = d;
             mtrl.Specular = s;
             mtrl.Emissive = e;
             mtrl.Power    = p;
             Device->SetMaterial(&mtrl);  //在設置紋理前設定
             //設置當前使用的紋理
             

            posted on 2009-11-14 04:49 RedLight 閱讀(1674) 評論(0)  編輯 收藏 引用 所屬分類: 3D渲染技術

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導航

            統計

            公告


            Name: Galen
            QQ: 88104725

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            相冊

            My Friend

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产亚洲精久久久久久无码| 狠狠干狠狠久久| 麻豆久久久9性大片| 色综合久久夜色精品国产| 久久久久波多野结衣高潮| 人妻无码αv中文字幕久久 | 久久精品九九亚洲精品天堂| 99久久精品国产一区二区蜜芽| 久久久久亚洲精品中文字幕| 亚洲AV日韩精品久久久久久| 国产ww久久久久久久久久| 久久精品国产亚洲αv忘忧草 | 欧美大战日韩91综合一区婷婷久久青草| 久久五月精品中文字幕| 狠狠色丁香久久综合婷婷| 国产精品久久新婚兰兰| 久久中文字幕一区二区| 一本色道久久99一综合| 色婷婷噜噜久久国产精品12p | 久久精品国产网红主播| 久久精品国产欧美日韩| 国产精品久久午夜夜伦鲁鲁| 尹人香蕉久久99天天拍| 久久久久久综合一区中文字幕| 人妻精品久久无码专区精东影业| 四虎久久影院| 四虎影视久久久免费观看| 99久久免费只有精品国产| 国产一区二区精品久久| www性久久久com| 久久精品国产精品青草| 91精品国产色综合久久| 国产精品久久久亚洲| 青青草国产精品久久久久| 狠狠色婷婷综合天天久久丁香| 99久久99久久精品免费看蜜桃| 久久婷婷五月综合97色| 97久久久精品综合88久久| 国产精品久久久久影视不卡| 久久久久久综合一区中文字幕| 国产综合久久久久久鬼色|