📄 d3dx9mesh.h
字号:
#define INTERFACE ID3DXPRTBuffer
// Buffer interface - contains "NumSamples" samples
// each sample in memory is stored as NumCoeffs scalars per channel (1 or 3)
// Same interface is used for both Vertex and Pixel PRT buffers
DECLARE_INTERFACE_(ID3DXPRTBuffer, IUnknown)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
// ID3DXPRTBuffer
STDMETHOD_(UINT, GetNumSamples)(THIS) PURE;
STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE;
STDMETHOD_(UINT, GetNumChannels)(THIS) PURE;
STDMETHOD_(BOOL, IsTexture)(THIS) PURE;
STDMETHOD_(UINT, GetWidth)(THIS) PURE;
STDMETHOD_(UINT, GetHeight)(THIS) PURE;
// changes the number of samples allocated in the buffer
STDMETHOD(Resize)(THIS_ UINT NewSize) PURE;
// ppData will point to the memory location where sample Start begins
// pointer is valid for at least NumSamples samples
STDMETHOD(LockBuffer)(THIS_ UINT Start, UINT NumSamples, FLOAT **ppData) PURE;
STDMETHOD(UnlockBuffer)(THIS) PURE;
// every scalar in buffer is multiplied by Scale
STDMETHOD(ScaleBuffer)(THIS_ FLOAT Scale) PURE;
// every scalar contains the sum of this and pBuffers values
// pBuffer must have the same storage class/dimensions
STDMETHOD(AddBuffer)(THIS_ LPD3DXPRTBUFFER pBuffer) PURE;
// GutterHelper (described below) will fill in the gutter
// regions of a texture by interpolating "internal" values
STDMETHOD(AttachGH)(THIS_ LPD3DXTEXTUREGUTTERHELPER) PURE;
STDMETHOD(ReleaseGH)(THIS) PURE;
// Evaluates attached gutter helper on the contents of this buffer
STDMETHOD(EvalGH)(THIS) PURE;
// extracts a given channel into texture pTexture
// NumCoefficients starting from StartCoefficient are copied
STDMETHOD(ExtractTexture)(THIS_ UINT Channel, UINT StartCoefficient,
UINT NumCoefficients, LPDIRECT3DTEXTURE9 pTexture) PURE;
// extracts NumCoefficients coefficients into mesh - only applicable on single channel
// buffers, otherwise just lockbuffer and copy data. With SHPRT data NumCoefficients
// should be Order^2
STDMETHOD(ExtractToMesh)(THIS_ UINT NumCoefficients, D3DDECLUSAGE Usage, UINT UsageIndexStart,
LPD3DXMESH pScene) PURE;
};
typedef interface ID3DXPRTCompBuffer ID3DXPRTCompBuffer;
typedef interface ID3DXPRTCompBuffer *LPD3DXPRTCOMPBUFFER;
#undef INTERFACE
#define INTERFACE ID3DXPRTCompBuffer
// compressed buffers stored a compressed version of a PRTBuffer
DECLARE_INTERFACE_(ID3DXPRTCompBuffer, IUnknown)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
// ID3DPRTCompBuffer
// NumCoeffs and NumChannels are properties of input buffer
STDMETHOD_(UINT, GetNumSamples)(THIS) PURE;
STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE;
STDMETHOD_(UINT, GetNumChannels)(THIS) PURE;
STDMETHOD_(BOOL, IsTexture)(THIS) PURE;
STDMETHOD_(UINT, GetWidth)(THIS) PURE;
STDMETHOD_(UINT, GetHeight)(THIS) PURE;
// number of clusters, and PCA vectors per-cluster
STDMETHOD_(UINT, GetNumClusters)(THIS) PURE;
STDMETHOD_(UINT, GetNumPCA)(THIS) PURE;
// normalizes PCA weights so that they are between [-1,1]
// basis vectors are modified to reflect this
STDMETHOD(NormalizeData)(THIS) PURE;
// copies basis vectors for cluster "Cluster" into pClusterBasis
// (NumPCA+1)*NumCoeffs*NumChannels floats
STDMETHOD(ExtractBasis)(THIS_ UINT Cluster, FLOAT *pClusterBasis) PURE;
// UINT per sample - which cluster it belongs to
STDMETHOD(ExtractClusterIDs)(THIS_ UINT *pClusterIDs) PURE;
// copies NumExtract PCA projection coefficients starting at StartPCA
// into pPCACoefficients - NumSamples*NumExtract floats copied
STDMETHOD(ExtractPCA)(THIS_ UINT StartPCA, UINT NumExtract, FLOAT *pPCACoefficients) PURE;
// copies NumPCA projection coefficients starting at StartPCA
// into pTexture - should be able to cope with signed formats
STDMETHOD(ExtractTexture)(THIS_ UINT StartPCA, UINT NumpPCA,
LPDIRECT3DTEXTURE9 pTexture) PURE;
// copies NumPCA projection coefficients into mesh pScene
// Usage is D3DDECLUSAGE where coefficients are to be stored
// UsageIndexStart is starting index
STDMETHOD(ExtractToMesh)(THIS_ UINT NumPCA, D3DDECLUSAGE Usage, UINT UsageIndexStart,
LPD3DXMESH pScene) PURE;
};
#undef INTERFACE
#define INTERFACE ID3DXTextureGutterHelper
// ID3DXTextureGutterHelper will build and manage
// "gutter" regions in a texture - this will allow for
// bi-linear interpolation to not have artifacts when rendering
// It generates a map (in texture space) where each texel
// is in one of 3 states:
// 0 Invalid - not used at all
// 1 Inside triangle
// 2 Gutter texel
// 4 represents a gutter texel that will be computed during PRT
// For each Inside/Gutter texel it stores the face it
// belongs to and barycentric coordinates for the 1st two
// vertices of that face. Gutter vertices are assigned to
// the closest edge in texture space.
//
// When used with PRT this requires a unique parameterization
// of the model - every texel must correspond to a single point
// on the surface of the model and vice versa
DECLARE_INTERFACE_(ID3DXTextureGutterHelper, IUnknown)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
// ID3DXTextureGutterHelper
// dimensions of texture this is bound too
STDMETHOD_(UINT, GetWidth)(THIS) PURE;
STDMETHOD_(UINT, GetHeight)(THIS) PURE;
// Applying gutters recomputes all of the gutter texels of class "2"
// based on texels of class "1" or "4"
// Applies gutters to a raw float buffer - each texel is NumCoeffs floats
// Width and Height must match GutterHelper
STDMETHOD(ApplyGuttersFloat)(THIS_ FLOAT *pDataIn, UINT NumCoeffs, UINT Width, UINT Height);
// Applies gutters to pTexture
// Dimensions must match GutterHelper
STDMETHOD(ApplyGuttersTex)(THIS_ LPDIRECT3DTEXTURE9 pTexture);
// Applies gutters to a D3DXPRTBuffer
// Dimensions must match GutterHelper
STDMETHOD(ApplyGuttersPRT)(THIS_ LPD3DXPRTBUFFER pBuffer);
// the routines below provide access to the data structures
// used by the Apply functions
// face map is a UINT per texel that represents the
// face of the mesh that texel belongs too -
// only valid if same texel is valid in pGutterData
// pFaceData must be allocated by the user
STDMETHOD(GetFaceMap)(THIS_ UINT *pFaceData) PURE;
// BaryMap is a D3DXVECTOR2 per texel
// the 1st two barycentric coordinates for the corresponding
// face (3rd weight is always 1-sum of first two)
// only valid if same texel is valid in pGutterData
// pBaryData must be allocated by the user
STDMETHOD(GetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE;
// TexelMap is a D3DXVECTOR2 per texel that
// stores the location in pixel coordinates where the
// corresponding texel is mapped
// pTexelData must be allocated by the user
STDMETHOD(GetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE;
// GutterMap is a BYTE per texel
// 0/1/2 for Invalid/Internal/Gutter texels
// 4 represents a gutter texel that will be computed
// during PRT
// pGutterData must be allocated by the user
STDMETHOD(GetGutterMap)(THIS_ BYTE *pGutterData) PURE;
// face map is a UINT per texel that represents the
// face of the mesh that texel belongs too -
// only valid if same texel is valid in pGutterData
STDMETHOD(SetFaceMap)(THIS_ UINT *pFaceData) PURE;
// BaryMap is a D3DXVECTOR2 per texel
// the 1st two barycentric coordinates for the corresponding
// face (3rd weight is always 1-sum of first two)
// only valid if same texel is valid in pGutterData
STDMETHOD(SetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE;
// TexelMap is a D3DXVECTOR2 per texel that
// stores the location in pixel coordinates where the
// corresponding texel is mapped
STDMETHOD(SetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE;
// GutterMap is a BYTE per texel
// 0/1/2 for Invalid/Internal/Gutter texels
// 4 represents a gutter texel that will be computed
// during PRT
STDMETHOD(SetGutterMap)(THIS_ BYTE *pGutterData) PURE;
};
typedef interface ID3DXPRTEngine ID3DXPRTEngine;
typedef interface ID3DXPRTEngine *LPD3DXPRTENGINE;
#undef INTERFACE
#define INTERFACE ID3DXPRTEngine
// ID3DXPRTEngine is used to compute a PRT simulation
// Use the following steps to compute PRT for SH
// (1) create an interface (which includes a scene)
// (2) call SetSamplingInfo
// (3) [optional] Set MeshMaterials/albedo's (required if doing bounces)
// (4) call ComputeDirectLightingSH
// (5) [optional] call ComputeBounce
// repeat step 5 for as many bounces as wanted.
// if you want to model subsurface scattering you
// need to call ComputeSS after direct lighting and
// each bounce.
// If you want to bake the albedo into the PRT signal, you
// must call MutliplyAlbedo, otherwise the user has to multiply
// the albedo themselves. Not multiplying the albedo allows you
// to model albedo variation at a finer scale then illumination, and
// can result in better compression results.
// Luminance values are computed from RGB values using the following
// formula: R * 0.2125 + G * 0.7154 + B * 0.0721
DECLARE_INTERFACE_(ID3DXPRTEngine, IUnknown)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
// ID3DXPRTEngine
// This sets a material per attribute in the scene mesh and it is
// the only way to specify subsurface scattering parameters. if
// bSetAlbedo is FALSE, NumChannels must match the current
// configuration of the PRTEngine. If you intend to change
// NumChannels (through some other SetAlbedo function) it must
// happen before SetMeshMaterials is called.
//
// NumChannels 1 implies "grayscale" materials, set this to 3 to enable
// color bleeding effects
// bSetAlbedo sets albedo from material if TRUE - which clobbers per texel/vertex
// albedo that might have been set before. FALSE won't clobber.
// fLengthScale is used for subsurface scattering - scene is mapped into a 1mm unit cube
// and scaled by this amount
STDMETHOD(SetMeshMaterials)(THIS_ CONST D3DXSHMATERIAL **ppMaterials, UINT NumMeshes,
UINT NumChannels, BOOL bSetAlbedo, FLOAT fLengthScale) PURE;
// setting albedo per-vertex or per-texel over rides the albedos stored per mesh
// but it does not over ride any other settings
// sets an albedo to be used per vertex - the albedo is represented as a float
// pDataIn input pointer (pointint to albedo of 1st sample)
// NumChannels 1 implies "grayscale" materials, set this to 3 to enable
// color bleeding effects
// Stride - stride in bytes to get to next samples albedo
STDMETHOD(SetPerVertexAlbedo)(THIS_ CONST VOID *pDataIn, UINT NumChannels, UINT Stride) PURE;
// represents the albedo per-texel instead of per-vertex (even if per-vertex PRT is used)
// pAlbedoTexture - texture that stores the albedo (dimension arbitrary)
// NumChannels 1 implies "grayscale" materials, set this to 3 to enable
// color bleeding effects
// pGH - optional gutter helper, otherwise one is constructed in computation routines and
// destroyed (if not attached to buffers)
STDMETHOD(SetPerTexelAlbedo)(THIS_ LPDIRECT3DTEXTURE9 pAlbedoTexture,
UINT NumChannels,
LPD3DXTEXTUREGUTTERHELPER pGH) PURE;
// gets the per-vertex albedo
STDMETHOD(GetVertexAlbedo)(THIS_ D3DXCOLOR *pVertColors, UINT NumVerts) PURE;
// If pixel PRT is being computed normals default to ones that are interpolated
// from the vertex normals. This specifies a texture that stores an object
// space normal map instead (must use a texture format that can represent signed values)
// pNormalTexture - normal map, must be same dimensions as PRTBuffers, signed
STDMETHOD(SetPerTexelNormal)(THIS_ LPDIRECT3DTEXTURE9 pNormalTexture) PURE;
// Copies per-vertex albedo from mesh
// pMesh - mesh that represents the scene. It must have the same
// properties as the mesh used to create the PRTEngine
// Usage - D3DDECLUSAGE to extract albedos from
// NumChannels 1 implies "grayscale" materials, set this to 3 to enable
// color bleeding effects
STDMETHOD(ExtractPerVertexAlbedo)(THIS_ LPD3DXMESH pMesh,
D3DDECLUSAGE Usage,
UINT NumChannels) PURE;
// Resamples the input buffer into the output buffer
// can be used to move between per-vertex and per-texel buffers. This can also be used
// to convert single channel buffers to 3-channel buffers and vice-versa.
STDMETHOD(ResampleBuffer)(THIS_ LPD3DXPRTBUFFER pBufferIn, LPD3DXPRTBUFFER pBufferOut) PURE;
// Returns the scene mesh - including modifications from adaptive spatial sampling
// The returned mesh only has positions, normals and texture coordinates (if defined)
// pD3DDevice - d3d device that will be used to allocate the mesh
// pFaceRemap - each face has a p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -