还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
龟孑科技大母实验报告学生姓名学号指导教师实验地点实验时间
一、实验室名称计算机学院软件实验室
二、实验项目名称三维特效技术
三、实验学时学时8
四、实验原理很多的现象都可以用粒子系统精确的或者近似的模拟,如火焰、喷泉、爆炸、鱼群和星空等等一个粒子系统由拥有各种属性的对象组成,它们必须遵循一定的行为规范具体的这些属性和行为规范取决于需要模拟的内容是什么一些粒子系统可能需要很多属性和复杂的规则,而有的则可能极为简单根据粒子设置的复杂性,可以产生简单的可以实现喷泉、烟雾、火焰等;复杂一点的可以实现flocking等;再复杂一点就可以利用粒子系统模拟实现衣物等弹性物体粒子系统是一种物理模型,粒子系统的核心不在于如何显示图形,而是在于对某个物理模型的理解和分析只有基于物理模型的方法,才能模拟出随机而逼真的自然景象粒子的运动变化规律可以很简单也可以很复杂,这取决于模拟的物理模型的复杂程度对于每一个粒子,它应具有以下属性1坐标Coordinates对于每一个粒子,最终都要把它映射到屏幕上,所以坐标成为一个粒子最为重要的属性之一每个粒子的坐标随时间的变化而变化,它通过每个粒子自身在各时刻的速度求得2速度Velocity运动的粒子都有速度,每个粒子的速度可以各不相同速度用来计算下一时刻粒子的坐标位置3加速度Acceleration粒子可以做变速运动,此时加速度便会发生作用它用来计算下一时刻粒子的速度particle[loop].z=O.Of;//Center On Z Axis//X AxisSpeed AndDirectionparticlefloop].xi=xspeed+floatrand%60-
32.Of;//Y AxisSpeed AndDirection;particle[loop].yi=yspeed+floatrand%60-
30.0fparticle[loop].zi=floatrand%60-
30.0f;//Z AxisSpeed AndDirectionparticle[loop].r=colors[col]
[0];//Select RedFrom ColorTableparticle[loopj.g=colors[col]
[1];//Select GreenFrom ColorTableparticle[loop].b=colors[col]
[2];//Select BlueFrom ColorTable//If NumberPad8And YGravity Is Less Than
1.5Increase PullUpwards ifkeys[VK_NUMPAD8]particle!loop].yg
1.5f particle!loop].yg+=
0.01f;//If NumberPad2And YGravity Is Greater Than-
1.5Increase PullDownwards ifkeys[VK_NUMPAD2]particle[loop].yg-
1.5f particle[loop].yg-=
0.01f;//If NumberPad6And XGravity Is Less Than
1.5Increase PullRightif keys|VK_NUMPAD6]particle|loop].xg
1.5f particle|loop|.xg+=
0.01f;//If NumberPad4And XGravity Is Greater Than-
1.5Increase PullLeftif keys[VK_NUMPAD4]particle[loop].xg-
1.5f particle[loop].xg~
0.01f;if keys[VK_TAB]particle[loop].x=O.Of;//Center On X Axisparticle[loopJ.y=O.Of;//Center On Y Axisparticle|loop].z=
0.0f;//Center On Z Axis//Tab KeyCauses ABurstparticlefloop].xi=floatrand}%50-
26.0f:1c
10.Of;//Random SpeedOn X Axisparticle[loop].yi=floatrand%50-
25.0f*
10.Of;//Random SpeedOn Y Axisparticle[loop].zi=floatrand%50-
25.0f ic
10.0f;//Random SpeedOn Z Axisreturn TRUE;//Everything WentOKGLvoid KillGLWindowGLvoid//Properly Kill The Windowif fullscreen//Are WeIn Fullscreen ModeChangeDisplaySettingsNULL,O;//If SoSwitch BackTo TheDesktopShowCursorTRUE;//Show MousePointerif hRC//Do WeHave ARendering Context//Are WeAble ToRelease TheDC AndRC Contextsif!wglMakeCurrentNULL,NULL{MessageBoxNULL;Release OfDC AndRC Failed/1,“SHUTDOWN ERROR1,MB_OK|MBJCONINFORMATION;if!wglDeleteContexthRC//Are WeAble ToDelete TheRCMessageBoxNULL,Release Rendering Context Failed.1,“SHUTDOWNERROR\MB_OK|MBJCONINFORMATION;hRONULL;//Set RCTo NULLifhDC!ReleaseDChWnd,hDC//Are WeAble ToRelease TheDCMessageBoxNULL,nRelease Device Context Failed.1,SHUTDOWN ERROR,MB_OK|MBJCONINFORMATION;hDC=NULL;//Set DCTo NULLifhWnd!DestroyWindowhWnd//Are WeAble ToDestroy TheWindowMessageBoxNULL,HCould NotRelease hWndJJSHUTDOWN ERROR”,」MB_OK|MB CONINFORMATION;hWnd=NULL;//Set hWndTo NULLif!UnregisterClassnOpenGLn,hInstance//Are WeAble ToUnregister ClassMessageBoxNULL,HCould NotUnregister Class.”:SHUTDOWNERROR1,MB_OK|MBJCONINFORMATION;hInstance=NULL;//Set hlnstanceTo NULL/*This CodeCreates OurOpenGL Window.Parameters Are:*title-Title To Appear AtThe TopOf TheWindow*width-Width Of The GLWindow OrFullscreen Mode*height-Height OfThe GLWindow OrFullscreen Mode*bits-Number OfBits ToUse ForColor8/16/24/32*fullscreenflag-Use Fullscreen Mode TRUEOr Windowed Mode FALSE*/GLuint PixelFormat;//Holds TheResults AfterSearching ForA MatchWNDCLASSwc;//Windows ClassStructureDWORD dwExStyle;//Window Extended Style//Window StyleDWORDdwStyle;//Grabs RectangleUpper Left/Lower RightValuesRECT WindowRect;//Set LeftValue To0WindowRect.left=long0;//Set RightValue ToRequested WidthWindowRect.right=longwidth;//Set TopValue To0WindowRect.top=long0;//Set BottomValue ToRequested HeightWindowRect.bottom=longheight;BOOL CreateGLWindowCchar*title,int width,int height,int bits,bool fullscreenflagfullscreen=fullscreenflag;//Set TheGlobal Fullscreen Flaghlnstance GetModuleHandleNULL;//Grab AnInstance ForOur Window//Redraw OnSize,And OwnDC ForWindow.wc.style=CS.HREDRAW|CS_VREDRAW|CS_OWNDC;二wc.lpfnWndProc WNDPROCWndProc;//WndProc HandlesMessageswc.cbClsExtra二0;//No ExtraWindow Datawc.cbWndExtra=0;//No ExtraWindow Datawc.hlnstance hlnstance;//Set TheInstancewc.hlcon LoadIconNULL,IDI.WINLOGO;//Load TheDefault Iconwc.hCursor=LoadCursorNULL,IDC_ARROW;//Load TheArrow Pointer//No BackgroundRequired ForGLwc.hbrBackground=NULL;wc.lpszMenuName=NULL;//We DontWant AMenu;//Set TheClass Namewc.lpszClassName=OpenGL”if!RegisterClasswc//Attempt ToRegister TheWindow ClassMessageBoxNULL,Tailed ToRegister TheWindow Class.-ERROR”,MB_OK|MB_ICONEXCLAMATION;return FALSE;//Return FALSEiffullscreen//Attempt Fullscreen ModeDEVMODE dmScreenSettings;//Device Mode//Makes SureMemorys ClearedmemsetdmScreenSettings,0,sizeofdmScreenSettings;//Size OfThe DevmodeStructuredmScreenSettings.dmSize=sizeofdmScreenSettings;dmScreenSettings.dmPelsWidth=width;//Selected ScreenWidthdmScreenSettings.dmPelsHeight=height;//Selected ScreenHeight//dmScreenSettings.dmBitsPerPel=bits;Selected BitsPer PixeldmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;//Try ToSet SelectedMode AndGet Results.//NOTE:CDS_FULLSCREEN GetsRid OfStart Bar.!二if ChangeDisplaySettingsdmScreenSettings,CDS_FULLSCREENDISP_CHANGE_SUCCESSFUL//If TheMode Fails,Offer TwoOptions.Quit OrUse Windowed Mode.if MessageBoxNULL,The RequestedFullscreenModeIs NotSupported By\nYour VideoCard.Use WindowedModeInstead1,nNeHe GL”,MB_YESNO|MB」CONEXCLAMATION==IDYES二fullscreen FALSE;//Windowed ModeSelected.Fullscreen=FALSE}else//Pop UpA MessageBox LettingUser KnowThe Program Is Closing.MessageBoxNULL,nProgram WillNow Close.”JERROR”,」MB_OK|MB CONSTOP;return FALSE;//Return FALSEiffullscreen//Are WeStill In Fullscreen ModedwExStyle=WS_EX_APPWINDOW;//Window ExtendedStyledwStyle=WS_POPUP;//Windows StyleShowCursorFALSE;//Hide MousePointerelse//Window ExtendedStyledwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;dwStyle=WS_O VERLAPPEDWINDOW;//Windows Style//Adjust WindowTo TrueRequested SizeAdjustWindowRectExWindowRect,dwStyle,FALSE,dwExStyle;//Create TheWindowif!hWnd=CreateWindowEx dwExStyle,//ExtendedStyleFor TheWindow“OpenGL”,//Class Nametitle,//Window TitledwStyle|WS_CLIPSIBLINGS|//Required WindowStyle//WS CLIPCHILDREN,Required WindowStyle//0,0,Window Position//Calculate WindowWidth//Defined WindowStyleWindowRect.right-WindowRect.left,//Calculate WindowHeightWindowRect.bottom-WindowRect.top,NULL,//No ParentWindowNULL,//No Menuhlnstance,//InstanceNULL//Dont PassAnything ToWM_CREATEKillGLWindow;//Reset TheDisplayMessageBoxNULL,nWindow CreationError.1,nERRORn,MB_OK|MB_ICONEXCLAMATION;return FALSE;//Return FALSE//pfd TellsWindows HowWe WantThings ToBe staticPIXELFORMATDESCRIPTOR pfd=sizeofPlXELFORMATDESCRIPTOR,1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,//Size OfThis Pixel Format DescriptorPFD_MAIN_PLANE,//Version Number//Format Must Support Window0,//Format MustSupport OpenGL//MustSupportDouble Buffering//Request AnRGBA Format//Select OurColor Depth//Color BitsIgnored//No AlphaBuffer//Shift BitIgnored//No AccumulationBuffer//Accumulation BitsIgnored//16Bit Z-Buffer Depth Buffer//No StencilBuffer//No AuxiliaryBuffer//Main DrawingLayer//Reserved0,0,0//Layer MasksIgnored;if!hDC=GetDChWnd//Did WeGet ADevice ContextKillGLWindow;//Reset TheDisplayMessageBoxNULL,nCant Create A GLDeviceContext.,ERROR,MB_OK|MB」CONEXCLAMATION;return FALSE;//Return FALSEif!PixelFormat=ChoosePixelFormathDC,pfd//Did WindowsFind AMatching PixelFormatKillGLWindow;//Reset TheDisplayMessageBoxNULLJCant FindA SuitablePixelFormatZ/ERROR1,MB_OK|MB_ICONEXCLAMATION;return FALSE;//Return FALSEif!SetPixelFormathDC,PixelFormat,pfd//Are WeAble ToSet ThePixelFormatKillGLWindow;//Reset TheDisplayMessageBoxNULLJCant Set The PixelFormat.n;,ERRORH,MB_OK|MB_ICONEXCLAMATION;return FALSE;//Return FALSEif!hRC=wglCreateContexthDC//Are WeAble ToGet ARendering Context{KillGLWindow;//Reset TheDisplayMessageBoxNULL,uCant CreateA GLRendering Context.,ERROR,MB_OK|MB」CONEXCLAMATION;return FALSE;//Return FALSE}if!wglMakeCurrenthDC,hRC//Try ToActivate TheRendering ContextKillGLWindow;//Reset TheDisplayMessageBoxNULL,nCant ActivateThe GLRenderingContext.:ERROR,MB_OK|MB_ICONEXCLAMATION;return FALSE;//Return FALSEShowWindowhWnd,SW_SHOW;//Show TheWindowSetForegroundWindowhWnd;//Slightly HigherPrioritySetFocushWnd;//Sets KeyboardFocus To The WindowReSizeGLScenewidth,height;//Set UpOur PerspectiveGL ScreenKillGLWindow;//Reset TheDisplay//Initialize OurNewly CreatedGL WindowMessageBoxNULL,initialization Failed.1,return FALSE;//Return FALSE」“ERROR”,MB_OK|MB CONEXCLAMATION;return TRUE;//SuccessLRESULT CALLBACKWndProcHWND hWnd,UINT//Handle ForThis WindowuMsg,WPARAM wParam,//Message ForThis Window//Additional MessageInformationLPARAM1Param//Additional MessageInformationswitch uMsg//Check For Windows MessagescaseWM_ACTIVATE://Watch ForWindow ActivateMessageif!HIWORDwParam//Check MinimizationStateactive=TRUE;//Program Is Activeelse//Otherwiseactive=FALSE;//ProgramIsNo LongerActivereturn0;//Return To The MessageLoop//Intercept SystemCommandscase WM_SYSCOMMAND:{//Check SystemCallsswitch wParam//Screensaver TryingTo StartcaseSC_SCREENSAVE:case//Monitor TryingTo EnterPowersaveSC_MONITORPOWER://Prevent FromHappeningreturn0;break;//Exit//Did WeReceive AClose MessagecaseWM_CLOSE://Send AQuit MessagePostQuitMessageO;//Jump Backreturn0;//IsAKey BeingHeld DowncaseWM_KEYDOWN://If So,Mark ItAs TRUEkeys[wParam]=TRUE;//Jump Backreturn0;//Has AKey BeenReleasedcase WM_KEYUP://If So,Mark ItAs FALSE//Jump Back二keys[wParam]FALSE;return0;//Resize TheOpenGL Window//LoWord=Width,HiWord=HeightReSizeGLSceneLOWORDlParam,HIWORDlParam;return0;//Jump Back//Pass AllUnhandled MessagesTo DefWindowProcreturnDefWindowProchWnd,uMsg,wParam,lParam;int WINAPIWinMain HINSTANCE hlnstance,HINSTANCE//InstancehPrevInstance,//Previous InstanceLPSTRIpCmdLine,//Command LineParametersint nCmdShow//Window ShowStateMSG msg;//Windows MessageStructureBOOL done=FALSE;//Bool VariableTo ExitLoop//Ask TheUser WhichScreen ModeThey PreferifMessageBoxNULL,nWould YouLike ToRun InFullscreenMode”,“Start FullScreenn,MB_YESNO|MB_ICONQUESTION==IDNOfullscreen=FALSE;//WindowedMode//Create OurOpenGL Windowif!CreateGLWindow,NeHe,s ParticleTutorialH,640,480,16,fullscreenreturn0;//Quit IfWindow WasNot Creatediffullscreen//Are WeInFullscreenModeslowdown=
1.0f;//If So,Speed UpThe Particles3dfx Issuewhile!done//Loop ThatRuns Whiledone=FALSEif PeekMessagemsg,NULL,0,0,PM_REMOVE//Is There A MessageWaitingif msg.message==WM_QUIT//Have WeReceived AQuit Messagedone=TRUE;//If Sodone=TRUEelse//If Not,Deal WithWindow MessagesTranslateMessagemsg;//Translate TheMessage//DispatchMessagemsg;Dispatch TheMessageelse//If ThereAre NoMessages//Draw TheScene.//Watch ForESC KeyAnd QuitMessages FromDrawGLScene//Active WasThereAQuit Receivedifactive!DrawGLScene||keys[VK_ESCAPE]二done//ESC orDrawGLScene SignalledA QuitTRUE;else//Not TimeTo Quit,Update ScreenSwapBuffershDC;//Swap BuffersDouble Buffering//Speed UpParticlesif keys[VK_ADD]slowdown
1.0f slowdown-O.Olf;//Slow DownParticlesif keys[VK_SUBTRACT]slowdown
4.0f slowdown+=
0.01f;ifkeys[VK_PRIOR]zoom+=
0.1f;//Zoom In//Zoom Outifkeys[VK_RETURN]!rp//Return KeyPressedrp=true;//Set FlagTelling UsIts Pressedrainbow=!rainbow;//Toggle RainbowMode On/Offif!keys[VK_RETURN]rp=false;//If ReturnIs ReleasedClear Flag//Space OrRainbow Modeifkeys[VK_NEXT]zoom-=
0.1f;if keys[*,]!sp||rainbowdelay25//If SpacebarIs PressedDisable RainbowModeif keys[**]rainbow=false;二sp true;//Set FlagTelling UsSpace IsPresseddelay=0;//Reset TheRainbow ColorCycling Delaycol++;//Change TheParticle Colorifcolll col=0;//If ColorIs ToHigh ResetItif!keys[**]sp=false;//If SpacebarIs ReleasedClear Flag//If UpAITOW AndY SpeedIsLessThan200Increase UpwardSpeed ifkeys[VK_UP]yspeed200yspeed+=
1.0f;//If DownArrow AndY SpeedIsGreaterThan-200//Increase DownwardSpeedifkeys[VK_DOWN]yspeed-200yspeed-=
1.0f;//If RightArrow AndX SpeedIsLessThan200Increase Speed ToTheRightifkeys[VK_RIGHT]xspeed200xspeed+=
1.0f;//If LeftArrow AndX SpeedIsGreaterThan-200//Increase Speed ToTheLeftif keys[VK_LEFT]xspeed-200xspeed-=
1.0f;delay++;//Increase RainbowMode ColorCycling DelayCounterifkeys[VK_Fl]//Is FlBeing Pressedkeys[VK_Fl]=FALSE;//If SoMake KeyFALSE4生命值Life每个粒子都有着自己的生命值,随着时间的推移,粒子的生命值不断减小,直到粒子死亡生命值为0一个生命周期结束时,另一个生命周期随即开始,有时为了使粒子能够源源不断地涌出,必须使一部分粒子在初始后立即死亡,这个技巧在后面的实现中会具体说明5衰减Decay就象人会衰老一样,每个粒子也有它自己的生命周期,Decay就是用来控制粒子生命周期的一个物理量
五、实验目的本实验要实现一个基本的粒子系统,该基本粒子系统必须具有以下模块粒子生成、给粒子施加力例如重力、拖力等、粒子的碰撞效果例如与其他几何体碰撞,并反弹回来基本系统实现之后,学生可以选择一些针对粒子绘制和物理仿真方面的扩展针对绘制的扩展可以产生如烟雾、火光、火花等特效针对物理方面的扩展可以产生如衣物、绳子、甚至鸟群、鱼群等
六、实验内容利用OpenGL实现一个标准的粒子系统特效,如烟花、喷泉等
七、实验器材设备、元器件
1.操作系统Windows XP
2.开发工具VC2003,OpenGLl库普通即可
3.PC
八、实验步骤创建工程1启动VC++2003,创建空白工程项目选择菜单中的“文件”-“新建”-“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++项目”,在右边框中,选择“空项目.Net”,在对话框下边,选择工程文件存放目录及输入名称,如Examplel,单击“确定”设置此工程所需的库2OpenGL选择菜单中的“项目”-uExample1属性”,在弹出的Example1属性页”对话框中,单击“链接器”-“输入”,选择右边框中的“附加依赖项”,单击最右端的“…”小按钮,弹出“附加依赖项”对话框,输入KillGLWindow;//Kill OurCurrent Windowfullscreen=!fullscreen;//Toggle Fullscreen/WindowedMode//Recreate OurOpenGLWindow if!CreateGLWindowNeHes ParticleTutorial”,640,480/6,fullscreenreturn0;//Quit IfWindow WasNot Created//ShutdownKillGLWindow;//KillTheWindowreturn msg.wParam;//Exit TheProgram“opengl
32.1ib glu
32.1ib glaux.lib注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误,单击“确定”结束,返回“属性页”对话框,单击“确定”OpenGL库设置完成在工程项目中添加源文件3在解决方案资源管理器中,鼠标右击“源文件”,弹出浮动菜单,选择“添力口”-“添加新项”,弹出“添力口新项-Example1”对话框,在右边的模板框中,选择“C++文件.cpp”,输入文件名,单击“打开”,添加源文件结束如果需要添加头文件,其操作方法相似本例没有编写的头文件录入源程序4将预习时编写的源程序录入到计算机中本例的源代码来自OpenGL的编程教程,仅作为本实验的参考代码学生可以自己编写粒子系统,也以此为基础,修改源代码生成不同的粒子系统说明准备好粒子显示图片,取名为Particle.bmp,并放在当前目录的子目录data下该图片将作为粒子的纹理,如图1所示图粒子纹理图片1
九、实验数据及结果分析程序执行后,看到粒子爆炸、散开,然后粒子不断往往下坠落如图2所示通过修改粒子速度、加速度、生命期等参数,可以看到粒子效果的差别图粒子特效截图2
十、实验结论利用OpenGL能够实现粒子系统特效,如喷泉、烟雾等
十一、总结及心得体会OpenGL具有强大的图形绘制功能,能很好地支持图形设计
十二、对本实验过程及方法、手段的改进建议程序设计合理,代码可进一步优化报告评分指导教师签字:本实验参考源代码如下:This CodeWas CreatedBy JeffMolofee2000If YouveFound ThisCode Useful,Please LetMe Know.Visit MySite At#include windows.h//Header FileForWindows#include stdio.h//Header FileFor StandardInput/Output#include gl\gl.h//Header FileFor TheOpenGL32Library//Header FileFor TheGLu32Library#include gl\glu.h//Header FileFor TheGlaux Library#include gl\glaux.h#define MAX_PARTICLES1000//Number OfParticles ToCreateHDC hDC=NULL;//Private GDIDevice ContextHGLRChRONULL;//Permanent RenderingContextHWND hWnd=NULL;//Holds OurWindow HandleH1NSTANCEhlnstance;//Holds TheInstance OfThe Applicationboolkeys
[256];//Array UsedFor TheKeyboard Routineboolactive=TRUE;//Window ActiveFlag Set To TRUEBy Defaultboolfullscreen=TRUE;//FullscreenFlagSetToFullscreenModeBy Default//Rainbow Modeboolrainbow=true;//Spacebar Pressedboolsp;//Enter KeyPressedbool rp;float slowdown=
2.0f;//Slow DownParticlesfloat xspeed;//Base XSpeedToAllow KeyboardDirection OfTail//floatyspeed;Base YSpeedToAllow KeyboardDirection OfTail//Usedfloat zoom=-
40.0f;To ZoomOutGLuint loop;//Mise LoopVariableGLuint col;//Current ColorSelectionGLuint delay;//Rainbow EffectDelayGLuint texture[l];//Storage ForOur ParticleTexturetypedef struct//CreateAStructure ForParticlebool active;//Active Yes/No//Particle Lifefloatlife;//Fade Speedfloatfade;//Red Valuefloatr;float g;//Green Valuefloatb;//Blue Valuefloatx;//X Positionfloaty;//Y Positionfloat z;//Z Positionfloatxi;//X Directionfloatyi;//Y Directionfloatzi;//Z Directionfloatxg;//X Gravityfloatyg;//Y Gravityfloatzg;//Z Gravityparticles;//Particles Structureparticlesparticle[MAX_PARTICLES];//Particle ArrayRoom ForParticle InfostaticGLfloat colors
[12]
[3]=//Rainbow OfColors{l.Of,O.5f,O.5f},{
1.0f,
0.75f,
0.5f},{
1.0f,
1.0f,
0.5f},{
0.75f,
1.0f,
0.5f},{O.5f,l.Of,O.5f},{
0.5f,
1.0f,
0.75f},{
0.5f,
1.0f,
1.0f},{O.5f,O.75f,l.Of},;{O.5f,O.5f,l.Of},{
0.75f,
0.5f,
1.0f},{l.Of,O.5f,l.Of},{
1.0f,
0.5f,
0.75f}//Declaration ForWndProcLRESULT CALLBACKWndProcHWND,UINT,WPARAM,LPARAM;AUX_RGBImageRec*LoadBMPchar.Filename//Loads ABitmap ImageFILE*File=NULL;//File HandleifJFilename{//Make SureA FilenameWas Givenreturn NULL;//If NotReturn NULLFile=fopenFilename,nr,;if File{//Check ToSee If The FileExistsfcloseFile;//Does TheFile ExistreturnauxDIBImageLoadFilename;}returnNULL;//Close TheHandle//Load TheBitmap AndReturn APointerint LoadGLTextures//Load BitmapAnd ConvertToA//If LoadFailed ReturnNULLTextureAUX_RGBImageRec*TextureImage[l];//Create StorageSpace ForThe TexturesmemsetTextureImage,0,sizeofvoid**1;//Set ThePointer ToNULL上if TextureImage
[0]=LoadBMPData/Particle mp//Load ParticleTexture Status=TRUE;//SetTheStatus ToTRUEglGenTexturesl,texture
[0];//Create OneTextureglBindTextureGL_TEXTURE_2D,texture
[0];glTexParameteriGL_TEXTURE_2D,GL_TEXTURE_MAG_FIUTER,GL_LINEAR;glTexParameteriGL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR;glTexImage2DGL_TEXTURE_2D,0,3,TextureImage[O]-sizeX,TextureImage[O]-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,Textureimage
[0]-data;if TextureImage|O|//If TextureExistsif TextureImage[O]-data//If Texture Image Exists//Free TheTextureImageMemoryfreeTextureImage[O|-data;//Free TheImage StructurefreeTextureImage[O];//Return TheStatusreturn Status;//Resize AndInitialize TheGL WindowGLvoidReSizeGLSceneGLsizei width,GLsizei heightifheight==O//Prevent ADivide ByZero By//Making HeightEqual OneglViewport0,0,width,height;//Reset TheCurrent Viewportheight=l;glMatrixModeGL_PROJECTION;//Select TheProjection Matrix//glLoadldentityO;Reset TheProjection Matrix//Calculate TheAspect RatioOfTheWindow;gluPerspective
45.0f,GLfloatwidth/GLfloatheight,
0.1f,
200.OfglMatrixModeGL_MODELVIEW;glLoadldentityO;//Select TheModelview Matrix//Reset TheModelview MatrixintInitGLGLvoid//All SetupFor OpenGLGoes Here//Jump ToTexture LoadingRoutineif!LoadGLTextures returnFALSE;//If TextureDidnt LoadReturn FALSEglShadeModelGL_SMOOTH;//Enable SmoothShadingglClearColor
0.0f,
0.0f,
0.0f,
0.0f;//Black Background;//DepthBufferSetupglClearDepthl.Of//Disable DepthTestingglDisableGL_DEPTH_TEST;//Enable BlendingglEnableGL_BLEND;//Type OfBlending ToPerformglBlendFuncGL_SRC_ALPHA,GL_ONE;//Really NicePerspective CalculationsglHintGL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST;glHintGL_POINT_SMOOTH_HINT,GL_NICEST;//Really NicePoint SmoothingglEnableGL_TEXTURE_2D;//Enable TextureMappingglBindTextureGL_TEXTURE_2D,texture
[0];//Select OurTexturefor loop=0;loopMAX_PARTICLES;loop++{//Initials All The Texturesparticle[loop].active=true;particle!loop].life=l.Of;//Make All The ParticlesActive//Give AllThe ParticlesFull Lifeparticle[loop].fade=floatrand%1OO/lOOO.Of+O.OO3f;//Random FadeSpeedparticle[loop].r=colors[loop*12/MAX_PARTICLES]
[0];//Select RedRainbow Colorparticle[loop].g=colors[loop*12/MAX_PARTICLES]
[1];//Select RedRainbow Colorparticle[loop].b=colors[loop*12/MAX_PARTICLES]
[2];//Select RedRainbow Colorparticle[loop].xi=floatrand%50-
26.0f*
10.Of;//Random SpeedOn XAxis//particle[loop].yi=floatrand%50-
25.0f:{c
10.Of;Random SpeedOn YAxis//particle[loop].zi=floatrand%50-
25.0f*
10.Of;Random SpeedOnZAxis//Setparticle[loop].xg=O.Of;Horizontal PullTo Zero//Setparticle[loop].yg—
0.8f;Vertical PullDownward//Setparticle[loop].zg=O.Of;Pull OnZAxisTo ZeroreturnTRUE;//Initialization WentOKint DrawGLSceneGLvoid//Here*s WhereWe DoAllTheDrawing//Clear ScreenAnd DepthBufferglClearGL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT;glLoadldentityO;//Reset TheModelView Matrixforloop=0;loopMAX_PARTICLES;loop++//Loop ThroughAllTheParticlesif particle[loop].active//IfTheParticle IsActivefloat x=particle[loop].x;//Grab OurParticle XPositionfloat y=particle[loop].y;//Grab OurParticle YPositionfloatz=particle[loop].z+zoom;//Particle ZPos+Zoom//Draw TheParticle UsingOur RGBValues,Fade TheParticle BasedOn ItsLifeglColor4fparticle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life;glBeginGL_TRIANGLE_STRIP;//Build QuadFrom ATriangle StripglTexCoord2d1,1;glVertex3fx+
0.5f,y+
0.5f,z;//Top RightglTexCoord2d0,1;glVertex3fx-
0.5f,y+
0.5f,z;//Top LeftglTexCoord2d1,0;〃glVertex3fx+
0.5f,y-
0.5f,z;Bottom RightglTexCoord2d0,0;glVertex3fx-
0.5f,y-
0.5f,z;//Bottom LeftglEnd;//Done BuildingTriangle Strip//Move OnThe XAxis ByX Speedparticle[loop].x4-=particle[loop].xi/slowdown^l000;//Move OnThe YAxis ByY Speedparticlelloop].y+=particle|loop].y slowdown*1000;//Move OnThe ZAxis ByZ Speedparticle[loop].z+=particle[loop].zi/slowdown*1000;particle[loop].xi+=particle[loop].xg;//Take PullOnXAxis IntoAccount//particle[loop].yi+=particle[loop].yg;Take PullOnYAxis IntoAccount//particle[loop].zi+=particlefloop].zg;Take PullOnZAxis IntoAccountparticle[loop].life-=particle[loop].fade;//Reduce ParticlesLife ByFade1if particle[loop].lifeO.Of//If ParticleIs BurnedOutparticle!loop].life=l.Of;//Give ItNew Life//Random FadeValueparticle[loop].fade=floatrand%100/
1000.0f+
0.003f;particle[loop].x=O.Of;//Center OnXAxisparticle[loop].y=O.Of;//Center OnYAxis。