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

            清源游民 gameogre@gmail.com

            OGRE渲染對象
            Ogre中的render target 只是共享AGP內(nèi)存或顯存的某個區(qū)域的抽象,這個區(qū)域中保存著全部或部分場景2D渲染結(jié)果。最普通的render target是主渲染窗口,這是應(yīng)用程序的主窗口。使用這個render target不需要做太多另外的努力,ogre可以幫我們創(chuàng)建它。還可以把場景中的全部或部分(甚至是場景中不可見的部分)渲染到一個紋理,這個紋理可以被場景中的其他多邊形使用。目標硬件緩沖在ogre中抽象為render target,它的物理顯示可以為主渲染窗口,也可以是副窗口,也可以是非可視的:紋理。
            渲染對象也是事件源,假如程序注冊了這事件,ogre會在pre- 和 postrender時通知程序,這給程序改變設(shè)置,做出響應(yīng)的機會。甚至在視口(viewport)級別上pre-,post- 渲染時也有上述通知機制。ogre提供了計算渲染狀態(tài)信息的功能,如多長時間渲染一幀,渲染對象上有多少三角形等。
            渲染窗口
            窗口是由渲染系統(tǒng)的具體實現(xiàn)創(chuàng)建與維護的(D3D9下是個標準的Win32 Window)。Ogre允許對渲染窗口進行很少的配置,限于尺寸,標題欄文字等。假如希望開發(fā)的程序有菜單,工具欄等,把ogre的渲染輸出到
            窗口的客戶區(qū),這是可能的。ogre可以提供你系統(tǒng)相關(guān)的窗口句柄給渲染窗口,也允許你提供句柄給父窗口。第一個創(chuàng)建的ogre渲染窗口稱為主窗口。另外創(chuàng)建的是副窗口。窗口不像主窗口那么重要。假如在程序中有三個窗口,那么為了正確的進行資源清理,必須在銷毀主窗口前把另外兩個副窗口銷毀。
            視口
            渲染窗口包含一個或多個視口。視口是一個長方形區(qū)域,場景管理器把從一個相機中看到的場景可見內(nèi)容
            的透視圖渲染到這個區(qū)域中。視口創(chuàng)建時會引用一個相機,但這不是視口的靜態(tài)屬性,可以隨時改變用于
            渲染視口的相機。每個視口擁有一個z序數(shù),z序高的位于Z序低之上。z序0,總是被一個能覆蓋整個渲染對象的視口所擁有。缺省,ogre會清理視口的顏色與深度緩沖。然而,可以關(guān)閉這些緩沖清理。視口是渲染對象(也就是特定的渲染系統(tǒng),如OpenGL)與相機(也就是特定場景管理器與它的內(nèi)容)之間的唯一交互點。視口不必占用整個渲染對象的表面。3D渲染相機不是真正的相機,所有的幾何LoD計算是以相機的位置算的,因此不能簡單的改變相機的焦點屬性來達到“更近”的渲染效果。
            渲染到紋理
            使用步驟是:創(chuàng)建一個紋理渲染對象,配置它的渲染屬性,加紋理到渲染對象列表,設(shè)置紋理到被使用的材質(zhì)。紋理對象先于其他渲染對象類型更新,這就保證了使用了渲染紋理的對象正確地被渲染。渲染紋理可以像其他普通紋理一樣被處理。對于那些不需要每幀都更新的渲染紋理,可以關(guān)閉自動逐幀更新而采用手動更新。從底層看,紋理對象就是一塊硬件緩沖。為了性能考慮,認為它們是只寫與靜態(tài)的。渲染到紋理會渲染場景中的幾何,需要一些時間執(zhí)行,會降低應(yīng)用程序幀率。但是很多有用的技術(shù)現(xiàn)在離不開渲染到紋理的使用。實時陰影,實時反射等。ogre支持渲染到多個紋理,唯一的限制是它們就具有相同的寸。
            渲染對象類
            RenderTarget是RenderWindow,MultiRenderTarget,與RenderTexture的基類。
            RenderWindow通過子類化來實現(xiàn):D3D9RenderWindow,GLXWindow等。在windows操作系統(tǒng)中,由于可以使用Direct3D 9或是OpenGL,于是可以分別使用D3D9RenderWindow,Win32Window。
            RenderSystem::createRenderWindow()來創(chuàng)建窗口。
            virtual RenderWindow* Ogre::RenderSystem::createRenderWindow? (? const String &? name,?
            ? unsigned int? width,?
            ? unsigned int? height,?
            ? bool? fullScreen,?
            ? const NameValuePairList *? miscParams = 0
            ?)?
            通過最后一個參數(shù),可以設(shè)置窗口的一些屬性。
            將渲染窗口嵌入外部窗口的代碼
            NameValuePairList params; // is just a typedef std::map<std::string, std::string>
            // set external window handle -- assume that you have
            // already created a window to embed the Ogre render window, and its handle is
            // stored in an integer variable called "mParent"
            params["externalWindowHandle"] = StringConverter::toString(mParent);
            // window can be resized later to fit within parent client area if needed
            RenderWindow* window = createRenderWindow("MyWindow", 800, 600, false, &params);
            渲染到紋理Demo
            demo在原點創(chuàng)建了一個傾斜的平面,設(shè)置相機,把場景(場景由一個魔鬼腦袋與幾個環(huán)面紐結(jié)組成)
            相對于平面的倒影渲染到紋理中。渲染紋理與平面已經(jīng)應(yīng)用的靜態(tài)紋理混合,這樣就實現(xiàn)了反射效果。
            創(chuàng)建渲染紋理:
            TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex",
            ?????????????????????????????? ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D,
            ????????????????????????????? 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );
            創(chuàng)建相機與視口用于渲染到紋理:
            ?????????? ? mReflectCam = mSceneMgr->createCamera("ReflectCam");
            ??????????? mReflectCam->setNearClipDistance(mCamera->getNearClipDistance());
            ??????????? mReflectCam->setFarClipDistance(mCamera->getFarClipDistance());
            ??????????? mReflectCam->setAspectRatio(
            ??????????????? (Real)mWindow->getViewport(0)->getActualWidth() /
            ??????????????? (Real)mWindow->getViewport(0)->getActualHeight());
            ??????????? Viewport *v = rttTex->addViewport( mReflectCam );
            ??????????? v->setClearEveryFrame( true );
            ??????????? v->setBackgroundColour( ColourValue::Black );
            創(chuàng)建使用渲染紋理的材質(zhì)
            MaterialPtr mat = MaterialManager::getSingleton().create("RttMat",
            ??????????????? ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
            ??????????? TextureUnitState* t = mat->getTechnique(0)->getPass(0)->createTextureUnitState("RustedMetal.jpg");
            ??????????? t = mat->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");
            ??????????? // Blend with base texture
            ??????????? t->setColourOperationEx(LBX_BLEND_MANUAL, LBS_TEXTURE, LBS_CURRENT, ColourValue::White,
            ??????????????? ColourValue::White, 0.25);
            ????????? ??t->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
            ????????? ??t->setProjectiveTexturing(true, mReflectCam);
            ??????????? rttTex->addListener(this);
            材質(zhì)名為RttMat,包含一個技術(shù),后者有一個通道。通道有兩個紋理單元,一個為靜態(tài)紋理(RustedMetal.jpg)
            ,另一個紋理單元為渲染紋理,兩個紋理按比例混合。設(shè)置了合適的紋理尋址模式,開啟了透視紋理支持。
            并為渲染紋理(它是渲染對象)注冊了偵聽器。
            相機倒置使用材質(zhì):
            ??????????? // set up linked reflection
            ??????????? mReflectCam->enableReflection(mPlane);
            ??????????? // Also clip
            ??????????? mReflectCam->enableCustomNearClipPlane(mPlane);
            ??????? }
            ?????????? // Give the plane a texture
            ???????? ? mPlaneEnt->setMaterialName("RttMat");
            相機這樣設(shè)置后,渲染出的將是場景的倒影,這是以指定平面為參照的。定制最近裁剪平面的作用是:
            那些低于反射面的對象將不會再被渲染。渲染紋理時,并不想把平面也渲染進去,可以在上邊已經(jīng)注冊
            偵聽器做點手腳
            void preRenderTargetUpdate(const RenderTargetEvent& evt)
            ??? {
            ??????? // Hide plane
            ??????? mPlaneEnt->setVisible(false);

            ??? }
            ??? void postRenderTargetUpdate(const RenderTargetEvent& evt)
            ??? {
            ??????? // Show plane
            ??????? mPlaneEnt->setVisible(true);
            ??? }
            最后要提的是,在每一幀,都要使兩個相機的位置,朝向保持一致:
            frameStarted:
            ?mReflectCam->setOrientation(mCamera->getOrientation());
            ? mReflectCam->setPosition(mCamera->getPosition());

            posted on 2007-03-15 17:25 清源游民 閱讀(2363) 評論(0)  編輯 收藏 引用 所屬分類: OGRE
            <2007年3月>
            25262728123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            日韩精品久久久久久久电影蜜臀| 亚洲国产成人久久综合野外| 久久久无码精品亚洲日韩京东传媒| 无码任你躁久久久久久老妇App| 久久这里有精品| 国产精品视频久久久| 国内精品久久久久久久久电影网 | 国产69精品久久久久9999APGF| 久久精品国产99国产精品导航| 日韩精品国产自在久久现线拍| 午夜精品久久久久| 久久香蕉综合色一综合色88| 国产成人综合久久精品红| 国产一区二区三区久久精品| 理论片午午伦夜理片久久| 国产精品久久国产精品99盘| 亚洲国产小视频精品久久久三级| 色综合久久综合网观看| 精品熟女少妇AV免费久久| 精品久久国产一区二区三区香蕉 | 欧美黑人激情性久久| 欧美日韩中文字幕久久久不卡| 久久久免费精品re6| 久久人人爽人人人人片av| 91久久精品无码一区二区毛片| 婷婷久久香蕉五月综合加勒比| 三级片免费观看久久| 国产精品伊人久久伊人电影| 久久99国产精品99久久| 99久久综合狠狠综合久久止| 久久精品国产亚洲AV香蕉| 久久久久久无码国产精品中文字幕| 久久国产精品久久国产精品| 国产精品一区二区久久| 国内精品九九久久久精品| 久久99热只有频精品8| 久久国产色AV免费看| 国内精品人妻无码久久久影院| 三上悠亚久久精品| 国产欧美久久一区二区| 93精91精品国产综合久久香蕉|