• <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轉(zhuǎn)到D3D, 雖然工程外在的框架都封裝得不錯, 但想完全地從OpenGL轉(zhuǎn)換到D3D, 看起來還是有難度的, 花了我兩個星期的時間, 我終于轉(zhuǎn)換過來了。
            D3D與OpenGL的幾點(diǎn)比較明顯不同的地方:
            (一)、正交投影時:OpenGL以屏幕左上角為(0,0), 而D3D卻以屏幕中心為(0,0)
            (二)、OpenGL使用右手坐標(biāo)系, 而D3D使用左手坐標(biāo)系
            (三)、OpenGL使用旋轉(zhuǎn)操作等轉(zhuǎn)入的角度參數(shù)是 角度, 而D3D是 弧度,所以注意要PI * Angle / 180

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


            1. 坐標(biāo)變換
             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. 緩沖區(qū)操作
              
             (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)折射圖--------------------------------------------------------------------------
             
             //下面的語句調(diào)用了 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. 燈光與材質(zhì)
             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);  //在設(shè)置紋理前設(shè)定
             //設(shè)置當(dāng)前使用的紋理
             

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

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導(dǎo)航

            統(tǒng)計

            公告


            Name: Galen
            QQ: 88104725

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            相冊

            My Friend

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            97精品国产97久久久久久免费| 午夜精品久久久久久毛片| 亚洲国产成人久久综合一| a高清免费毛片久久| 四虎亚洲国产成人久久精品| 久久久亚洲欧洲日产国码是AV| 国产精品久久久久久久久| 日韩欧美亚洲综合久久影院Ds | 国产精品狼人久久久久影院| 狠狠色丁香久久婷婷综合图片| 国产成年无码久久久久毛片| 亚洲欧美另类日本久久国产真实乱对白| 久久久久se色偷偷亚洲精品av | 亚洲精品乱码久久久久久蜜桃不卡| 久久香蕉一级毛片| 久久久久久精品免费免费自慰| 97久久精品人人做人人爽| 久久久精品人妻一区二区三区四 | 亚洲午夜久久久久妓女影院| 国产精品99久久久久久www| 久久丫精品国产亚洲av不卡 | 漂亮人妻被中出中文字幕久久| 99久久国产综合精品五月天喷水 | 日韩精品久久无码人妻中文字幕| 日本加勒比久久精品| 色成年激情久久综合| 国产精品久久永久免费| 成人午夜精品无码区久久| 伊人伊成久久人综合网777| 久久久久久久国产免费看| 国产精品青草久久久久福利99| 久久99国产精一区二区三区| 国产精品久久波多野结衣| 国产成人久久精品激情| 久久久一本精品99久久精品88| 欧美精品久久久久久久自慰| 久久久黄色大片| 久久亚洲精品成人无码网站| 三级片免费观看久久| 久久青青草视频| 久久久久亚洲Av无码专|