microsoft / DirectXMesh

DirectXMesh geometry processing library
https://walbourn.github.io/directxmesh/
MIT License
785 stars 150 forks source link

Stripify Mesh #17

Open walbourn opened 7 years ago

walbourn commented 7 years ago

The original D3DX mesh optimize function supported an option for stripifying D3DXMESHOPT_STRIPREORDER. We support this with OptimizeFaces (passing 0 for the vertexCache size), but the resulting IB is still a triangle list as was the case in the original D3DX library.

This proposed function would convert index buffers from D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST to D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP. See Wikipedia

On older generation GPU hardware, using triangle strips over triangle lists was a performance win. This is no longer true on modern GPUs even mobile platforms. While it does result in slightly smaller indices, it is generally far more useful to use triangle lists and optimized for vertex cache reuse. The main reason to include this functionality in DirectXMesh is for completeness and for creating performance references.

NvTriStrip

Stewart, J. "Tunneling for Triangle Strips" PDF

Evans, F., Skiena, S., Varshney, A.; "Optimizing triangle strips for fast rendering", Visualization 1996. PDF

Akeley, K., Haeberli, P., Burns, D.; tomesh.c. C Program on SGI Developer's Toolbox CD, 1990

Xottab-DUTY commented 3 years ago

Just curious, is there a way to determine if strips or lists will be better for user's GPU except checking the device ID?

walbourn commented 3 years ago

There's really no modern GPU that strips is a better choice. You'd have to benchmark to find a case where it was better.

walbourn commented 1 year ago
HRESULT WINAPI
    D3DXConvertMeshSubsetToSingleStrip(
        LPD3DXBASEMESH MeshIn,
        DWORD AttribId,
        DWORD IBOptions,
        LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer,
        DWORD *pNumIndices);

HRESULT WINAPI
    D3DXConvertMeshSubsetToStrips(
        LPD3DXBASEMESH MeshIn,
        DWORD AttribId,
        DWORD IBOptions,
        LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer,
        DWORD *pNumIndices,
        LPD3DXBUFFER *ppStripLengths,
        DWORD *pNumStrips);