DirectX (13) 粒子系统

directx游戏开发终极指南 directx游戏编程教程 很多游戏引擎最后都是要调用Directx和Opengl。也就是说游戏引擎只是对Directx等底层API的一种包装,方便使用,当然也提供了很多游戏编程里可能会用到的强大功能。 写游戏基本上是不得不使用引擎的,因为你没有必要从头造轮子,除非你打算显示一个图片就要手打上百行代码,或者只是做一个超简单的游戏做练习。 如果你会dx 懂底层再学习游戏引擎会更容易理解它的原理 用着更顺手,甚至自己写一个小引擎... 阅读详情

目录(?)[+]

作者:i_dovelemon

来源:优快云

日期:2014 / 10 / 16

主题:Point Sprite, Particle System



引言

             在游戏中,很多的绚丽,灿烂的特效,都可以使用粒子系统制作出来。那么粒子系统,到底是什么?它是如何工作的?接下来的文章,将会向大家讲述如何构建一个简单的粒子系统。



粒子系统

            所谓的粒子系统,指的是一个粒子管理器,用于在特定条件下产生特定的粒子,并且赋予粒子以运动。所以,可以将粒子系统看成是一个个粒子的集合。而不同的效果,是要我们自己来控制粒子如何产生,粒子的颜色如何变化,粒子如何进行运动。通过控制这些条件,我们就能够创造出很多很多的特效出来。而关键就在于如何控制粒子的运动和产生。

           既然,我们明白了粒子系统的概念,那么一个粒子到底是什么?它在计算机中是如何进行表示的?

           简单而言,粒子在计算机中就是使用一个结构来表达。结构中保存了粒子的基本属性,如位置,颜色,生命,以及运动状态相关的参数。不同复杂度的粒子系统,粒子所包含的属性并不相同。如果需要简单的效果,那么只需要几个基本的属性即可。如果要做出更加复杂,或者更加符合动力学的粒子系统,可以在结构中再添加很多不同的物理属性。至于如何添加这些属性,要依赖于你所需要实现的粒子系统的复杂程度,想要支持的功能来进行设计。

           当我们为粒子系统设计好了一个粒子结构之后,并且也有了粒子系统,来负责粒子的产生,以及运动等等。我们需要的当然就是显示在界面上。如果没有显示任何的内容,即使你的系统再强大,也是白费力气。

           DirectX中支持很多的基本单元类型,最常用的如三角形列表,线条列表等等。在这里,我们将会使用一个称之为Point Sprite的基本单元类型。

           Point Sprite,实际上就是一个点。我们在应用程序阶段,只需要将它当做点进行处理即可。但是要显示效果,我们自然还是需要进行纹理映射。由于Point Sprite的特殊性,DirectX内部会自动的为这些点设置纹理坐标。注意,这里的点只是逻辑意义上的。DirectX在最后处理的时候,还是会使用多边形来进行处理。所以这里说的点,存在一个大小的问题。我们能够通过程序来控制产生的点的大小。

           为了实现一些效果,我们需要开启Alpha blend。毕竟做粒子特效,如果没有进行颜色混合的话,就是一个一个的单独的纹理,这并不是粒子效果了。

            而且,粒子在界面显示的时候的先后顺序,对于我们来说并不重要。所以,将depth test以及depth buffer禁用掉,能够提高系统的效率。


