Directx11与PhysX的结合

    最近因为一个比赛项目用了段时间的PhysX,来总结下如何在Directx11中使用PhysX吧。

    首先是PhysX的部署。这个在PhysX SDK的第一页的Installation也有讲了。

    1在PhysXSDK里面找到PhysXCore.dll, PhysXCooking.dll, PhysXDevice.dll and the cudartXX_XX_X.dll (e.g. cudart32_30_9.dll or cudart_64_30.9.dll),PhysXLoader.dll PhysXLoader.lib几个库,放到你自己工程的working directory下。


    2在Linker->Input->Additional Dependencies里面输入PhysXLoader.lib表示要使用这个静态库。


    3:在c/c++->Genenal->Additional Include Directories里面引用'SDKs\Foundation\include', 'SDKs\Physics\include', and 'SDKs\PhysXLoader\include'几个头文件。 


    然后就可以开始编写代码了。如何Directx中使用PhysXOpengl,OGRE等也一样),基本上都遵循一个大原则,就是每帧中PhysX负责物理逻辑运算,然后把所有物体的位置,旋转角度等告知DirectxDirectx就负责渲染就好了。我们先初始化PhysX(其实就是初始化最关键的两个变量NxPhysicsSDK m_pPhysicsSDK和NxScene* m_pScene ;)

bool PhysX::InitNx()

{

// Initialize PhysicsSDK

NxPhysicsSDKDesc desc;

NxSDKCreateError errorCode = NXCE_NO_ERROR;

m_pPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, NULL, NULL, desc, &errorCode);

if(m_pPhysicsSDK == NULL) 

{

printf("Unable to initialize the PhysX SDK, exiting the sample.\n");

return false;

}

m_pPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.03f);

// Create a scene

NxSceneDesc sceneDesc;

sceneDesc.gravity = NxVec3(0.0f, -9.81f, 0.0f);

m_pScene = m_pPhysicsSDK->createScene(sceneDesc);

if(m_pScene == NULL) 

{

printf("Unable to create a PhysX scene, exiting the sample.\n");

return false;

}

// Set default material

NxMaterial* defaultMaterial = m_pScene->getMaterialFromIndex(0);

defaultMaterial->setRestitution(0.0f);

defaultMaterial->setStaticFriction(0.5f);

defaultMaterial->setDynamicFriction(0.5f);

// Create ground plane

NxPlaneShapeDesc planeDesc;

NxActorDesc actorDesc;

actorDesc.shapes.pushBack(&planeDesc);

m_pScene->createActor(actorDesc);

return true;

}

    创建一个简单的盒子,注意这里的size是一半的边长。

NxActor* PhysX::CreateCube(const NxVec3& pos, int size=2, const NxVec3* initialVelocity)

{

if(m_pScene == NULL) return NULL;

NxActor* actor;

// Create body

NxBodyDesc bodyDesc;

bodyDesc.angularDamping = 0.5f;

if(initialVelocity) bodyDesc.linearVelocity = *initialVelocity;

NxBoxShapeDesc boxDesc;

boxDesc.dimensions = NxVec3((float)size, (float)size, (float)size);

NxActorDesc actorDesc;

actorDesc.shapes.pushBack(&boxDesc);

actorDesc.body = &bodyDesc;

actorDesc.density = 10.0f;

actorDesc.globalPose.t  = pos;

actor=m_pScene->createActor(actorDesc);

actor->userData = (void*)size_t(size);

//printf("Total: %d actors\n", gScene->getNbActors());

return actor;

}

    剩下的主要就是Directx中每帧调用的渲染函数:

HRESULT D3dFrameWork::Render()

{

HRESULT hr=S_OK;

if( m_pScene == NULL)

{

hr=E_FAIL;

return hr;

}

// Start simulation (non blocking)

m_pScene->simulate(1.0f/60.0f);

// Clear the back buffer

float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f }; // red,green,blue,alpha

m_pContext->ClearRenderTargetView( m_pRTV, ClearColor );

//

int nbActors = m_pScene->getNbActors();

NxActor** actors = m_pScene->getActors();

while(nbActors--)

{

NxActor* actor = *actors++;

if(!actor->userData) continue;

        //得到物体的位置和旋转角度等信息

float glMat[16];

actor->getGlobalPose().getColumnMajor44(glMat);

box.Render(glMat,&m_View,&m_Projection,1.0f,1.0f,1.0f);

}

// Fetch simulation results

m_pScene->flushStream();

m_pScene->fetchResults(NX_RIGID_BODY_FINISHED, true);

//

// Present our back buffer to our front buffer

//

m_pSwapChain->Present( 0, 0 );

