DirectX 9 Graphics: ® The Definitive Guide to Direct3D ® Alan Thorn Wordware Publishing, Inc. LibraryofCongressCataloging-in-PublicationData Thorn,Alan. DirectX9graphics:thedefinitiveguidetoDirect3D/byAlanThorn. p. cm. Includesbibliographicalreferencesandindex. ISBN-13:978-1-55622-229-7 ISBN-10:1-55622-229-7(pbk.) 1. Computergraphics.2. DirectX. I.Title. T385.T495762005 006.6'93--dc22 2005003234 CIP ©2005,WordwarePublishing,Inc. AllRightsReserved 2320LosRiosBoulevard Plano,Texas75074 Nopartofthisbookmaybereproducedinanyformorby anymeanswithoutpermissioninwritingfrom WordwarePublishing,Inc. PrintedintheUnitedStatesofAmerica ISBN-13:978-1-55622-229-7 ISBN-10:1-55622-229-7 10 9 8 7 6 5 4 3 2 1 0503 DirectXandDirect3DareregisteredtrademarksofMicrosoftCorporationintheUnitedStatesand/orothercountries. Otherbrandnamesandproductnamesmentionedinthisbookaretrademarksorservicemarksoftheirrespective companies.Anyomissionormisuse(ofanykind)ofservicemarksortrademarksshouldnotberegardedasintentto infringeonthepropertyofothers.Thepublisherrecognizesandrespectsallmarksusedbycompanies,manufacturers,and developersasameanstodistinguishtheirproducts. Thisbookissoldasis,withoutwarrantyofanykind,eitherexpressorimplied,respectingthecontentsofthisbookand anydisksorprogramsthatmayaccompanyit,includingbutnotlimitedtoimpliedwarrantiesforthebook’squality, performance,merchantability,orfitnessforanyparticularpurpose.NeitherWordwarePublishing,Inc.noritsdealersor distributorsshallbeliabletothepurchaseroranyotherpersonorentitywithrespecttoanyliability,loss,ordamagecaused orallegedtohavebeencauseddirectlyorindirectlybythisbook. AllinquiriesforvolumepurchasesofthisbookshouldbeaddressedtoWordwarePublishing, Inc.,attheaboveaddress.Telephoneinquiriesmaybemadebycalling: (972)423-0090 ToJeanandBillMills,PeterThorn,andReginaldStokes This page intentionally left blank. Contents Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . xi Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii Chapter1 GettingStartedwithDirectX. . . . . . . . . . . . . . . . . 1 WhatIsDirectX? . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 AMorePreciseDefinitionofDirectX . . . . . . . . . . . . . . . . 4 ObtainingDirectX. . . . . . . . . . . . . . . . . . . . . . . . . . . 5 InstallingDirectX . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 ConfiguringDirectX. . . . . . . . . . . . . . . . . . . . . . . . . . 6 ExploringDirectX. . . . . . . . . . . . . . . . . . . . . . . . . . . 7 DirectXUtilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Chapter2 StartingDirectX—YourFirstProgram . . . . . . . . . . . 15 GettingStarted . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Step1—CreateaWindow . . . . . . . . . . . . . . . . . . . . . 17 Step2—CreateaDirect3DObject. . . . . . . . . . . . . . . . . 19 Step3—CreateaDirect3DDevice. . . . . . . . . . . . . . . . . 20 CreatingaDevice . . . . . . . . . . . . . . . . . . . . . . . . 21 MoreonDirect3DDevices . . . . . . . . . . . . . . . . . . . 27 Step4—ConfiguretheMessageLoop. . . . . . . . . . . . . . . 28 TheGameLoop . . . . . . . . . . . . . . . . . . . . . . . . . 29 Step5—RenderandDisplayaScene . . . . . . . . . . . . . . . 30 Direct3DSurfaces—IDirect3DSurface9. . . . . . . . . . . . 31 PreparingtoPresentaScene . . . . . . . . . . . . . . . . . . 32 BeginningandEndingaScene . . . . . . . . . . . . . . . . . 34 Step6—ShutDownDirect3D . . . . . . . . . . . . . . . . . . . 36 MoreonSurfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 37 CreatingSurfaces . . . . . . . . . . . . . . . . . . . . . . . . 37 LoadingImagesontoSurfaces. . . . . . . . . . . . . . . . . . 40 CopyingSurfaces . . . . . . . . . . . . . . . . . . . . . . . . 42 PresentingImageswiththeBackBuffer . . . . . . . . . . . . 44 LostDevices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 v Contents Chapter3 3DMathematics. . . . . . . . . . . . . . . . . . . . . . 51 CoordinateSystems . . . . . . . . . . . . . . . . . . . . . . . . . 52 One-Dimensional(1D)CoordinateSystems . . . . . . . . . . 52 Two-Dimensional(2D)CoordinateSystems . . . . . . . . . . 53 Moreon2DCoordinateSystems . . . . . . . . . . . . . . . . 54 Three-Dimensional(3D)CoordinateSystems . . . . . . . . . 56 GeometricTransformations . . . . . . . . . . . . . . . . . . . . . 57 Translation. . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Scaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Vectors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 LengthoftheDiagonal(Magnitude). . . . . . . . . . . . . . . 63 VectorAddition. . . . . . . . . . . . . . . . . . . . . . . . . . 64 VectorSubtraction. . . . . . . . . . . . . . . . . . . . . . . . 65 VectorMultiplication. . . . . . . . . . . . . . . . . . . . . . . 66 VectorNormalization . . . . . . . . . . . . . . . . . . . . . . 67 VectorDotProduct . . . . . . . . . . . . . . . . . . . . . . . 67 VectorCrossProduct . . . . . . . . . . . . . . . . . . . . . . 68 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 MatrixComponents . . . . . . . . . . . . . . . . . . . . . . . 71 MatrixAddition . . . . . . . . . . . . . . . . . . . . . . . . . 72 MatrixSubtraction. . . . . . . . . . . . . . . . . . . . . . . . 72 MatrixMultiplication(Scalar) . . . . . . . . . . . . . . . . . . 72 MatrixbyMatrixMultiplication. . . . . . . . . . . . . . . . . 73 IdentityMatrix. . . . . . . . . . . . . . . . . . . . . . . . . . 74 InverseMatrix. . . . . . . . . . . . . . . . . . . . . . . . . . 75 MatricesforGeometricTransformations . . . . . . . . . . . . . . 76 MatrixTranslation. . . . . . . . . . . . . . . . . . . . . . . . 76 MatrixRotation . . . . . . . . . . . . . . . . . . . . . . . . . 78 MatrixScaling . . . . . . . . . . . . . . . . . . . . . . . . . . 81 CombiningTransformations. . . . . . . . . . . . . . . . . . . 82 Planes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 CreatingPlanesfromThreePoints . . . . . . . . . . . . . . . 84 CreatingPlanesfromPointandNormal. . . . . . . . . . . . . 85 ClassifyingPointsin3DUsingPlanes. . . . . . . . . . . . . . 86 PlaneandLineIntersection . . . . . . . . . . . . . . . . . . . 87 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Chapter4 Direct3Dfor3DGraphics . . . . . . . . . . . . . . . . . 91 GettingStarted . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 CreateandDefineaVertexFormat . . . . . . . . . . . . . . . . . 93 UsingVertices . . . . . . . . . . . . . . . . . . . . . . . . . . 94 CreateaVertexBuffer. . . . . . . . . . . . . . . . . . . . . . . . 95 FilltheVertexBuffer . . . . . . . . . . . . . . . . . . . . . . 97 RenderingtheTriangle . . . . . . . . . . . . . . . . . . . . . . . 99 View,Projection,andTransformMatrices. . . . . . . . . . . . 99 vi Contents TransformationMatrix . . . . . . . . . . . . . . . . . . 100 ViewMatrix . . . . . . . . . . . . . . . . . . . . . . . 102 ProjectionMatrix. . . . . . . . . . . . . . . . . . . . . 103 SettingtheStreamSource . . . . . . . . . . . . . . . . . . . 104 SettingtheFVF . . . . . . . . . . . . . . . . . . . . . . . . 106 DrawingaPrimitive . . . . . . . . . . . . . . . . . . . . . . 106 AnimatingtheTriangle. . . . . . . . . . . . . . . . . . . . . . . 109 DrawingOtherPrimitives . . . . . . . . . . . . . . . . . . . . . 109 IndexedPrimitives . . . . . . . . . . . . . . . . . . . . . . . . . 111 SettingUpIndexBuffers. . . . . . . . . . . . . . . . . . . . 113 DrawingIndexedPrimitives . . . . . . . . . . . . . . . . . . 115 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Chapter5 Materials,Lights,andTextures . . . . . . . . . . . . . . 119 Lighting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 TurningtheLightsOnandOff . . . . . . . . . . . . . . . . . 121 MoreonLights. . . . . . . . . . . . . . . . . . . . . . . . . 122 SettingtheAmbientLighting . . . . . . . . . . . . . . 122 GettingStartedwithDirectLights. . . . . . . . . . . . 123 Direct3DShadingModes. . . . . . . . . . . . . . . . . . . . 123 Materials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 DirectLightingTypes . . . . . . . . . . . . . . . . . . . . . . . 126 Textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 CreatingTextures . . . . . . . . . . . . . . . . . . . . . . . 132 CreatingBlankTextures . . . . . . . . . . . . . . . . . 132 CreatingTexturesfromImageFiles . . . . . . . . . . . 134 TextureMapping . . . . . . . . . . . . . . . . . . . . . . . . 135 SettingtheActiveTexture . . . . . . . . . . . . . . . . . . . 137 TextureFiltering . . . . . . . . . . . . . . . . . . . . . . . . 138 TextureAddressingModes. . . . . . . . . . . . . . . . . . . 141 TextureAlphaBlending . . . . . . . . . . . . . . . . . . . . 144 2DTexturing . . . . . . . . . . . . . . . . . . . . . . . . . . 145 ID3DXSprite—DrawingTexturesin2D . . . . . . . . . . . . . 147 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Chapter6 XFiles—LoadingandSavingData. . . . . . . . . . . . 151 IntroductiontoXFiles . . . . . . . . . . . . . . . . . . . . . . . 152 StructuralOverview . . . . . . . . . . . . . . . . . . . . . . . . 154 Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 DataObjects . . . . . . . . . . . . . . . . . . . . . . . . . . 156 ParentandChildObjects. . . . . . . . . . . . . . . . . . . . 157 DataObjectsandReferences. . . . . . . . . . . . . . . . . . 157 StandardTemplates. . . . . . . . . . . . . . . . . . . . . . . . . 159 CustomTemplates . . . . . . . . . . . . . . . . . . . . . . . . . 169 ReadingXFilesUsingDirectX. . . . . . . . . . . . . . . . . . . 170 vii Contents Preparing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 RegisteringTemplates . . . . . . . . . . . . . . . . . . . . . 171 OpeningaFile . . . . . . . . . . . . . . . . . . . . . . . . . 173 EnumeratingTopObjects . . . . . . . . . . . . . . . . . . . 174 EnumeratingChildObjects. . . . . . . . . . . . . . . . . . . 175 ProcessingChildObjects. . . . . . . . . . . . . . . . . . . . 176 EnumerationOverview . . . . . . . . . . . . . . . . . . . . 176 GettingObjectData . . . . . . . . . . . . . . . . . . . . . . 178 ObjectNames. . . . . . . . . . . . . . . . . . . . . . . 178 ObjectTypes . . . . . . . . . . . . . . . . . . . . . . . 179 ObjectData. . . . . . . . . . . . . . . . . . . . . . . . 181 SavingDatatoXFiles—SaveObject. . . . . . . . . . . . . . . 182 Preparing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 SavingData. . . . . . . . . . . . . . . . . . . . . . . . . . . 184 BuildingtheTree. . . . . . . . . . . . . . . . . . . . . . . . 185 CommittingtheData. . . . . . . . . . . . . . . . . . . . . . 186 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Chapter7 Meshes . . . . . . . . . . . . . . . . . . . . . . . . . 187 WhatAreMeshes?. . . . . . . . . . . . . . . . . . . . . . . . . 188 HowtoMakeMeshes . . . . . . . . . . . . . . . . . . . . . . . 188 HowtoExportMeshes. . . . . . . . . . . . . . . . . . . . . . . 189 TestingYourMesh . . . . . . . . . . . . . . . . . . . . . . . . . 190 MeshesinDirect3D . . . . . . . . . . . . . . . . . . . . . . . . 191 LoadingMeshesfromXFiles . . . . . . . . . . . . . . . . . 191 LoadingMeshesfromXFileDataObjects. . . . . . . . . . . 193 MeshMaterialsandTextures . . . . . . . . . . . . . . . . . 196 RenderingMeshes . . . . . . . . . . . . . . . . . . . . . . . 199 CleaningUpMeshes . . . . . . . . . . . . . . . . . . . . . . 200 MoreonMeshes . . . . . . . . . . . . . . . . . . . . . . . . . . 201 MeshesandVertexBuffers . . . . . . . . . . . . . . . . . . 201 MeshesandFVFs . . . . . . . . . . . . . . . . . . . . . . . 202 BoundingBoxesandSpheres . . . . . . . . . . . . . . . . . . . 204 RaysIntersectingMeshes . . . . . . . . . . . . . . . . . . . . . 209 VertexInterpolation . . . . . . . . . . . . . . . . . . . . . . . . 212 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Chapter8 Cameras—First-PersonandMore . . . . . . . . . . . . 215 TheProblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 LookingAround . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Pitch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Roll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Yaw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 CombiningRotations. . . . . . . . . . . . . . . . . . . . . . . . 220 MovingtheCamera . . . . . . . . . . . . . . . . . . . . . . . . 221 viii Contents MakingtheCamera. . . . . . . . . . . . . . . . . . . . . . . . . 222 InitializingtheCameraClass. . . . . . . . . . . . . . . . . . 223 MovingtheCamera. . . . . . . . . . . . . . . . . . . . . . . 223 RotatingtheCamera . . . . . . . . . . . . . . . . . . . . . . 224 BuildingtheViewMatrix. . . . . . . . . . . . . . . . . . . . 225 TestDrive. . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 ViewingFrustum. . . . . . . . . . . . . . . . . . . . . . . . . . 229 ConstructingtheFrustum . . . . . . . . . . . . . . . . . . . 230 TestingforaPoint . . . . . . . . . . . . . . . . . . . . . . . 232 TestingforaCube . . . . . . . . . . . . . . . . . . . . . . . 232 TestingforaSphere . . . . . . . . . . . . . . . . . . . . . . 234 TestingforaMesh . . . . . . . . . . . . . . . . . . . . . . . 234 Chapter9 TimingandAnimation . . . . . . . . . . . . . . . . . . 237 Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 KeyframeAnimation . . . . . . . . . . . . . . . . . . . . . . . . 240 HierarchicalAnimation. . . . . . . . . . . . . . . . . . . . . . . 242 LinkedLists . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 AddingItemstotheList . . . . . . . . . . . . . . . . . . . . 244 ClearingaLinkedList . . . . . . . . . . . . . . . . . . . . . 245 ObjectHierarchiesforAnimations. . . . . . . . . . . . . . . . . 245 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Chapter10 PointSpritesandParticleSystems. . . . . . . . . . . . . 249 ParticleSystemsOverview . . . . . . . . . . . . . . . . . . . . 249 ParticlesinDirect3D—PointSprites. . . . . . . . . . . . . . . 250 CreatingPointSprites . . . . . . . . . . . . . . . . . . . . . . . 251 RenderingPointSprites . . . . . . . . . . . . . . . . . . . . . . 253 ParticleSystems . . . . . . . . . . . . . . . . . . . . . . . . . . 254 CreatingaParticleSystem. . . . . . . . . . . . . . . . . . . . . 256 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Chapter11 PlayingVideoandAnimatingTextures . . . . . . . . . . 261 PlayingVideoUsingDirectShow. . . . . . . . . . . . . . . . . . 261 The1,2,3ofPlayingaFile. . . . . . . . . . . . . . . . . . . 262 CreatingtheFilterGraph . . . . . . . . . . . . . . . . 262 MediaControlandEventSystem . . . . . . . . . . . . 263 LoadingaMediaFile. . . . . . . . . . . . . . . . . . . 263 ConfiguringEvents. . . . . . . . . . . . . . . . . . . . . . . 264 PlayingaFile . . . . . . . . . . . . . . . . . . . . . . . . . . 268 PlayingVideo—FurtherInformation . . . . . . . . . . . . . . . 269 AnimatingTextures. . . . . . . . . . . . . . . . . . . . . . . . . 270 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 ix
Description: