Title: ppt title
1D3DX 8.1 Anuj GosaliaDevelopment
LeadDirectX Graphics Microsoft Corporation
2D3DX Releases
- Shipped D3DX 8.0 with DirectX 8.0 SDK
- D3DX 8.0b released to Web
- Bug fixes to D3DX 8.0, no new features
- D3DX 8.1
- Includes new features
- Now in Beta
3Overview Of D3DX 8.1
- Mesh Utilities
- Effect Framework
- Shader assemblers
- Texture Utilities
- Math Utilities
- Miscellaneous Utilities
- Authoring tool support
4Mesh Library
- Progressive meshes
- N-Patch tessellation
- Mesh optimization
- Skinned meshes
- Other mesh utilities
- Bounding volume generation (sphere, box)
- Ray intersections (mesh, sphere, box)
- Mesh cleanup
- More
5Mesh Basics
- Vertex Buffer, Index Buffer, and Attributes
- Indexed Triangle lists
- 16/32-bit indices supported
- Supports file I/O (via .X)
- Can be used independently of .X files
- DrawSubset is only for convenience
- Not the only way to draw a mesh
- Manipulates adjacency if requested
6Attributes Buffer? Table?
- Mesh has 1 DWORD per triangle (face)
- Stored in mesh object as Attribute Buffer
- Semantics of values is up to the app
- Need not be sequential
- Attribute Table
- A compact representation of the attribute buffer
- Generated by Attribute Sorting a mesh
- GetAttributeTable, no SetAttributeTable
7Mesh Rendering
- DrawSubset() draws all triangles of a given
attribute - Needs Attribute Table
- Else it does linear search per face
- Efficient if attributes are sequential, starting
from 0 - Else it does search of attribute table
- Uses Fixed Function FVF shader
- Avoid unless all above conditions met
8Mesh Adjacency In D3DX
- Many mesh operations require adjacency
- Array of 3 DWORDs per face
- Each DWORD is a face index
- 0xffffffff means no adjacent face
- All mesh operations that change adjacency will
optionally return updated adjacency - Load from .X returns adjacency
9Point Representatives
- Alternate way of encoding adjacency info
- Keeps track of vertices which have the same
position but replicated due to differing
attributes (like normals, tex coords, etc.) - One DWORD per vertex
- All vertices in a set of replicated vertices
point to any one of them as a representative - Non-replicated vertices point to themselves
10Meshes And Adjacency
- Can convert from PRep to adjacency and back
- Generating adjacency from scratch
- Can use identity Prep, ignoring duplicates
- Works in some cases
- GenerateAdjacecncy() will identify vertices with
same position (i.e., infer PRep) - Slower than above
- Will get correct adjacency if epsilon is
appropriate
11Remap Arrays
- Describes how mesh was rearranged
- 1 DWORD for each destination face / vertex
- Indicates which face / vertex of source it came
from - Many-to-one mapping possible
- Allows mesh related data outside mesh object to
be updated with the mesh
12Mesh Optimization
- Stripify
- Rearrange vertices of a mesh in strip order
- Vertex cache optimize
- Based on Hugues Hoppes Siggraph 99 paper
- Hardware specific optimization
- Both need adjacency information
- ConvertPointRepsToAdjacency with NULL (identity)
PRep array will suffice
13Mesh Optimization
- Attribute sort
- Sorts faces and vertices on the attribute ids
- Splits shared vertices if necessary
- Generates Attribute Table
- Compact Mesh
- Eliminates vertices not referred to by the index
array
14Sharing Vertex Buffers
- Typically Optimize re-arranges vertices and
indices - If vertices already ordered by attribute, src
dest mesh can share VBs - D3DXMESHOPT_SHAREVB
- Useful for clones and optimizing
15Offline cache optimization
- Best done at load time
- Algorithm is fast
- Default is Geforce 1,2
- Works well on all cards
- Optimize on above or card with no hardware TL
16Meshes and Tri-Strips
- D3DXConvertMeshSubsetToStrips
- D3DXConvertMeshSubsetToSingleStrip
- Returns new Index Buffer separate from the mesh
object - Works on any mesh
- Helps to optimize it for vertex cache or stripify
- May be a performance win in some specific cases
- Use OptimizeMesh sample to see what works best
17Progressive MeshesOverview
- Generate an ID3DXPMesh object from high
poly-count mesh using ID3DXSPMesh object - Done either offline or load time
- Render the ID3DXPMesh object at any LOD at
runtime - Generate a bunch of ID3DXMesh objects from
ID3DXPMesh object
18Progressive MeshesMesh Simplification
- Based on Garland-Heckbert quadric error metric
- Incorporates refinements by Hugues Hoppe to
accommodate normal and attribute space metrics - Needs accurate adjacency information
19Progressive MeshesMesh Simplification(2)
- API for simplification via ID3DXSPMesh object
- No more batch files
- Allows you to incorporate automated LOD
generation in your internal tools - User controls to influence simplification process
- Assigning weights to vertices
- Weighing the importance of various vertex
attributes
20Progressive MeshesHalf-edge collapses
- Chooses one of the two original vertices during
each edge collapse - No significant quality degradation
- Mesh vertices never change with LOD
- Enables mixing PM and mesh deformation algorithms
like morphing and skinning - Reduces the amount of information stored in a
vertex split record - LOD changes are faster
21Progressive MeshesDynamic LOD changes
- ID3DXPMesh object allows dynamic LOD changes to
arbitrary face/vertex counts - LOD changes are fast enough to do at runtime
- Modifies the index buffer and the adjacency
22Progressive MeshesCloning
- Support sharing the vertex data across clones
- Can clone multiple ID3DXMesh objects from a
progressive mesh, all of which share the same VB - Can even optimize the resultant mesh while
sharing the original VB
23Progressive MeshesPersistency
- Persist to IStream
- Can embed PMs in any custom file format
- ID3DXPMeshSave
- D3DXCreatePMeshFromStream
24Progressive MeshesOptimization
- PMesh face ordering may not be cache optimal
- Can at least make base mesh optimized
- ID3DXPMeshOptimizeBaseLOD
- Use multiple clones of PMesh with increasing
base LODs - ID3DXPMeshTrimByVertices
- ID3DXPMeshTrimByFaces
- Can share VB across clones
- Switch to PMesh with highest base LOD
25N-Patch Tessellation
- D3DX provides software N-Patch tessellation
- Uses adjacency to share vertices in tessellated
mesh - Assumes mesh is smooth
- Any sharp edges due to normal discontinuity will
cause cracks - Use D3DXWeldVertices to merge normals within
epsilon - Improved in D3DX 8.1 to make welding normals lot
easier
26Other Mesh Utilities
- Compute bounding box and sphere
- Compute normals
- Ray mesh intersection
- Returns triangle index and barycentric
coordinates of point of intersection if hit - Ray box and sphere intersection
- Clean-up topology for simplification
- Cloning for VB and IB format conversion
27Mesh Library Improvements
- D3DXSplitMesh
- Use to split large 32-bit meshes into multiple
16-bit meshes - Splits shared vertices
- Minimized if mesh is vertex cache optimized
- D3DXWeldVertices
- Takes per component epsilons
- Does partial welds
28Mesh Intersection
- Intersect ray with tri, mesh or mesh subset
- Returns face and barycentric coordinates of
intersection - Optionally returns list of all intersections
- Needs no precomputation
- Efficient algorithm for hit testing, etc
- Not efficient for too many intersections for the
same mesh
29Compute Tangent Space
- Create a per vertex coordinate system
- Normal define one axis
- Texture coordinate (u,v) gradients used to
orient tangents - Use u to define one tangent compute binorm by
cross product - Or use u v to define both tangents
30Compute Tangent Space (2)
- Mesh texture parameterizations can have
orientation flips - Cross product binormal can be reverse from v
space gradient in some parts - Solution Encode binormal sign per vertex
- Use 4D vector for encoding per-vertex tangent
- Put sign in 4th component
- Invert computed binormal in vertex shader
31Skinned Meshes
- Plug-ins for authoring tools to export skinning
data - 3D Studio Max and Character Studio
- Maya (work in progress)
- .X files extended to handle skinning data
- D3DX functions to load skinned meshes
- ID3DXSkinMesh independent of .X files
32Skinned Mesh Object
- Contains a mesh object plus skinning data
- Skinning data supplied as a bone and a list of
vertices it affects - And a weight corresponding to each vertex
- Though not hardware friendly, this input method
is simple and general - Can convert to optimized forms
33Skinning Technique 1
- Direct3D 7.0 style
- Per vertex weights
- Up to 4 bones (matrices) per triangle
- Or patch if using R/T-Patches
- ConvertToBlendedMesh generates a mesh with per
vertex weights - Can cause mesh to have many subsets
- Works with well N-Patch tessellation
34Skinning Technique 2
- Introduced in Direct3D 8.0
- Per vertex indices refer to matrices from a
palette that affect it - Up to 4 indices per vertex, 12 per face
- Up to 256 matrices in a palette
- Reduces API calls and matrix changes
- ConvertToIndexedBlendedMesh generates mesh with
per vertex weights and matrix indices
35Skinning Technique 3
- Software skinning in D3DX
- Arbitrary number of influences per vertex
- Useful for skinning curved surface control mesh
- Useful for accessing post skinned mesh data
- Hit testing skinned meshes
- GenerateSkinnedMesh() / UpdateSkinnedMesh() does
this
36ConvertToBlendedMesh
- Truncates bone influences when gt4 per triangle
exists - Keeps the 4 most important weights
- Uses adjacency info to avoid cracks
- Orders bone combinations by increasing of
influences - Enables using GeForces restricted skinned
support by rendering a prefix of the mesh in
hardware - Use software for the rest
37ConvertToIndexedBlended
- Will truncate if gt4 influences per vertex
- Handles palette sizes lt num bones
- But must be gt maxFaceInfl
- Partitions mesh into subsets that fit in a
palette - Output can be used with vertex shaders
- Output mesh has only necessary of weights
- Use Clone to pad extra weights if shader expects
fixed
38Skinning Performance
- Minimize of bone combinations?
- Can merge subset combinations
- Increases of blends
- Improve matrix coherence across combinations?
- Cant prevent extra DrawPrim calls
- Cant prevent matrix concatenation
- Does not seem worthwhile
39Skinning Performance (2)
- Non-hardware TL devices
- Indexed palette skinning using FF pipeline or
vertex shaders is best - On GeForce 1,2 and Radeon, non-indexed skinning
is fastest - On Geforce 3 indexed skinning using vertex shader
is fastest ? - Disclaimer Your mileage may vary
40SW Skinning Performace
- Skin on CPU instead of GPU
- CPU/GPU load balancing
- Multipass rendering
- 33 faster skinning in D3DX 8.1
- Consider using multiple streams
- Minimize data processed by CPU
41Skinning PMeshes
- Skinning causes mesh to be split into subsets,
adversely affecting simplification quality - Using Indexed skinning reduces subsets (1 if
palette size gt num bones) - Call ConvertTo and use result to create PMesh
42Simplification And Skinning
- Simplification ignores geometry changes due to
skinning - Default pose of mesh (figure mode?) may not be
best to simplify - Many joint (elbows, knees, etc.) are straight
- Geometric error when simplifying across joints
lower than would be when joint is bent - Choose some different pose for simplification
(How?)
43Skinning And NPatches
- Tessellating indices is messy
- Use software skinning of control point mesh
- Use only if hardware is doing full tessellation
- Use non-indexed skinning of tessellated mesh
- ConvertToBlendedMesh first
- Tessellate the result
- Update bone combination table with new attribute
table
44Call To Action
- Try out new features in DirectX 8.1
- Give us feedback
- Tell us about bugs and performance issues
- What else would you like to see?
- Hang around for the next talk
45Acknowledgements
- Thanks to Origin Systems for permission to use
Unicorn model - Thanks to NewTek for permission to use the
monster model
46Questions ?
47D3DX 8.1 Anuj GosaliaDevelopment
LeadDirectX Graphics Microsoft Corporation
48Overview Of D3DX 8.1
- Mesh Utilities
- Effect Framework
- Shader assemblers
- Texture Utilities
- Math Utilities
- Miscellaneous Utilities
- Authoring tool support
49Effect Framework
- Encapsulation of device state
- Enables scalable rendering techniques
- Allows controlled fallback
- Cant just switch to multi-pass
- Older hardware cant do more passes since alpha
blending fill rate is less - Helps rapid prototyping
- Runtime interpretation of text-based effect
definition
50Effect FrameworkFallback Techniques
- Uses controlled effect fallbacksEffect
- Technique
- Pass
- Implementation
- Simple text file (.fx) to define effects
51Effect FrameworkFallback Techniques
- Techniques are grouped by their quality or LOD
- Techniques can be chosen based on what hardware
creates successfully - Can test performance in back buffer
- User responsible for drawing geometry
52Effect FrameworkCreating Effects
- D3DXCompileEffectFromFile
- Parses text file
- D3DXCreateEffect
- Use compiled effect to create an effect object
- State for each pass is encoded as state blocks
53Effect Data types
- DWORD, FLOAT
- VECTOR, MATRIX
- TEXTURE
- VERTEXSHADER, PIXELSHADER
- STRING
- Enables user-data associated with effects
- Not used to program device state
54Parameterized Effects
- Effects can have parameters of various types
- Parameters augment static state description in
the .fx files - How (and which) parameters get used defined by
the effect
55Effect Improvemets
- Support for longer names
- No longer limited to FourCC
- Enable ordinal or string based parameter
resolution - Block comment / / support
- Merge ID3DXEffect and ID3DXTechnique
- Need to carry around only 1 pointer
- OnLost() and OnReset() methods
56Effect FrameworkShader Assemblies
- In-line or load from file
- Vertex
- D3DXAssembleVertexShader()
- D3DXAssembleVertexShaderFromFile()
- Pixel
- D3DXAssemblePixelShader()
- D3DXAssemblePixelShaderFromFile()
57Shape Library
- Regular polygon
- Box
- Cylinder/Cone
- Sphere
- Torus
- And, of course, the teapot
- Optional adjacency info available
582D Text
- Draw text to surface using GDI
- Render to off screen DC
- Blit to an internal texture
- Render using quad
- Cache output by rendering to a texture
- Supports all GDI features italics, kerning,
international fonts, etc. - ID3DXFontDrawText
59Dynamic 2D text
- Using GDI every time can be slow
- Render alphabet to a texture
- Render a quad per character
- Texture coordinates into the texture depend on
the character - Works well with simple fonts
- Not for international fonts, kerning, etc.
- CD3DFont in sample framework does this
603D Text
- D3DXCreateText
- Extrudes a string rendered using a TrueType font
- Returns a mesh object
- Does not handle
- Kerning, etc.
- International font spacing
61Sprites (not point sprites!)
- Draws image in a texture to screen
- Using a textured quad
- Alpha blending
- Rotation, scales
- Arbitrary transforms warps
- For performance
- Draw multiple sprites between Begin/End
- Draw mutiple sprites from same texture
62Rendering to Textures
- ID3DXRenderToSurface abstraction
- Begin
- Setup render targets, viewports
- Use intermediate surface if necessary
- call BeginScene
- End
- Cleanup
- Call EndScene
- Blit to dest if necessary
63Texture Utilities
- Image file loaders
- JPG, PNG, TGA, BMP, PPM, DDS
- Supports files in memory
- Format conversion
- Image re-sampling
- Better filtering options
- Supports wrap modes
- Mip-map generation
- Color-key to alpha conversion
64DXTn Encode Quality
- New high quality compression algorithm
- Fast enough for load-time compression
- 75-95 of earlier algorithm
- Dithers while encoding
- Avoids blocking of smooth gradients
- Improved encoding for alpha images
65DXTn Encoding examples
66Texture utilities update
- D3DXGetImageInfoFrom()
- Info about image before loading it
- Include file format info
- Enables calling appropriate load function
- D3DXLoadSurfaceFromSurface performance
- Will use hardware if possible
- Support for dynamic textures
67Image Save
- D3DXSaveSurfaceToFile
- BMPs
- 8-bit paletted
- 24-bit RGB
- DDS
- All formats
- Mip-maps, cube-maps, volumes
68New scratch pool
- D3DPOOL_SCRATCH
- Allows creation of resources that are not limited
by device capabilities - Create-Destroy, Lock-Unlock
- Can set to device, use in rendering
- Use with D3DX to convert to something useable
- e.g., Load high-prec height field and convert to
device prec normal map
69Texture Fill
- Texture fill functions
- D3DXFillTexture
- D3DXFillCubeTexture
- D3DXFillVolumeTexture
- Handles mip-maps
- Callback function gets a 2D/3D location and size
of texel - Encode functions as look-up tables for pixel
shaders
70Bump Mapping
- D3DXComputeNormalMap
- Converts a height field to a normal map
- Looks at 8 neighbors to calculate slope
- Calculates occlusion term in alpha
- Rough estimate of what fraction of the hemisphere
at that location in the height field is sky - Smooth gradients can have aliasing
- Use high-precision height field
- D3DX now supports 16-bit formats
71Math Library Improvements
- D3DXQuaternionSqaudSetup
- Use with D3DXQuaternionSqaud
- D3DXMatrixMultiplyTranspose
- For matrices in vertex shaders
- D3DXFresnelTerm
- Useful along with texture fill functions
72Math library optimization
- CPU specific optimizations for most important
functions - 3DNow, SSE and SSE2
- Vector, matrix, quaternion, interpolation,
- Auto-detect CPU type
- First call to an optimized math function detects
CPU - Patches jump table so no additional overhead for
subsequent calls
73Aligned Matrices
- Support for 16-byte aligned matrices
- D3DXMATRIXA16
- Uses declspec(align16) on new compilers
- Visual C 6 processor pack
- Visual C 7 (future product)
- Not in Visual C 6 service packs
- Aligns on stack, members, globals
- Overloaded new / delete for aligned heap
allocations - Use with care when embedding in structs
74Authoring Tool Support
- Feature adoption gated by art pipeline
- Longer lead times for content creation
- Tool evolution rate
- Duplicated effort for custom tools
- Every shop writes own export plug-ins
- We will provide source and samples
- To help reduce learning curve
- Look under extras directory in SDK
75Authoring Tool Plug-Ins
- Meshes
- Patches
- Transform hierarchy
- Materials and Textures
- Skinning
- Animation
763D Studio Max 3.x, 4.0
- Support Character Studio 2.x, 3.0
- Biped animations stored as sampled matrices
- Physique skinning exported
- Might need to re-apply physique to old data files
like babyenv.max - COM Skin support planned
- Patch export
- Work in progress
- Cannot export patches created by surface modifier
77AW Maya 2.x, 3.x
- Support Rigid and Smooth skinning
- Maya 2.x only has NURBS
- Can convert to patches using a script
- Use this before calling the exporter
- Supports export of skinned patches
- Maya 3.x has patches
- Do not have export option yet
78Future thoughts
- Improved PM simplification
- Ray-mesh intersection with precomputation
- Rasterize geometry attributes to textures
- Generate normal and displacement maps from high
poly meshes
79Call To Action
- Try out new features in DirectX 8.1
- Give us feedback
- Tell us about bugs and performance issues
- What else would you like to see?
- Hang around for the next talk
80Acknowledgements
- Thanks to Origin Systems for permission to use
Unicorn model - Thanks to NewTek for permission to use the
monster model
81Questions ?