在Ogre中直接使用D3D

使用Ogre时可以通过RenderSystem_Direct3D9直接访问D3D

直接使用D3D需要安装D3D SDK,典型的为2010 June SDK

需指定包含路径:

  C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include

$(Ogre181)\include\OGRE

库路径:

  $(Ogre181)\lib\Debug\opt\RenderSystem_Direct3D9_d.lib

  C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86\d3d9.lib

  C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86\d3dx9.lib

  C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86\DxErr.lib

  C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86\dxguid.lib

这些和RenderSystem_Direct3D9项目设置一样

实际代码需包含头文件:

#include <Ogre/RenderSystems/Direct3D9/OgreD3D9RenderWindow.h>

#include <Ogre/RenderSystems/Direct3D9/OgreD3D9RenderSystem.h>

获取D3D 设备:

    IDirect3DDevice9* pDevice = Ogre::D3D9RenderSystem::getActiveD3D9Device();

    mWindow->update(false); //这里不翻转,由获取到的Deviece9处理

    pDevice->Present(NULL, NULL, NULL, NULL); //测试获取到的Device9是否工作

可以看到获取到的IDirect3DDevice9可以正常使用

再演示一下如何解决上一篇文章中提到的实际问题:获取Ogre或D3D的渲染结果的效率问题

该问题需要获取IDirect3DSurface9和创建离屏表面等

通过查看RenderSystem_Direct3D9源码,可以使用以下办法:

    IDirect3DDevice9* pDevice = Ogre::D3D9RenderSystem::getActiveD3D9Device();
    IDirect3DSurface9 *surface = NULL;
    D3DLOCKED_RECT lrect; // Filled in by D3D
    IDirect3DSurface9 *backSurface;

    pDevice->CreateOffscreenPlainSurface(renderTarget->getWidth(), renderTarget->getHeight(), D3DFMT_X8R8G8B8,    D3DPOOL_SYSTEMMEM, &surface, 0);

    //renderTarget可以为RenderWindow或者RenderTexture
    renderTarget->getCustomAttribute("DDBACKBUFFER", &backSurface);

    pDevice->GetRenderTargetData(backSurface, surface);

    surface->LockRect(&lrect, NULL,  D3DLOCK_READONLY);
    char* data = (char *)lrect.pBits; //需要获取的数据指针
    surface->UnlockRect();

代码段中未定义的变量renderTarget为RenderTarget*

因为D3D9RenerWindow和D3D9RenderTexture的getCustomAttribute方式都提供了通过"DDBACKBUFFER"获取后表面

所以以上代码既可以用于渲染窗口也可以用于渲染纹理

时间: 2024-10-11 11:05:22

在Ogre中直接使用D3D的相关文章

Axiom3D:Ogre中Mesh网格分解成点线面。

这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分析Mesh里的VertexData与IndexData,分析顶点时查找源码发现Ogre里本身有相关的类,这里Axiom3D与Ogre的源码有些区别,不过大致意思相同. 主要用到的类:EdgeListBuilder,CommonVertexList,EdgeData. 流程很简单,EdgeListBu

【转】将3DMAX中的动画通过OGREMAX导入OGRE中,并生成相应的骨骼动画

原创内容转载请注明:http://weibo.com/gdexqin 程序代码的的基础在http://blog.sina.com.cn/s/blog_7c03dc6f01012um2.html中 先看导入后的效果. 动画模型是用别人传到网上的(好像这个人物叫真名法典的样子,不太认识,但是感谢上传者),之前我们已经完成了通过OGREMAX导入静态的场景的效果,导入骨骼动画我们需要对OGREMAX的导出选项进行一些修改. 下面先了解一下OGREMAX的一些基本选项(转自网络): ----------

Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算

Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = interp_h - actual_h 每个四叉树的每个lod中都会有一个最大的高度差,用来保存这个lod在这个四叉树块中相对于原始数据的最大差距,显而易见,这个高度差可以认为表示了该lod的失真程度,失真越大,就应该在越远的地方使用该lod.因此,这个值可以用来帮助确定当前状态使用哪一个lod.

Ogre中OIS的输入的使用

OIS的使用有两种模式:缓冲模式和非缓冲模式.非缓冲方式能处理鼠标或键盘长按的事件,实时性强缓冲方式则不能长按事件,用于非实时响应. 非缓冲输入:1.创建方式:其中 false 参数代表使用非缓冲模式 OIS::Keyboard* mKeyboard: OIS::Mouse* mMouse : mKeyboard = static_cast<OIS::Keyboard*> (mInputManager->createInputObject(OIS::OISKeyboard, false)

转: 在Ogre中使用Havok物理引擎(源码)

作者:CYM 众所周知Ogre则是评价很高的一款图形渲染引擎,Havok则是世界一流的物理引擎,今天花了点时间将两者结合在了一块,做了个Demo 由于国内对Havok的研究似乎很少,网上也找不到多少资料,所以先分享一下源码.. 演示了很多棍子掉落在地上的场景 --------------------------------------------华丽分割线--------------------------------------------------------------- 灰色部分为暂时

Depth Bias 以及 Ogre材质中的depth_bias

深度偏移用来解决共面情况下出现闪烁的问题 通过给多边形增加一个z方向深度偏移(depth bias,z_bias),使3D空间的共面多边形看起来好像并不共面,以便它们能够被正确渲染.这种技术是很有用的,例如,我们要渲染投射在墙上的阴影,这时候墙和阴影共面,如果没有深度偏移,先渲染墙,再渲染阴影,由于depth test,阴影可能不能正确显示.我们给墙设置一个深度偏移,使它增大,例如z增加0.01,先渲染墙,再渲染阴影,则墙和阴影可以正确的显示. Depth-bias操作在clipping之后进行

获取Ogre或D3D的渲染结果的效率问题

在Ogre中获取渲染结果可以使用RenderTarget的copyContentsToMemory方法, 例: char* src = new char[mWindow->getWidth() * mWindow->getHeight() * 4]; Ogre::PixelBox* pixbox = new Ogre::PixelBox(mWindow->getWidth(), mWindow->getHeight(), 1, Ogre::PF_X8R8G8B8, src );mW

Ogre GpuProgram分析

和前面讲解的Compositor一样,GpuProgram也对应一种资源文件,意思我们可以直接写一个文件来完成,不需要了解相关的类. 但是就和winform一样,直接拖控件能完成大部分工作,假如如果需要我们自己手工来定制相应控件,相应的类与属性还是需要了解的,不然我们看下Ogre里讲解延迟渲染的例子(DeferredShading),就会发现看不懂了. GpuProgram比较重要的是GpuProgramParameters对象,这个对象封装了着色器的参数设置. 从着色器语言来说,参数主要区分高

转:Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最简单的一种方式:当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了. API手册中这样介绍到:Ogre::Root 类代表了客户应用程序的入口点.在这里,应用程序可以获得系统的重要的访问权,也就是获取渲染系统 ,管理配置