return hr;

}

   (因为Directx的代码实在很长,就算贴上来也很乱,所以我就不全部都贴上来了,但是我把这个Directx11与PhysX的程序打包上传到csdn了,有兴趣的朋友可以直接下载) 来看看效果:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NVIDIA PhysX 显卡物理加速驱动官方版可在N卡上实现物理加速运算的效果,所有游戏人物的动作和渲染特效都将显现动感十足的特效。NVIDIA PhysX 显卡物理加速驱动官方版是目前官方最稳定的N卡物理加速引擎,很多游戏大作都已经启动该驱动。 NVIDIA英伟达PhysX物理加速驱动9.12.0613版For WinXP-32/WinXP-64/Vista-32/Vista-64/Win7-32/Win7-64(2012年7月3日发布)   包含了NVIDIA英伟达PhysX最新运行时版本,支持所有英伟达 PhysX 内容。   该版本中的变化以及修正的问题:   Performance updates for various applications including Batman Arkham City, Alice 2 and other 2.8.4 applications。   在所有显存容量不低于 256MB 的NVIDIA英伟达GeForce精视8系列、9系列、100系列、200系列、300系列、400系列、500系列以及600系列GPU上均支持英伟达PhysX加速。   注: 一些应用程序的最低要求可能会更高。   大家可以在诸多游戏和演示程序中体验 GPU PhysX 加速,PowerPack 下载区重点展示了其中的一些游戏和演示程序,点此下载。   使用下列版本的软件开发包时,该软件在英伟达精视上支持英伟达 PhysX 加速: 2.7.1、2.7.3、2.7.4、2.7.5、2.7.6、2.8.0、2.8.1、2.8.3 以及 2.8.4 (需要 v196.21 或更新版本的图形驱动程序)。   支持从“英伟达显示器驱动程序控制面板”中控制 GPU PhysX 配置。 (需要 v196.21 或更新版本的图形驱动程序)。   AGEIA PhysX 处理器用户应该使用和安装较旧的英伟达 PhysX 系统软件,例如 8.09.04 版本。 注 – AGEIA PPU 加速仅支持 2.8.1 或更早期版本的软件开发包、Windows Vista 以及 Windows XP。 AGEIA时代的PhysX:   PhysX物理运算引擎由五名年轻的技术人员开发,他们成立了AGEIA公司。由于PhysX物理引擎在设计上就并不适合用CPU去计算,因此AGEIA公司还为PhysX引擎设计了专门的运算硬件,PhysX物理加速卡。PhysX物理加速卡的核心被称为PPU,即物理处理器(Physics processing Unit)。PPU在AGEIA公司被nVIDIA公司收购后已停止生产。   nVIDIA时代的PhysX:   2008年,Nvidia收购了AGEIA。正式将PhysX技术划入旗下。nVIDIA PhysX承袭自AGEIA PhysX,但Nvidia在此基础上推出了nVIDIA PhysX物理加速,并将PhysX物理加速功能移植到nVIDIA GPU中,用户不必额外购买PhysX物理加速卡就能享受到PhysX物理加速功能。借助CUDA架构,nVIDIA重新编写了PhysX物理加速程序,将PhysX物理加速引擎从AGEIA PPU移植到了nVIDIA GPU上。   所谓PhysX物理加速,是指相对于CPU来讲,GPU加快了PhysX物理引擎的计算速度。并不是说PhysX引擎只能由nVIDIA GPU处理。   nVIDIA劣化CPU执行PhysX效率:   如果使用CPU处理PhysX时,PhysX引擎只会调用CPU单线程计算。RealWorld Technologies网站的作者David Kanter使用Intel的VTune进程查看工具分析了多款支持PhysX特效的游戏,发现当这些游戏使用CPU处理物理特效时,大部分的代码使用的仍然是老旧的x87浮点算数指令,而不是效率高得多的SSE指令(SSE指令的完成同样任务的速度能达到x87指令的1.5-2倍)。   支持PhysX的游戏:   目前为止,在全平台上(PC,Xbox,Playstation)共有约260种游戏采用了PhysX引擎。其中在PC平台上,共有226种游戏采用PhysX引擎(截止2011.7.26)。   游戏物理效果   物理效果是未来游戏中最重要的一个方面。它涉及游戏中物体移动、互动以及对周围环境作出反应的方式。在当今许多游戏中如果没有物理效果,物体将无法按照玩家想象中的方式或像现实生活的方式运动。当前,大多数动作还仅限于预先定义好的、或“千篇一律”的动画,并且由游戏中的特定事件触发,例如枪炮射击在墙上等等。即使最强大的武器也只能在最薄的墙上留下一个斑点而已,每一个被你干掉的敌人都以预先定义好的相同模式倒下。玩家看到的只是精美的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值