基本类的设计

          在上面,说了这么多,最终要体现在代码上面,下面是粒子系统的抽象类。当我们需要创建一个新的效果的时候,只要继承这个类,并且复写虚函数即可。当然,这里的只是一个很简单的粒子系统设计,提供的粒子属性也很少。但是也能够做出很多的效果出来了。如果读者,希望更复杂的效果,就可以自己来扩展这个基本类别,然后添加你自己的功能。

          废话不多说,直接上代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //-----------------------------------------------------------------------  
  2. // declaration  : Copyright (c), by XJ , 2014. All right reserved .  
  3. // brief        : This file will define the Particle system  
  4. // author       : XJ  
  5. // file         : PSystem.h  
  6. // date         : 2014 / 10 / 15  
  7. // version      : 1.0  
  8. //-----------------------------------------------------------------------  
  9. #pragma once  
  10.   
  11. #include<d3dx9.h>  
  12. #include"AABB.h"  
  13. #include"Camera.h"  
  14. #include<vector>  
  15. using namespace XJCollision ;  
  16. using namespace std ;  
  17.   
  18. struct Particle  
  19. {  
  20.     D3DXVECTOR3 initPos ;  
  21.     D3DXVECTOR3 initVelocity;  
  22.     float       initSize    ;       //in pixel  
  23.     float       initTime    ;  
  24.     float       lifeTime    ;  
  25.     float       mass        ;  
  26.     D3DXCOLOR   initColor   ;  
  27.   
  28.     static IDirect3DVertexDeclaration9* decl ;  
  29. };  
  30.   
  31. class PSystem  
  32. {  
  33. public:  
  34.     PSystem(  
  35.         const char* fxName,  
  36.         const char* techName,  
  37.         const char* texName,  
  38.         const D3DXVECTOR3& accel,  
  39.         const AABB& box,  
  40.         int maxNumParticles,  
  41.         float timePerParticle,  
  42.         LPDIRECT3DDEVICE9 device,  
  43.         Camera* camera);  
  44.     virtual ~PSystem();  
  45.   
  46. public:  
  47.     float getTime();  
  48.     void setTime(float fTime);  
  49.     const AABB& getAABB() const ;  
  50.     void setWorldMtx(const D3DXMATRIX& world);  
  51.     void addParticle();  
  52.   
  53.     virtual void onLostDevice();  
  54.     virtual void onResetDevice();  
  55.   
  56.     virtual void initParticles(Particle& out) = 0;  
  57.     virtual void update(float dt);  
  58.     virtual void draw() ;  
  59.   
  60. protected:  
  61.     LPDIRECT3DDEVICE9 m_pDevice;                // Device  
  62.     ID3DXEffect     *m_FX   ;                   // Effect  
  63.     D3DXHANDLE       m_hTech;                   // Technique  
  64.     D3DXHANDLE       m_hWVP ;                   // WVP matrix  
  65.     D3DXHANDLE       m_hEyePosL;                //   
  66.     D3DXHANDLE       m_hTex;                    // Texture  
  67.     D3DXHANDLE       m_hTime;                   // Time  
  68.     D3DXHANDLE       m_hAccel;                  // Accel  
  69.     D3DXHANDLE       m_hViewportHeight;         // Viewport's height  
  70.       
  71.     IDirect3DTexture9* m_Tex;                   // Texture  
  72.     IDirect3DVertexBuffer9* m_VB    ;           // Vertex buffer  
  73.     D3DXMATRIX       m_World;                   // World matrix  
  74.     D3DXMATRIX       m_InvWorld;                // Inverse matrix  
  75.     float            m_Time ;                   // Time  
  76.     D3DXVECTOR3      m_Accel ;                  // Accelerate  
  77.     AABB             m_AABB;                    // Bounding box  
  78.     int              m_MaxNumParticles;         // Max number particles  
  79.     float            m_fTimePerParticle;        // Delay time to emit one particle  
  80.   
  81.     Camera          *m_pCamera  ;               // Camera  
  82.   
  83.     std::vector<Particle> m_Particles;        // Particles list  
  84.     std::vector<Particle*>  m_AliveParticles; // Alive particles list  
  85.     std::vector<Particle*>    m_DeadParticles;    // Dead particles list  
  86. };// end for PSystem  

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include"PSystem.h"  
  2. #include"MyUtil.h"  
  3. #include<d3dx9.h>  
  4.   
  5. IDirect3DVertexDeclaration9* Particle::decl = NULL ;  
  6. /** 
  7. * Constructor 
  8. */  
  9. PSystem::PSystem(const char* fxName,  
  10.         const char* techName,  
  11.         const char* texName,  
  12.         const D3DXVECTOR3& accel,  
  13.         const AABB& box,  
  14.         int maxNumParticles,  
  15.         float timePerParticle,  
  16.         LPDIRECT3DDEVICE9 device,  
  17.         Camera* camera)  
  18. {  
  19.     //Save the device  
  20.     m_pDevice = device ;  
  21.   
  22.     //Create error buffer  
  23.     ID3DXBuffer* _error = NULL ;  
  24.     HR(D3DXCreateBuffer(128, &_error));  
  25.   
  26.     //Create the Effect  
  27.     HR(D3DXCreateEffectFromFileA(m_pDevice, fxName,  
  28.         NULL,NULL, D3DXSHADER_DEBUG, NULL, &m_FX, &_error));  
  29.   
  30.     //If error   
  31.     if(_error)  
  32.     {  
  33.         MessageBoxA(NULL,(char*)_error->GetBufferPointer(),"Error", MB_OK);  
  34.         return ;  
  35.     }  
  36.   
  37.     //Get the technique handle  
  38.     m_hTech = m_FX->GetTechniqueByName(techName);  
  39.   
  40.     //Get all the handle  
  41.     m_hWVP = m_FX->GetParameterByName(0, "gWVP");  
  42.     m_hEyePosL = m_FX->GetParameterByName(0, "gEyePosL");  
  43.     m_hTex = m_FX->GetParameterByName(0, "gTex");  
  44.     m_hTime = m_FX->GetParameterByName(0, "gTime");  
  45.     m_hAccel = m_FX->GetParameterByName(0, "gAccel");  
  46.     m_hViewportHeight = m_FX->GetParameterByName(0, "gViewportHeight");  
  47.   
  48.     //Create the texture  
  49.     HR(D3DXCreateTextureFromFileA(m_pDevice, texName, &m_Tex));  
  50.   
  51.     //Set parameters  
  52.     HR(m_FX->SetTechnique(m_hTech));  
  53.     HR(m_FX->SetTexture(m_hTex, m_Tex));  
  54.     HR(m_FX->SetVector(m_hAccel, &D3DXVECTOR4(m_Accel,0.0f)));  
  55.   
  56.     //Save the time per particles  
  57.     m_fTimePerParticle = timePerParticle ;  
  58.   
  59.     m_Time = 0.0f ;  
  60.   
  61.     //Save the AABB  
  62.     m_AABB = box ;  
  63.   
  64.     //Save the camera  
  65.     m_pCamera = camera ;  
  66.   
  67.     //Allocate the memory for the particle  
  68.     m_MaxNumParticles = maxNumParticles ;  
  69.     m_Particles.resize(m_MaxNumParticles);  
  70.     m_AliveParticles.reserve(m_MaxNumParticles);  
  71.     m_DeadParticles.reserve(m_MaxNumParticles);  
  72.   
  73.     //They start all dead  
  74.     for(int i = 0 ; i < m_MaxNumParticles ; i ++)  
  75.     {  
  76.         m_Particles[i].initTime = 0.0f ;  
  77.         m_Particles[i].lifeTime = -1.0f ;  
  78.     }  
  79.   
  80.     //Create the vertex buffer  
  81.     HR(m_pDevice->CreateVertexBuffer(m_MaxNumParticles * sizeof(Particle), D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY|  
  82.         D3DUSAGE_POINTS,0,D3DPOOL_DEFAULT,&m_VB,NULL));  
  83. }// end for constructor  
  84.   
  85. /** 
  86. * Destructor 
  87. */  
  88. PSystem::~PSystem()  
  89. {  
  90.     m_AliveParticles.clear();  
  91.     m_DeadParticles.clear();  
  92.     m_Particles.clear();  
  93.     m_FX->Release();  
  94.     m_Tex->Release();  
  95.     m_VB->Release();  
  96. }// end for destructor  
  97.   
  98. void PSystem::setTime(float fTime)  
  99. {  
  100.     m_Time = fTime ;  
  101. }// end for setTime  
  102.   
  103. void PSystem::setWorldMtx(const D3DXMATRIX& world)  
  104. {  
  105.     m_World = world ;  
  106.     D3DXMatrixInverse(&m_World,NULL,&m_World);  
  107. }// end for setWorldMtx  
  108.   
  109. void PSystem::addParticle()  
  110. {  
  111.     if(m_DeadParticles.size() > 0)  
  112.     {  
  113.         Particle* p = m_DeadParticles.back();  
  114.         initParticles(*p);  
  115.   
  116.         m_DeadParticles.pop_back();  
  117.         m_AliveParticles.push_back(p);  
  118.     }  
  119. }// end for addParticle  
  120.   
  121. void PSystem::onLostDevice()  
  122. {  
  123.     //OnlostDevice for fx  
  124.     m_FX->OnLostDevice();  
  125.   
  126.     if(m_VB)  
  127.     {  
  128.         m_VB->Release();  
  129.         m_VB = NULL ;  
  130.     }  
  131. }// end for onLostDevice  
  132.   
  133. void PSystem::onResetDevice()  
  134. {  
  135.     //OnResetDevice for fx  
  136.     m_FX->OnResetDevice();  
  137.   
  138.     if(m_VB)  
  139.     {  
  140.         //Recreate the vertex buffer  
  141.         HR(m_pDevice->CreateVertexBuffer(m_MaxNumParticles*sizeof(Particle),  
  142.             D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS,0,  
  143.             D3DPOOL_DEFAULT,  
  144.             &m_VB,  
  145.             NULL));  
  146.     }  
  147. }// end for onResetDevice  
  148.   
  149. void PSystem::update(float dt)  
  150. {  
  151.     m_Time += dt ;  
  152.   
  153.     //Rebuild the dead list and alive list  
  154.     m_DeadParticles.resize(0);  
  155.     m_AliveParticles.resize(0);  
  156.   
  157.     //For each particle  
  158.     for(int i = 0 ; i < m_Particles.size() ; i ++)  
  159.     {  
  160.         if((m_Time - m_Particles[i].initTime) > m_Particles[i].lifeTime)  
  161.         {  
  162.             m_DeadParticles.push_back(&m_Particles[i]);  
  163.         }  
  164.         else  
  165.         {  
  166.             m_AliveParticles.push_back(&m_Particles[i]);  
  167.         }  
  168.     }// end for   
  169.   
  170.     //Check if it is the time to emit one another particle  
  171.     if(m_fTimePerParticle > 0.0f)  
  172.     {  
  173.         static float timeDelay = 0.0f ;  
  174.         timeDelay += dt ;  
  175.   
  176.         if(timeDelay > m_fTimePerParticle)  
  177.         {  
  178.             addParticle();  
  179.             timeDelay = 0.0f ;  
  180.         }  
  181.     }  
  182. }// end for update  
  183.   
  184. void PSystem::draw()  
  185. {  
  186.     //Get the camera's position in the world and make it relative to the particle system's local system  
  187.     D3DXVECTOR3 eyeW = m_pCamera->pos();  
  188.     D3DXVECTOR3 eyeL ;  
  189.     D3DXVec3TransformCoord(&eyeL, &eyeW, &m_InvWorld);  
  190.   
  191.     //Set the FX parameter  
  192.     HR(m_FX->SetValue(m_hEyePosL,&eyeL,sizeof(D3DXVECTOR3)));  
  193.     HR(m_FX->SetFloat(m_hTime, m_Time));  
  194.     HR(m_FX->SetMatrix(m_hWVP, &(m_World* m_pCamera->viewproj())));  
  195.     HR(m_FX->SetInt(m_hViewportHeight, 600));  
  196.   
  197.     //Draw  
  198.     //set the vertex buffer  
  199.     HR(m_pDevice->SetStreamSource(0, m_VB, 0, sizeof(Particle)));  
  200.   
  201.     //set the vertex declaration  
  202.     HR(m_pDevice->SetVertexDeclaration(Particle::decl));  
  203.   
  204.     Particle* p = 0 ;  
  205.     HR(m_VB->Lock(0, 0, (void**)&p, D3DLOCK_DISCARD));  
  206.     UINT vIndex = 0 ;  
  207.     for(int i = 0 ; i < m_AliveParticles.size(); i ++)  
  208.     {  
  209.         p[vIndex] = *m_AliveParticles[i] ;  
  210.         vIndex ++ ;  
  211.     }// end for  
  212.   
  213.     HR(m_VB->Unlock());  
  214.   
  215.     UINT numPass = 0 ;  
  216.     HR(m_FX->Begin(&numPass, 0));  
  217.     HR(m_FX->BeginPass(0));  
  218.   
  219.     if(vIndex > 0)  
  220.     {  
  221.         m_pDevice->DrawPrimitive(D3DPT_POINTLIST,0,vIndex);  
  222.     }  
  223.   
  224.     HR(m_FX->EndPass());  
  225.     HR(m_FX->End());  
  226. }// end for draw  

               我在这个类的基础上继承了一个类,用于实现自己的效果:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2.   
  3. #include"PSystem.h"  
  4.   
  5. class FireRing: public PSystem  
  6. {  
  7. public:  
  8.     FireRing(const char* fxName,  
  9.         const char* techName,  
  10.         const char* texName,  
  11.         const D3DXVECTOR3& accel,  
  12.         const AABB& box,  
  13.         int maxNumParticles,  
  14.         float timePerParticle,  
  15.         LPDIRECT3DDEVICE9 device,  
  16.         Camera* camera)  
  17.         :PSystem(fxName, techName, texName, accel,  
  18.         box, maxNumParticles, timePerParticle, device, camera)  
  19.     {  
  20.   
  21.     };  
  22.   
  23.     void initParticles(Particle& out)  
  24.     {  
  25.         //Save the init time  
  26.         out.initTime = m_Time ;  
  27.   
  28.         //Calculate the life time from 2.0s to 4.0s  
  29.         out.lifeTime = 20.0f + 2 * (rand()%10001 * 0.0001) ;  
  30.   
  31.         //Calculate the initialize size in pixel  
  32.         out.initSize = 50.0f + 10 * (rand()%10001 * 0.0001) ;  
  33.   
  34.         //Calculate the a very small velocity  
  35.         static float angle = 0.0f ;  
  36.         D3DXVECTOR3 vel(0.5f, 1.0f, 0.5f);  
  37.         D3DXMATRIX m ;  
  38.   
  39.         D3DXMatrixRotationY(&m,angle);  
  40.         D3DXVec3TransformCoord(&vel, &vel, &m);  
  41.   
  42.         out.initVelocity = vel ;  
  43.         D3DXVec3Normalize(&out.initVelocity, &out.initVelocity);  
  44.         angle += 1.0f ;  
  45.   
  46.         //Calculate the mass  
  47.         out.mass = 1.0f + (rand()%10001 * 0.0001) ;  
  48.   
  49.         //Calculate the color  
  50.         float t = (0.5f + 0.5*(rand()%10001 * 0.0001)) ;  
  51.         out.initColor = D3DXCOLOR(0.0f, 0.0f, t * 1.0f, t * 1.0f);  
  52.   
  53.         //Calculate the pos  
  54.         out.initPos.x = 0.0f;  
  55.         out.initPos.y = 0.0f ;  
  56.         out.initPos.z = 0.0f ;  
  57.   
  58.     }// end for initParticle  
  59. };  

              这个类只要复写它的粒子初始化函数就可以了。通过在初始化的里面进行设计,改变粒子的位置,状态等等,我们还是能够做出很多的效果出来。下面是这个效果配套的 Shader:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. uniform extern float4x4 gWVP ;  
  2. uniform extern texture gTex ;  
  3. uniform extern float3  gEyePosL;  
  4. uniform extern float3  gAccel ;  
  5. uniform extern float   gTime ;  
  6. uniform extern float   gViewportHeight ;  
  7.   
  8. sampler TexS = sampler_state  
  9. {  
  10.     Texture = <gTex>;  
  11.     MinFilter = LINEAR ;  
  12.     MagFilter = LINEAR ;  
  13.     MipFilter = POINT  ;  
  14.     AddressU = CLAMP ;  
  15.     AddressV = CLAMP ;  
  16. };  
  17.   
  18. struct OutputVS  
  19. {  
  20.     float4 posH : POSITION ;  
  21.     float4 color: COLOR0   ;  
  22.     float2 tex0 : TEXCOORD0 ;  
  23.     float  size : PSIZE ;  
  24. };  
  25.   
  26. //VS  
  27. OutputVS FireRingVS(  
  28.         float3 posL: POSITION,  
  29.         float3 vel : TEXCOORD0,  
  30.         float size : TEXCOORD1,  
  31.         float time : TEXCOORD2,  
  32.         float lifeTime: TEXCOORD3,  
  33.         float mass : TEXCOORD4,  
  34.         float4 color: COLOR0  
  35. )  
  36. {  
  37.     //Clear the output  
  38.     OutputVS outVS = (OutputVS)0 ;  
  39.   
  40.     float t = gTime - time ;  
  41.   
  42.     posL = posL + t * vel ;  
  43.   
  44.     outVS.posH = mul(float4(posL,1.0f), gWVP);  
  45.   
  46.     size += 0.8 * t ;  
  47.   
  48.     float d = distance(posL, gEyePosL);  
  49.     outVS.size = size ; //gViewportHeight * size / (1.0 + 8.0f*d);  
  50.     color.r = 0.0f ;  
  51.     color.g = 0.0f ;  
  52.     color.b = 1.0f * (t / lifeTime) ;   
  53.     color.a = 1.0f - 1.0f * (t / lifeTime) ;   
  54.     outVS.color = color ;//(1.0f - (t / lifeTime)) ;  
  55.   
  56.     return outVS ;  
  57. }  
  58.   
  59. //PS  
  60. float4 FireRingPS(float4 color:COLOR0,  
  61.                   float2 tex0: TEXCOORD0):COLOR  
  62. {  
  63.     return color * tex2D(TexS, tex0);  
  64. }  
  65.   
  66. technique FireRingTech  
  67. {  
  68.     pass P0  
  69.     {  
  70.         vertexShader = compile vs_2_0 FireRingVS();  
  71.         pixelShader = compile ps_2_0 FireRingPS();  
  72.   
  73.         PointSpriteEnable = true ;  
  74.         AlphaBlendEnable = true ;  
  75.         SrcBlend = One ;  
  76.         DestBlend = One ;  
  77.         ZWriteEnable = false ;  
  78.     }  
  79. }  

                这个粒子的效果如下截图:


              稍微改下,还能实现这样的效果:

                  

                粒子系统的关键就在与如何控制粒子的产生,运动等等。通过控制这些,你能够实现任何你想要的效果。

                好了,今天到这里结束了。

