• <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 閱讀(1683) 評論(0)  編輯 收藏 引用 所屬分類: 3D渲染技術(shù)

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

            導(dǎo)航

            統(tǒng)計

            公告


            Name: Galen
            QQ: 88104725

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            相冊

            My Friend

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲中文久久精品无码| 久久精品日日躁夜夜躁欧美| 久久精品www人人爽人人| 东京热TOKYO综合久久精品 | 欧美激情精品久久久久久久九九九| 国产精品亚洲美女久久久| 亚洲精品美女久久久久99小说| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久亚洲高清综合| 久久久久亚洲Av无码专| 久久久久亚洲精品中文字幕| 久久99亚洲网美利坚合众国| 久久精品无码一区二区app| 亚洲乱码中文字幕久久孕妇黑人| 精品999久久久久久中文字幕| 欧美大战日韩91综合一区婷婷久久青草 | 亚洲成人精品久久| 亚洲精品乱码久久久久久久久久久久 | www亚洲欲色成人久久精品| 狠狠色丁香婷婷久久综合| 欧美日韩中文字幕久久伊人| 久久99久国产麻精品66| 久久精品一区二区三区中文字幕| 无码AV波多野结衣久久| 精品久久久久久无码不卡| 人妻精品久久久久中文字幕| 久久最近最新中文字幕大全| A狠狠久久蜜臀婷色中文网| 2021国产精品午夜久久| 久久久免费观成人影院| 久久精品国产72国产精福利| 99久久精品国产毛片| 亚洲国产精品一区二区久久| 精品久久久久久成人AV| 久久综合给合久久国产免费| 亚洲精品乱码久久久久久中文字幕| 一级女性全黄久久生活片免费 | 蜜臀久久99精品久久久久久小说| 久久天天躁狠狠躁夜夜2020一 | 精品久久久久久中文字幕大豆网| 日产久久强奸免费的看|