📄 direct3d8.pas
字号:
//
{
Vertex Shader Declaration
The declaration portion of a vertex shader defines the static external
interface of the shader. The information in the declaration includes:
- Assignments of vertex shader input registers to data streams. These
assignments bind a specific vertex register to a single component within a
vertex stream. A vertex stream element is identified by a byte offset
within the stream and a type. The type specifies the arithmetic data type
plus the dimensionality (1, 2, 3, or 4 values). Stream data which is
less than 4 values are always expanded out to 4 values with zero or more
0.F values and one 1.F value.
- Assignment of vertex shader input registers to implicit data from the
primitive tessellator. This controls the loading of vertex data which is
not loaded from a stream, but rather is generated during primitive
tessellation prior to the vertex shader.
- Loading data into the constant memory at the time a shader is set as the
current shader. Each token specifies values for one or more contiguous 4
DWORD constant registers. This allows the shader to update an arbitrary
subset of the constant memory, overwriting the device state (which
contains the current values of the constant memory). Note that these
values can be subsequently overwritten (between DrawPrimitive calls)
during the time a shader is bound to a device via the
SetVertexShaderConstant method.
Declaration arrays are single-dimensional arrays of DWORDs composed of
multiple tokens each of which is one or more DWORDs. The single-DWORD
token value 0xFFFFFFFF is a special token used to indicate the end of the
declaration array. The single DWORD token value 0x00000000 is a NOP token
with is ignored during the declaration parsing. Note that 0x00000000 is a
valid value for DWORDs following the first DWORD for multiple word tokens.
[31:29] TokenType
0x0 - NOP (requires all DWORD bits to be zero)
0x1 - stream selector
0x2 - stream data definition (map to vertex input memory)
0x3 - vertex input memory from tessellator
0x4 - constant memory from shader
0x5 - extension
0x6 - reserved
0x7 - end-of-array (requires all DWORD bits to be 1)
NOP Token (single DWORD token)
[31:29] 0x0
[28:00] 0x0
Stream Selector (single DWORD token)
[31:29] 0x1
[28] indicates whether this is a tessellator stream
[27:04] 0x0
[03:00] stream selector (0..15)
Stream Data Definition (single DWORD token)
Vertex Input Register Load
[31:29] 0x2
[28] 0x0
[27:20] 0x0
[19:16] type (dimensionality and data type)
[15:04] 0x0
[03:00] vertex register address (0..15)
Data Skip (no register load)
[31:29] 0x2
[28] 0x1
[27:20] 0x0
[19:16] count of DWORDS to skip over (0..15)
[15:00] 0x0
Vertex Input Memory from Tessellator Data (single DWORD token)
[31:29] 0x3
[28] indicates whether data is normals or u/v
[27:24] 0x0
[23:20] vertex register address (0..15)
[19:16] type (dimensionality)
[15:04] 0x0
[03:00] vertex register address (0..15)
Constant Memory from Shader (multiple DWORD token)
[31:29] 0x4
[28:25] count of 4*DWORD constants to load (0..15)
[24:07] 0x0
[06:00] constant memory address (0..95)
Extension Token (single or multiple DWORD token)
[31:29] 0x5
[28:24] count of additional DWORDs in token (0..31)
[23:00] extension-specific information
End-of-array token (single DWORD token)
[31:29] 0x7
[28:00] 0x1fffffff
The stream selector token must be immediately followed by a contiguous set of stream data definition tokens. This token sequence fully defines that stream, including the set of elements within the stream, the order in which the elements appear, the type of each element, and the vertex register into which to load an element.
Streams are allowed to include data which is not loaded into a vertex register, thus allowing data which is not used for this shader to exist in the vertex stream. This skipped data is defined only by a count of DWORDs to skip over, since the type information is irrelevant.
The token sequence:
Stream Select: stream=0
Stream Data Definition (Load): type=FLOAT3; register=3
Stream Data Definition (Load): type=FLOAT3; register=4
Stream Data Definition (Skip): count=2
Stream Data Definition (Load): type=FLOAT2; register=7
defines stream zero to consist of 4 elements, 3 of which are loaded into registers and the fourth skipped over. Register 3 is loaded with the first three DWORDs in each vertex interpreted as FLOAT data. Register 4 is loaded with the 4th, 5th, and 6th DWORDs interpreted as FLOAT data. The next two DWORDs (7th and 8th) are skipped over and not loaded into any vertex input register. Register 7 is loaded with the 9th and 10th DWORDS interpreted as FLOAT data.
Placing of tokens other than NOPs between the Stream Selector and Stream Data Definition tokens is disallowed.
}
type
_D3DVSD_TOKENTYPE = (
{$IFNDEF SUPPORTS_EXPL_ENUMS}
D3DVSD_TOKEN_NOP {= 0}, // NOP or extension
D3DVSD_TOKEN_STREAM, // stream selector
D3DVSD_TOKEN_STREAMDATA, // stream data definition (map to vertex input memory)
D3DVSD_TOKEN_TESSELLATOR, // vertex input memory from tessellator
D3DVSD_TOKEN_CONSTMEM, // constant memory from shader
D3DVSD_TOKEN_EXT, // extension
D3DVSD_INVALID_6, // Invalid token inserted to fill the gap (in Object Pascal translation)
D3DVSD_TOKEN_END {= 7} // end-of-array (requires all DWORD bits to be 1)
{$ELSE}
D3DVSD_TOKEN_NOP = 0, // NOP or extension
D3DVSD_TOKEN_STREAM, // stream selector
D3DVSD_TOKEN_STREAMDATA, // stream data definition (map to vertex input memory)
D3DVSD_TOKEN_TESSELLATOR, // vertex input memory from tessellator
D3DVSD_TOKEN_CONSTMEM, // constant memory from shader
D3DVSD_TOKEN_EXT, // extension
D3DVSD_TOKEN_END = 7 // end-of-array (requires all DWORD bits to be 1)
{$ENDIF}
);
{$EXTERNALSYM _D3DVSD_TOKENTYPE}
D3DVSD_TOKENTYPE = _D3DVSD_TOKENTYPE;
{$EXTERNALSYM D3DVSD_TOKENTYPE}
TD3DVSDTokenType = _D3DVSD_TOKENTYPE;
const
D3DVSD_TOKENTYPESHIFT = 29;
{$EXTERNALSYM D3DVSD_TOKENTYPESHIFT}
D3DVSD_TOKENTYPEMASK = (7 shl D3DVSD_TOKENTYPESHIFT);
{$EXTERNALSYM D3DVSD_TOKENTYPEMASK}
D3DVSD_STREAMNUMBERSHIFT = 0;
{$EXTERNALSYM D3DVSD_STREAMNUMBERSHIFT}
D3DVSD_STREAMNUMBERMASK = ($F shl D3DVSD_STREAMNUMBERSHIFT);
{$EXTERNALSYM D3DVSD_STREAMNUMBERMASK}
D3DVSD_DATALOADTYPESHIFT = 28;
{$EXTERNALSYM D3DVSD_DATALOADTYPESHIFT}
D3DVSD_DATALOADTYPEMASK = ($1 shl D3DVSD_DATALOADTYPESHIFT);
{$EXTERNALSYM D3DVSD_DATALOADTYPEMASK}
D3DVSD_DATATYPESHIFT = 16;
{$EXTERNALSYM D3DVSD_DATATYPESHIFT}
D3DVSD_DATATYPEMASK = ($F shl D3DVSD_DATATYPESHIFT);
{$EXTERNALSYM D3DVSD_DATATYPEMASK}
D3DVSD_SKIPCOUNTSHIFT = 16;
{$EXTERNALSYM D3DVSD_SKIPCOUNTSHIFT}
D3DVSD_SKIPCOUNTMASK = ($F shl D3DVSD_SKIPCOUNTSHIFT);
{$EXTERNALSYM D3DVSD_SKIPCOUNTMASK}
D3DVSD_VERTEXREGSHIFT = 0;
{$EXTERNALSYM D3DVSD_VERTEXREGSHIFT}
D3DVSD_VERTEXREGMASK = ($1F shl D3DVSD_VERTEXREGSHIFT);
{$EXTERNALSYM D3DVSD_VERTEXREGMASK}
{$EXTERNALSYM D3DVSD_VERTEXREGMASK}
D3DVSD_VERTEXREGINSHIFT = 20;
{$EXTERNALSYM D3DVSD_VERTEXREGINSHIFT}
D3DVSD_VERTEXREGINMASK = ($F shl D3DVSD_VERTEXREGINSHIFT);
{$EXTERNALSYM D3DVSD_VERTEXREGINMASK}
D3DVSD_CONSTCOUNTSHIFT = 25;
{$EXTERNALSYM D3DVSD_CONSTCOUNTSHIFT}
D3DVSD_CONSTCOUNTMASK = ($F shl D3DVSD_CONSTCOUNTSHIFT);
{$EXTERNALSYM D3DVSD_CONSTCOUNTMASK}
D3DVSD_CONSTADDRESSSHIFT = 0;
{$EXTERNALSYM D3DVSD_CONSTADDRESSSHIFT}
D3DVSD_CONSTADDRESSMASK = ($7F shl D3DVSD_CONSTADDRESSSHIFT);
{$EXTERNALSYM D3DVSD_CONSTADDRESSMASK}
D3DVSD_CONSTRSSHIFT = 16;
{$EXTERNALSYM D3DVSD_CONSTRSSHIFT}
D3DVSD_CONSTRSMASK = ($1FFF shl D3DVSD_CONSTRSSHIFT);
{$EXTERNALSYM D3DVSD_CONSTRSMASK}
D3DVSD_EXTCOUNTSHIFT = 24;
{$EXTERNALSYM D3DVSD_EXTCOUNTSHIFT}
D3DVSD_EXTCOUNTMASK = ($1F shl D3DVSD_EXTCOUNTSHIFT);
{$EXTERNALSYM D3DVSD_EXTCOUNTMASK}
D3DVSD_EXTINFOSHIFT = 0;
{$EXTERNALSYM D3DVSD_EXTINFOSHIFT}
D3DVSD_EXTINFOMASK = ($FFFFFF shl D3DVSD_EXTINFOSHIFT);
{$EXTERNALSYM D3DVSD_EXTINFOMASK}
// D3DVSD_MAKETOKENTYPE(tokenType) ((tokenType << D3DVSD_TOKENTYPESHIFT) & D3DVSD_TOKENTYPEMASK)
function D3DVSD_MAKETOKENTYPE(tokenType: TD3DVSDTokenType): DWord;
{$EXTERNALSYM D3DVSD_MAKETOKENTYPE}
// macros for generation of CreateVertexShader Declaration token array
// Set current stream
// _StreamNumber [0..(MaxStreams-1)] stream to get data from
//
//#define D3DVSD_STREAM( _StreamNumber ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) | (_StreamNumber))
function D3DVSD_STREAM(_StreamNumber: DWord): DWord;
{$EXTERNALSYM D3DVSD_STREAM}
const
// Set tessellator stream
//
D3DVSD_STREAMTESSSHIFT = 28;
{$EXTERNALSYM D3DVSD_STREAMTESSSHIFT}
D3DVSD_STREAMTESSMASK = (1 shl D3DVSD_STREAMTESSSHIFT);
{$EXTERNALSYM D3DVSD_STREAMTESSMASK}
// #define D3DVSD_STREAM_TESS( ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) | (D3DVSD_STREAMTESSMASK))
// !!! - macro just rolled out in pascal (not converted to function)
D3DVSD_STREAM_TESS = ((DWord(D3DVSD_TOKEN_STREAM) shl D3DVSD_TOKENTYPESHIFT) and
D3DVSD_TOKENTYPEMASK) or D3DVSD_STREAMTESSMASK;
{$EXTERNALSYM D3DVSD_STREAM_TESS}
// bind single vertex register to vertex element from vertex stream
//
// _VertexRegister [0..15] address of the vertex register
// _Type [D3DVSDT_*] dimensionality and arithmetic data type
//#define D3DVSD_REG( _VertexRegister, _Type ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) | \
// ((_Type) << D3DVSD_DATATYPESHIFT) | (_VertexRegister))
function D3DVSD_REG(_VertexRegister, _Type: DWord): DWord;
{$EXTERNALSYM D3DVSD_REG}
// Skip _DWORDCount DWORDs in vertex
//
//#define D3DVSD_SKIP( _DWORDCount ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) | 0x10000000 | \
// ((_DWORDCount) << D3DVSD_SKIPCOUNTSHIFT))
function D3DVSD_SKIP(_DWORDCount: DWord): DWord;
{$EXTERNALSYM D3DVSD_SKIP}
// load data into vertex shader constant memory
//
// _ConstantAddress [0..95] - address of constant array to begin filling data
// _Count [0..15] - number of constant vectors to load (4 DWORDs each)
// followed by 4*_Count DWORDS of data
//
//#define D3DVSD_CONST( _ConstantAddress, _Count ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_CONSTMEM) | \
// ((_Count) << D3DVSD_CONSTCOUNTSHIFT) | (_ConstantAddress))
function D3DVSD_CONST(_ConstantAddress, _Count: DWord): DWord;
{$EXTERNALSYM D3DVSD_CONST}
// enable tessellator generated normals
//
// _VertexRegisterIn [0..15] address of vertex register whose input stream
// will be used in normal computation
// _VertexRegisterOut [0..15] address of vertex register to output the normal to
//
//#define D3DVSD_TESSNORMAL( _VertexRegisterIn, _VertexRegisterOut ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) | \
// ((_VertexRegisterIn) << D3DVSD_VERTEXREGINSHIFT) | \
// ((0x02) << D3DVSD_DATATYPESHIFT) | (_VertexRegisterOut))
function D3DVSD_TESSNORMAL(_VertexRegisterIn, _VertexRegisterOut: DWord): DWord;
{$EXTERNALSYM D3DVSD_TESSNORMAL}
// enable tessellator generated surface parameters
//
// _VertexRegister [0..15] address of vertex register to output parameters
//
//#define D3DVSD_TESSUV( _VertexRegister ) \
// (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) | 0x10000000 | \
// ((0x01) << D3DVSD_DATATYPESHIFT) | (_VertexRegister))
function D3DVSD_TESSUV(_VertexRegister: DWord): DWord;
{$EXTERNALSYM D3DVSD_TESSUV}
const
// Generates END token
//
D3DVSD_END = $FFFFFFFF;
{$EXTERNALSYM D3DVSD_END}
// Generates NOP token
D3DVSD_NOP = $00000000;
{$EXTERNALSYM D3DVSD_NOP}
// bit declarations for _Type fields
D3DVSDT_FLOAT1 = $00; // 1D float expanded to (value; 0.; 0.; 1.)
{$EXTERNALSYM D3DVSDT_FLOAT1}
D3DVSDT_FLOAT2 = $01; // 2D float expanded to (value; value; 0.; 1.)
{$EXTERNALSYM D3DVSDT_FLOAT2}
D3DVSDT_FLOAT3 = $02; // 3D float expanded to (value; value; value; 1.)
{$EXTERNALSYM D3DVSDT_FLOAT3}
D3DVSDT_FLOAT4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -