Direct3D.ShaderX.Vertex.and.Pixel.Shader.Tips.and.Tricks
文件大小: 10514k
源码售价: 10 个金币 积分规则     积分充值
资源说明:Contents Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Part 1: Introduction to Shader Programming Fundamentals of Vertex Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Wolfgang F. Engel What You Need to Know/Equipment . . . . . . . . . . . . . . . . . . . . . . . . . 5 Vertex Shaders in the Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Why Use Vertex Shaders? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Vertex Shader Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 NVIDIA Effects Browser 2/3 . . . . . . . . . . . . . . . . . . . . . . . . . . 8 NVIDIA Shader Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Shader City . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Vertex Shader Assembler. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 NVIDIA NVASM — Vertex and Pixel Shader Macro Assembler . . . . 10 Microsoft Vertex Shader Assembler . . . . . . . . . . . . . . . . . . . 11 Shader Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 NVLink 2.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 NVIDIA Photoshop Plug-ins. . . . . . . . . . . . . . . . . . . . . . . . . . 13 Diffusion Cubemap Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 DLL Detective with Direct3D Plug-in . . . . . . . . . . . . . . . . . . . . . 15 3D Studio Max 4.x/gmax 1.1. . . . . . . . . . . . . . . . . . . . . . . . . . 16 Vertex Shader Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 High-Level View of Vertex Shader Programming . . . . . . . . . . . . . . . . . . 18 Check for Vertex Shader Support . . . . . . . . . . . . . . . . . . . . . . . 19 Vertex Shader Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Set the Vertex Shader Constant Registers . . . . . . . . . . . . . . . . . . . 22 Write and Compile a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . 22 Application Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Complex Instructions in the Vertex Shader. . . . . . . . . . . . . . . . 27 Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Swizzling and Masking . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Guidelines for Writing Vertex Shaders . . . . . . . . . . . . . . . . . . 32 Compiling a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . 33 Create a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Set a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Free Vertex Shader Resources . . . . . . . . . . . . . . . . . . . . . . . . . 35 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 What Happens Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 iii Team LRN Programming Vertex Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Wolfgang F. Engel RacorX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 The Common Files Framework . . . . . . . . . . . . . . . . . . . . . . . . 40 Check for Vertex Shader Support. . . . . . . . . . . . . . . . . . . . . 42 Vertex Shader Declaration . . . . . . . . . . . . . . . . . . . . . . . . 42 Set the Vertex Shader Constant Registers . . . . . . . . . . . . . . . . 43 The Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Compile a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . 45 Create a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Set a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Free Vertex Shader Resources . . . . . . . . . . . . . . . . . . . . . . 47 Non-Shader Specific Code . . . . . . . . . . . . . . . . . . . . . . . . 47 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 RacorX2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Create a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 RacorX3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Vertex Shader Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Set the Vertex Shader Constant Registers . . . . . . . . . . . . . . . . . . . 54 The Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Directional Light . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Diffuse Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 RacorX4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Vertex Shader Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Set the Vertex Shader Constants . . . . . . . . . . . . . . . . . . . . . . . . 60 The Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Specular Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Non-Shader Specific Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 RacorX5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Point Light Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Light Attenuation for Point Lights . . . . . . . . . . . . . . . . . . . . . . . 66 Set the Vertex Shader Constants . . . . . . . . . . . . . . . . . . . . . . . . 67 The Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 What Happens Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Fundamentals of Pixel Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Wolfgang F. Engel Why Use Pixel Shaders? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Pixel Shaders in the Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Pixel Shader Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Microsoft Pixel Shader Assembler. . . . . . . . . . . . . . . . . . . . . . . 79 MFC Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 iv Contents Team LRN ATI ShadeLab. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Pixel Shader Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Constant Registers (c0-c7) . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Output and Temporary Registers (ps.1.1-ps.1.3: r0+r1; ps.1.4: r0-r5) . . . . 82 Texture Registers (ps.1.1-ps.1.3: t0-t3; ps.1.4: t0-t5) . . . . . . . . . . . . . 82 Color Registers (ps.1.1-ps.1.4: v0+v1) . . . . . . . . . . . . . . . . . . . . 83 Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 High-Level View of Pixel Shader Programming . . . . . . . . . . . . . . . . . . 84 Check for Pixel Shader Support . . . . . . . . . . . . . . . . . . . . . . . . 84 Set Texture Operation Flags (D3DTSS_* flags). . . . . . . . . . . . . . . . 85 Set Texture (with SetTexture()) . . . . . . . . . . . . . . . . . . . . . . . . 86 Define Constants (with SetPixelShaderConstant()/def ) . . . . . . . . . . . 86 Pixel Shader Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Texture Address Instructions . . . . . . . . . . . . . . . . . . . . . . . 88 Arithmetic Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 101 Instruction Modifiers . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Instruction Modifiers . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Instruction Pairing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Assemble Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Create a Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Set Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Free Pixel Shader Resources . . . . . . . . . . . . . . . . . . . . . . . . . 121 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 What Happens Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Programming Pixel Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Wolfgang F. Engel RacorX6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Check for Pixel Shader Support . . . . . . . . . . . . . . . . . . . . . . . 126 Set Texture Operation Flags (with D3DTSS_* flags) . . . . . . . . . . . . 126 Set Texture (with SetTexture()) . . . . . . . . . . . . . . . . . . . . . . . . 127 Define Constants (with SetPixelShaderConstant()/def) . . . . . . . . . . . 127 Pixel Shader Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Per-Pixel Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Assemble Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Create Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Set Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Free Pixel Shader Resources . . . . . . . . . . . . . . . . . . . . . . . . . 136 Non-Shader Specific Code . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 RacorX7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Define Constants (with SetPixelShaderConstant()/def) . . . . . . . . . . . 137 Pixel Shader Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 RacorX8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Set Texture Operation Flags (with D3DTSS_* flags) . . . . . . . . . . . . 140 Contents v Team LRN Set Texture (with SetTexture()) . . . . . . . . . . . . . . . . . . . . . . . . 140 Pixel Shader Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 RacorX9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Basic Shader Development with Shader Studio . . . . . . . . . . . . . . . . . . 149 John Schwab Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 What You Should Know . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Coordinate Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Default Light . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Create a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Step 1: Loading a Mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Step 2: Transformations. . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Step 3: Starting a Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Step 4: Editing Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Step 5: Adding Some Color. . . . . . . . . . . . . . . . . . . . . . . . . . 155 Step 6: Saving Your Work . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Step 7: Loading a Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . 156 Step 8: Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Step 9: Texture Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Create a Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Step 1: Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Step 2: Writing a Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . 159 Shaders Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Menu Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Shaders Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Constant Properties Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Materials Dialog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Textures Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Transformations Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Light . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 vi Contents Team LRN Camera. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Statistics Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Settings Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 State Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Camera Projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Configure Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Further Info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Part 2: Vertex Shader Tricks Vertex Decompression in a Shader . . . . . . . . . . . . . . . . . . . . . . . . 172 Dean Calver Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Vertex Compression Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Vertex Shader Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Compressed Vertex Stream Declaration Example . . . . . . . . . . . . . . . . . 174 Basic Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Quantization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Decompression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Practical Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Scaled Offset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Decompression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Practical Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Compression Transform. . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Decompression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Practical Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Optimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Practical Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Advanced Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Multiple Compression Transforms . . . . . . . . . . . . . . . . . . . . . . 180 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Decompression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Practical Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Sliding Compression Transform . . . . . . . . . . . . . . . . . . . . . . . 182 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Decompression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Displacement Maps and Vector Fields . . . . . . . . . . . . . . . . . . . . 184 Basic Displacement Maps . . . . . . . . . . . . . . . . . . . . . . . . 184 Entering Hyperspace . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Contents vii Team LRN Shadow Volume Extrusion Using a Vertex Shader. . . . . . . . . . . . . . . . . 188 Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Creating Shadow Volumes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Effect File Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Using Shadow Volumes with Character Animation . . . . . . . . . . . . . . . . 192 Character Animation with Direct3D Vertex Shaders . . . . . . . . . . . . . . . . 195 David Gosselin Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Tweening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Skinning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Skinning and Tweening Together . . . . . . . . . . . . . . . . . . . . . . . 199 Animating Tangent Space for Per-Pixel Lighting . . . . . . . . . . . . . . . . . 202 Per-Pixel Lighting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Lighting a Single-Surface Object. . . . . . . . . . . . . . . . . . . . . . . . . . 209 Greg James Vertex Shader Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Enhanced Lighting for Thin Objects . . . . . . . . . . . . . . . . . . . . . . . . 213 About the Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Optimizing Software Vertex Shaders . . . . . . . . . . . . . . . . . . . . . . . 215 Kim Pallister Introduction to Pentium 4 Processor Architecture . . . . . . . . . . . . . . . . . 216 Introduction to the Streaming SIMD Extensions . . . . . . . . . . . . . . . . . 217 Optimal Data Arrangement for SSE Instruction Usage . . . . . . . . . . . . . . 218 How the Vertex Shader Compiler Works . . . . . . . . . . . . . . . . . . . . . . 220 Performance Expectations . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Optimization Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Write Only the Results You’ll Need. . . . . . . . . . . . . . . . . . . 221 Use Macros Whenever Possible . . . . . . . . . . . . . . . . . . . . 222 Squeeze Dependency Chains . . . . . . . . . . . . . . . . . . . . . . 222 Write Final Arithmetic Instructions Directly to Output Registers . . . 223 Reuse the Same Temporary Register If Possible . . . . . . . . . . . . 223 Don’t Implicitly Saturate Color and Fog Values . . . . . . . . . . . . 223 Use the Lowest Acceptable Accuracy with exp and log Functions. . . 223 Avoid Using the Address Register When Possible . . . . . . . . . . . 223 Try to Order Vertices . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Profile, Profile, Profile… . . . . . . . . . . . . . . . . . . . . . . . . 224 A Detailed Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 viii Contents Team LRN Compendium of Vertex Shader Tricks . . . . . . . . . . . . . . . . . . . . . . . 228 Scott Le Grand Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Periodic Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 One-Shot Effect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 Random Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 Flow Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Cross Products. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Perlin Noise and Returning Results from Shader Programs . . . . . . . . . . . 232 Steven Riddle and Oliver C. Zecha Limitations of Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Perlin Noise and Fractional Brownian Motion . . . . . . . . . . . . . . . . . . . 234 Final Thoughts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 Part 3: Pixel Shader Tricks Blending Textures for Terrain . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Alex Vlachos Image Processing with 1.4 Pixel Shaders in Direct3D. . . . . . . . . . . . . . . 258 Jason L. Mitchell Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Simple Transfer Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Black and White Transfer Function . . . . . . . . . . . . . . . . . . . . . 260 Sepia Tone Transfer Function. . . . . . . . . . . . . . . . . . . . . . . . . 260 Heat Signature. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Filter Kernels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Texture Coordinates for Filter Kernels . . . . . . . . . . . . . . . . . . . . 261 Edge Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Roberts Cross Gradient Filters . . . . . . . . . . . . . . . . . . . . . . . . 262 Sobel Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Mathematical Morphology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 The Definition of Dilation . . . . . . . . . . . . . . . . . . . . . . . . . . 265 A Dilation Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 The Definition of Erosion. . . . . . . . . . . . . . . . . . . . . . . . . . . 267 An Erosion Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Hardware Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Contents ix Team LRN Hallo World — Font Smoothing with Pixel Shaders. . . . . . . . . . . . . . . . 270 Steffen Bendel Emulating Geometry with Shaders — Imposters . . . . . . . . . . . . . . . . . 273 Steffen Bendel Smooth Lighting with ps.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Steffen Bendel Per-Pixel Fresnel Term . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Fresnel Effects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Effect Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Diffuse Cube Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Using Diffuse Cube Maps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Generating Dynamic Diffuse Cube Maps . . . . . . . . . . . . . . . . . . . . . 288 Accurate Reflections and Refractions by Adjusting for Object Distance . . . . . 290 Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 The Artifacts of Environment Mapping . . . . . . . . . . . . . . . . . . . . . . 290 UV Flipping Technique to Avoid Repetition . . . . . . . . . . . . . . . . . . . . 295 Alex Vlachos Photorealistic Faces with Vertex and Pixel Shaders . . . . . . . . . . . . . . . 296 Kenneth L. Hurley Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 3D Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Setup for Separation of Lighting Elements. . . . . . . . . . . . . . . . . . 298 Diffuse Lighting Component . . . . . . . . . . . . . . . . . . . . . . . . . 298 Extracting the Bump and Specular Map . . . . . . . . . . . . . . . . . . . 299 Separating Specular and Bump Maps . . . . . . . . . . . . . . . . . . . . 299 Normal Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 More on Normal Maps . . . . . . . . . . . . . . . . . . . . . . . . . 301 A Word About Optimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Half Angle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 Vertex Shader Explanation Pass 1 (Listing 1) . . . . . . . . . . . . . . . . 303 Vertex Shader Explanation Pass 1 (Listing 2) . . . . . . . . . . . . . . . . 305 Pixel Shader Explanation (Listing 3) . . . . . . . . . . . . . . . . . . . . . 307 x Contents Team LRN Full Head Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Mapping the Photographs . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Creating a Single Texture Map . . . . . . . . . . . . . . . . . . . . . . . . 310 Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 Environmental Lighting. . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 How to Get Diffusion Cube Maps. . . . . . . . . . . . . . . . . . . . 312 Generating the Cube Maps . . . . . . . . . . . . . . . . . . . . . . . 313 The Pixel Shader to Use All These Maps . . . . . . . . . . . . . . . . 314 Environment Mapping for Eyes. . . . . . . . . . . . . . . . . . . . . . . . . . . 315 Final Result . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Facial Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 Non-Photorealistic Rendering with Pixel and Vertex Shaders . . . . . . . . . . 319 Drew Card and Jason L. Mitchell Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Rendering Outlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Cartoon Lighting Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 Hatching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 Gooch Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Image Space Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 Compositing the Edges . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 Depth Precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Alpha Test for Efficiency . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Shadow Outlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Thickening Outlines with Morphology . . . . . . . . . . . . . . . . . . . . 332 Summary of Image Space Technique. . . . . . . . . . . . . . . . . . . . . 332 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Animated Grass with Pixel and Vertex Shaders . . . . . . . . . . . . . . . . . . 334 John Isidoro and Drew Card Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Waving the Grass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Lighting the Grass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Texture Perturbation Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 John Isidoro, Guennadi Riguer, and Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Wispy Clouds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Perturbation-Based Fire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 Plasma Glass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Contents xi Team LRN Rendering Ocean Water . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 John Isidoro, Alex Vlachos, and Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Sinusoidal Perturbation in a Vertex Shader. . . . . . . . . . . . . . . . . . . . . 348 CMEMBM Pixel Shader with Fresnel Term . . . . . . . . . . . . . . . . . . . . 350 Ocean Water Shader Source Code . . . . . . . . . . . . . . . . . . . . . . . . . 352 Sample Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 Rippling Reflective and Refractive Water . . . . . . . . . . . . . . . . . . . . . 357 Alex Vlachos, John Isidoro, and Chris Oat Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 Generating Reflection and Refraction Maps . . . . . . . . . . . . . . . . . . . . 358 Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 Crystal/Candy Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 John Isidoro and David Gosselin Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 Bubble Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 John Isidoro and David Gosselin Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Per-Pixel Strand-Based Anisotropic Lighting . . . . . . . . . . . . . . . . . . . 376 John Isidoro and Chris Brennan Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 Strand-Based Illumination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 Rendering Using the Texture Lookup Table . . . . . . . . . . . . . . . . . 377 Per-Pixel Strand-Based Illumination . . . . . . . . . . . . . . . . . . . . . . . . 378 Per-Pixel Strand-Based Illumination with Colored Light and Base Map . . 379 Per-Pixel Strand-Based Illumination with Four Colored Lights and Base Map in One Pass . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 Per-Pixel Bump-Mapped Strand-Based Illumination Using Gram-Schmidt Orthonormalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 xii Contents Team LRN A Non-Integer Power Function on the Pixel Shader . . . . . . . . . . . . . . . . 383 Philippe Beaudoin and Juan Guardado Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 Traditional Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 Texture Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 Successive Multiplications . . . . . . . . . . . . . . . . . . . . . . . . . . 386 The Need for a New Trick . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Mathematical Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 Power Function on the Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . 391 Constant Exponent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 Per-Pixel Exponent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Smooth Conditional Function. . . . . . . . . . . . . . . . . . . . . . . . . 396 Volume Bounded Pixel Shader Effects . . . . . . . . . . . . . . . . . 398 Phong Shading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 Phong Equation with Blinn Half-Vector . . . . . . . . . . . . . . . . 400 Expressing the Inputs . . . . . . . . . . . . . . . . . . . . . . . . . . 400 The Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 Bump Mapped BRDF Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . 405 Ádám Moravánszky Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 Bidirectional Reflectance Distribution Functions . . . . . . . . . . . . . . . . . 406 Decomposing the Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 Reconstruction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 Adding the Bumps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 Real-Time Simulation and Rendering of Particle Flows. . . . . . . . . . . . . . 414 Daniel Weiskopf and Matthias Hopf Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 Ingredients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 How Does a Single Particle Move?. . . . . . . . . . . . . . . . . . . . . . . . . 416 Basic Texture Advection: How Do a Bunch of Particles Move? . . . . . . . . . 417 Inflow: Where are the Particles Born? . . . . . . . . . . . . . . . . . . . . . . . 421 How Can Particles Drop Out? . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 Contents xiii Team LRN Part 4: Using 3D Textures with Shaders 3D Textures and Pixel Shaders. . . . . . . . . . . . . . . . . . . . . . . . . . . 428 Evan Hart Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 3D Textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Storage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 Function of Three Independent Variables . . . . . . . . . . . . . . . . 430 Noise and Procedural Texturing. . . . . . . . . . . . . . . . . . . . . 431 Attenuation and Distance Measurement . . . . . . . . . . . . . . . . 432 Representation of Amorphous Volume . . . . . . . . . . . . . . . . . 435 Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 Volumetric Fog and Other Atmospherics. . . . . . . . . . . . . . . . . . . 435 Light Falloff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 Truly Volumetric Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Martin Kraus The Role of Volume Visualization . . . . . . . . . . . . . . . . . . . . . . . . . 438 Basic Volume Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 Animation of Volume Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 Rotating Volume Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . 441 Animated Transfer Functions . . . . . . . . . . . . . . . . . . . . . . . . . 441 Blending of Volume Graphics . . . . . . . . . . . . . . . . . . . . . . . . 442 High-Quality but Fast Volume Rendering . . . . . . . . . . . . . . . . . . . . . 444 Where to Go from Here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 Part 5: Engine Design with Shaders First Thoughts on Designing a Shader-Driven Game Engine . . . . . . . . . . . 450 Steffen Bendel Bump Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 Real-time Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 Use Detail Textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Use Anisotropic Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Split Up Rendering into Independent Passes . . . . . . . . . . . . . . . . . . . . 451 Use _x2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 xiv Contents Team LRN Visualization with the Krass Game Engine . . . . . . . . . . . . . . . . . . . . 453 Ingo Frick Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 General Structure of the Krass Engine . . . . . . . . . . . . . . . . . . . . . . . 453 Developmental History of the Rendering Component . . . . . . . . . . . . . . . 454 Previous Drawbacks of Hardware Development . . . . . . . . . . . . . . . . . . 455 Current Drawbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Ordering Effects in the Krass Engine . . . . . . . . . . . . . . . . . . . . . . . . 456 Application of the IMG Concept for Terrain Rendering . . . . . . . . . . . . . . 457 Particle Rendering to Exemplify a Specialized Effect Shader . . . . . . . . . . . 460 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 Designing a Vertex Shader-Driven 3D Engine for the Quake III Format . . . . . 463 Bart Sekura Quake III Arena Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463 Vertex Program Setup in the Viewer . . . . . . . . . . . . . . . . . . . . . . . . 464 Vertex Shader Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 Deformable Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 Texture Coordinate Generation . . . . . . . . . . . . . . . . . . . . . . . . 468 Texture Matrix Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . 469 Rendering Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。