directx13.zipD directx13是微软推出的的新一代API,集成在新的Win10系统中。DirectX 13有诸多改进和新特性,比如底层API、多线程、混合多显卡等,堪称革命性的版本,但可惜的是它只会集成在新的Windows 10系统之中,不向下支持Windows 7/8/8.1。 不过现在,国外某大神从Win10最新预览版中提取了Directx 13,全面兼容Win7/Win8.1系统以及GTX6/7/9系、AMD HD7000/R200系列显卡,游戏性能将提升60%以上! 立即下载

相关推荐

输出DirectX .x模型插件for3DMAX2011,12,13,2014包含X32 X64

3DS MAX 导出 directx .X 文件的插件。3DS Max2011,12,13,2014插件(32位与64位),把模型导出成*.x文件,解压后把对应文件拷贝到3DS max安装目录的stdplugs文件夹即可。

DX渲染学习总结

1. 环境准备 1.1. 兼容性 1.1.1. 硬件兼容性 这里的硬件,指的是显卡及显卡驱动。本身DirectX是一组ring3层和ring0层配合使用的工具组,它需要显卡及显卡驱动的支持,每一个DirectX版本,都需要相关显卡驱动版本的支持。而市面上的显卡及驱动程序,一般都设计成向下兼容,也就是对低版本具有良好的兼容性,DirectX的低版本也可以运行在最新的显卡上。 而驱动程序与Windows版本是对应的,因为DX不仅需要显卡硬件特性的支持,同时也需要图形驱动的支持,显卡自身的驱动与操作系统的图形驱动

相见不如怀念 4049

使用DirectX制作粒子系统

提供利用DirectX9.0 实现粒子系统的特效的实例(完整的代码)

DirectX中的粒子系统

自然界中有现象包含了大量的行为相同的,微小粒子,比如:雪花,烟火等,粒子系统通常用来描述这些场景。 粒子是自然界中一种微小的东西,所以显示例子的最好的方法就是使用点图元,但是点图元在被光栅化的时候会被映射为一个像素,此时我们就无法去灵活的操作他,因为我们要去经常的改变他的大小,或者去给这个图元映射纹理。很早之前有一个技术叫做:广告牌,广告牌就是一个四边形,通过控制他的世界矩阵,来使其总面向摄影机...

Gary的面包屑小道 792

DIRECTX9做的粒子系统

用DIRECTX9做的粒子系统的代码

基于Direct3D的基本粒子系统

一个基于DirectX3D的粒子系统,包含源文件,和一个烟火的示例。

DirectX 3D基础复习

DirectX 3D基础复习 主要是用于期末考试复习 D3D期末复习(书本) 第一部分:基础知识 1、在D3DX库中,我们用类D3DXVECTOR3表示3D空间中的向量 2、向量的计算: (1)点积: ①u.v=0两个向量垂直 ②u.v>0两个向量之间的夹角小于90度 ③u.v<0两个向量之间的夹角大于90度 (2)叉积:p=UxX=[(UyVz-UzVy),(UzVx-UxVz),(...

qq_38897908的博客 907

logisim实验六:MIPS运算器设计

实验目的 学生理解算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的 32 位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。 设计要求 利用前面实验封装好的 32 位加法器以及 logisim 平台中现有运算部件构建一个 32 位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号

gyp0205的博客 2万+

DirectX11教程

最近在看DirectX11的教程,我对dx的接触也只是皮毛,边看边学吧。 看看网上只有w18767104183翻译了前三章,想着能不能继续他翻译一点呢,希望自己能一起成长。 点击图片是官方网站,译文点csdn的链接 DirectX 11 Tutorials Tutorial 1: Setting up DirectX 11 with Visual S

tdl1001的专栏 8595

RTL8306MB交换芯片驱动开发避坑指南:从硬件接线到SDK移植全流程解析

本文详细解析了RTL8306MB交换芯片驱动开发的全流程,重点从硬件接线、SDK移植到实战调试。针对RMII模式下的常见问题,特别是TXEN与RXDV信号交叉连接等关键“坑点”,提供了清晰的排查指南和解决方案,旨在帮助嵌入式工程师高效完成网络设备开发。

277

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 290

DirectX 9高效渲染之利用Constant构建渲染数据

http://www.cppblog.com/sunicdavy/archive/2010/07/27/121394.html   偶然一次查看RenderMonkey例子中的Particle System.rfx 的 FireParticleSystem 中发现了一种提高DX9渲染效率的设计方法 这里仅列出Vertex Shader参考:   1: float4

痞子龙3D编程 2095

心电图机原理及电路超详细讲解

前置心电放大电路(虚线框:这是隔离电路的分界,在隔离电路分析中知道,完整隔离包括信号隔离(脉宽调制)、控制信号隔离(光电耦合)和电源隔离)后级放大电路。

fcxgfdjy的博客 2万+

C++小项目:directx11图形程序(一):主框架

  最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和DirectX11图形程序的知识。希望大家喜欢。程序风格和很多知识来源于这个网站:http://www.rastertek.com/index.html 。大家想深入学习Dx的可以去看看。   先说程序框...

weixin_30326741的博客 300

UNet 改进(22):结合Transformer结构

保留了UNet的经典编码器-解码器结构在瓶颈层使用Transformer替代传统的卷积层采用跳跃连接保持空间细节信息使用双卷积块(DoubleConv)作为基础构建模块。

2401_82355416的博客 774

【华为OD机试真题】459、小扇和小船的数字游戏、数字游戏 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

### 🎃题目描述 >小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1  现在求 m 的最小值

KJ.JK 1718

win32+DirectX9小游戏

一个画图的小游戏,原本是某人的作业题,题目要求是做出一个能画圆,写简单的字的小系统。被我各种YY后成这样的了(话说为什么我们学校就没这样的题目。。都是对着黑屏白字看— —) 这个小游戏用的是win32+DirectX9+GDI,语言是C++,最重要的是源代码里演示了 用DX开发2Dwindows窗口游戏的基本框架,而且有大量的中文说明,我想对于想学游戏编程的新人来说有一定的价值(VS20...

weixin_33704234的博客 296

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

发现了一本抄袭的书:《DirectX游戏编程》(周国庆 陈洪 冯人果 编著)

<br />我认为这本书的抄袭的:<br />                           <br />  今天周日,到省图书馆又借了一本DirectX方面编程的书《DirectX 游戏编程》(周国庆 陈洪 冯人果 编著),白天看到时,翻了翻,看是新出的,新的装帧和封面设计,有让人眼前一亮的感觉,没啥犹豫,就借下了。晚上快速浏览,只是越看越觉得眼熟,大部分插图都曾看过啊,好象是另一本书上也是这样的吧,不过一想,可能是有个把章节是借过来的吧,现在出书可能都东拼西凑的吧,再往下看吧。<br />  嗯?

ResoundTeam的专栏 2703

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(一)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包

慕羽★的博客 3936

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WhyDX9:翻写D3D红龙书中的程序

  之前写过一套学习OpenGL的框架:WhyGL,即然有了GL那也应该再写个学习D3D的框架:WhyDX9.两个程序的架构相同,然后这个程序是将D3D红龙那本书的DEMO翻写了一遍.先将可执行程序发一下,代码等整理后再发. 使用说明: WhyDX9演示程序平台.exeWhyDX9.exe都可以运行程序,不同之处在于,一个是基本的Windows窗体程序,一个是MFC的单文档界面程序. 主U...

weixin_33849215的博客 141

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: “游戏数据同步方案”
下一篇: 开源库
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值