📄 macros.vsh
字号:
local( $vertToEye ); &AllocateRegister( \$vertToEye );
local( $tmp ); &AllocateRegister( \$tmp );
; compute reflection vector r = 2 * (n dot v) n - v
sub $vertToEye.xyz, $cEyePos.xyz, $worldPos ; $tmp1 = v = c - p
dp3 $tmp, $worldNormal, $vertToEye ; $tmp = n dot v
mul $tmp.xyz, $tmp.xyz, $worldNormal ; $tmp = (n dot v ) n
mad $reflectionVector.xyz, $tmp, $cTwo, -$vertToEye
&FreeRegister( \$vertToEye );
&FreeRegister( \$tmp );
}
sub ComputeSphereMapTexCoords
{
local( $reflectionVector ) = shift;
local( $sphereMapTexCoords ) = shift;
local( $tmp ); &AllocateRegister( \$tmp );
; transform reflection vector into view space
dp3 $tmp.x, $reflectionVector, $cViewModel0
dp3 $tmp.y, $reflectionVector, $cViewModel1
dp3 $tmp.z, $reflectionVector, $cViewModel2
; generate <rx ry rz+1>
add $tmp.z, $tmp.z, $cOne
; find 1 / the length of r2
dp3 $tmp.w, $tmp, $tmp
rsq $tmp.w, $tmp.w
; r1 = r2/|r2| + 1
mad $tmp.xy, $tmp.w, $tmp, $cOne
mul $sphereMapTexCoords.xy, $tmp.xy, $cHalf
&FreeRegister( \$tmp );
}
sub SkinPosition
{
local( $numBones ) = shift;
local( $worldPos ) = shift;
if( $numBones == 0 )
{
;
; 0 bone skinning (4 instructions)
;
; Transform position into world space
; position
dp4 $worldPos.x, $vPos, $cModel0
dp4 $worldPos.y, $vPos, $cModel1
dp4 $worldPos.z, $vPos, $cModel2
mov $worldPos.w, $cOne
}
elsif( $numBones == 1 )
{
;
; 1 bone skinning (6 instructions)
;
local( $boneIndices );
&AllocateRegister( \$boneIndices );
; Perform 1 bone skinning
; Transform position into world space
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
mov a0.x, $boneIndices.z
; position
dp4 $worldPos.x, $vPos, c[a0.x]
dp4 $worldPos.y, $vPos, c[a0.x + 1]
dp4 $worldPos.z, $vPos, c[a0.x + 2]
mov $worldPos.w, $cOne
&FreeRegister( \$boneIndices );
}
elsif( $numBones == 2 )
{
;
; 2 bone skinning (13 instructions)
;
local( $boneIndices );
local( $blendedMatrix0 );
local( $blendedMatrix1 );
local( $blendedMatrix2 );
&AllocateRegister( \$boneIndices );
&AllocateRegister( \$blendedMatrix0 );
&AllocateRegister( \$blendedMatrix1 );
&AllocateRegister( \$blendedMatrix2 );
; Transform position into world space using all bones
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
; r11 = boneindices at this point
; first matrix
mov a0.x, $boneIndices.z
mul $blendedMatrix0, $vBoneWeights.x, c[a0.x]
mul $blendedMatrix1, $vBoneWeights.x, c[a0.x+1]
mul $blendedMatrix2, $vBoneWeights.x, c[a0.x+2]
; second matrix
mov a0.x, $boneIndices.y
mad $blendedMatrix0, $vBoneWeights.y, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $vBoneWeights.y, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $vBoneWeights.y, c[a0.x+2], $blendedMatrix2
; position
dp4 $worldPos.x, $vPos, $blendedMatrix0
dp4 $worldPos.y, $vPos, $blendedMatrix1
dp4 $worldPos.z, $vPos, $blendedMatrix2
mov $worldPos.w, $cOne
&FreeRegister( \$boneIndices );
&FreeRegister( \$blendedMatrix0 );
&FreeRegister( \$blendedMatrix1 );
&FreeRegister( \$blendedMatrix2 );
}
elsif( $numBones == 3 )
{
;
; 3 bone skinning (19 instructions)
;
local( $boneIndices );
local( $blendedMatrix0 );
local( $blendedMatrix1 );
local( $blendedMatrix2 );
&AllocateRegister( \$boneIndices );
&AllocateRegister( \$blendedMatrix0 );
&AllocateRegister( \$blendedMatrix1 );
&AllocateRegister( \$blendedMatrix2 );
; Transform position into world space using all bones
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
; r11 = boneindices at this point
; first matrix
mov a0.x, $boneIndices.z
mul $blendedMatrix0, $vBoneWeights.x, c[a0.x]
mul $blendedMatrix1, $vBoneWeights.x, c[a0.x+1]
mul $blendedMatrix2, $vBoneWeights.x, c[a0.x+2]
; second matrix
mov a0.x, $boneIndices.y
mad $blendedMatrix0, $vBoneWeights.y, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $vBoneWeights.y, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $vBoneWeights.y, c[a0.x+2], $blendedMatrix2
; Calculate third weight
; compute 1-(weight1+weight2) to calculate weight2
; Use $boneIndices.w as a temp since we aren't using it for anything.
add $boneIndices.w, $vBoneWeights.x, $vBoneWeights.y
sub $boneIndices.w, $cOne, $boneIndices.w
; third matrix
mov a0.x, $boneIndices.x
mad $blendedMatrix0, $boneIndices.w, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $boneIndices.w, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $boneIndices.w, c[a0.x+2], $blendedMatrix2
; position
dp4 $worldPos.x, $vPos, $blendedMatrix0
dp4 $worldPos.y, $vPos, $blendedMatrix1
dp4 $worldPos.z, $vPos, $blendedMatrix2
mov $worldPos.w, $cOne
&FreeRegister( \$boneIndices );
&FreeRegister( \$blendedMatrix0 );
&FreeRegister( \$blendedMatrix1 );
&FreeRegister( \$blendedMatrix2 );
}
}
sub SkinPositionAndNormal
{
local( $numBones ) = shift;
local( $worldPos ) = shift;
local( $worldNormal ) = shift;
if( $numBones == 0 )
{
;
; 0 bone skinning (13 instructions)
;
; Transform position + normal + tangentS + tangentT into world space
; position
dp4 $worldPos.x, $vPos, $cModel0
dp4 $worldPos.y, $vPos, $cModel1
dp4 $worldPos.z, $vPos, $cModel2
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, $cModel0
dp3 $worldNormal.y, $vNormal, $cModel1
dp3 $worldNormal.z, $vNormal, $cModel2
}
elsif( $numBones == 1 )
{
;
; 1 bone skinning (17 instructions)
;
local( $boneIndices );
&AllocateRegister( \$boneIndices );
; Perform 1 bone skinning
; Transform position into world space
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
mov a0.x, $boneIndices.z
; position
dp4 $worldPos.x, $vPos, c[a0.x]
dp4 $worldPos.y, $vPos, c[a0.x + 1]
dp4 $worldPos.z, $vPos, c[a0.x + 2]
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, c[a0.x]
dp3 $worldNormal.y, $vNormal, c[a0.x + 1]
dp3 $worldNormal.z, $vNormal, c[a0.x + 2]
&FreeRegister( \$boneIndices );
}
elsif( $numBones == 2 )
{
;
; 2 bone skinning (16 instructions)
;
local( $boneIndices );
local( $blendedMatrix0 );
local( $blendedMatrix1 );
local( $blendedMatrix2 );
&AllocateRegister( \$boneIndices );
&AllocateRegister( \$blendedMatrix0 );
&AllocateRegister( \$blendedMatrix1 );
&AllocateRegister( \$blendedMatrix2 );
; Transform position into world space using all bones
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
; r11 = boneindices at this point
; first matrix
mov a0.x, $boneIndices.z
mul $blendedMatrix0, $vBoneWeights.x, c[a0.x]
mul $blendedMatrix1, $vBoneWeights.x, c[a0.x+1]
mul $blendedMatrix2, $vBoneWeights.x, c[a0.x+2]
; second matrix
mov a0.x, $boneIndices.y
mad $blendedMatrix0, $vBoneWeights.y, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $vBoneWeights.y, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $vBoneWeights.y, c[a0.x+2], $blendedMatrix2
; position
dp4 $worldPos.x, $vPos, $blendedMatrix0
dp4 $worldPos.y, $vPos, $blendedMatrix1
dp4 $worldPos.z, $vPos, $blendedMatrix2
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, $blendedMatrix0
dp3 $worldNormal.y, $vNormal, $blendedMatrix1
dp3 $worldNormal.z, $vNormal, $blendedMatrix2
&FreeRegister( \$boneIndices );
&FreeRegister( \$blendedMatrix0 );
&FreeRegister( \$blendedMatrix1 );
&FreeRegister( \$blendedMatrix2 );
}
elsif( $numBones == 3 )
{
local( $boneIndices );
local( $blendedMatrix0 );
local( $blendedMatrix1 );
local( $blendedMatrix2 );
&AllocateRegister( \$boneIndices );
&AllocateRegister( \$blendedMatrix0 );
&AllocateRegister( \$blendedMatrix1 );
&AllocateRegister( \$blendedMatrix2 );
; Transform position into world space using all bones
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
; r11 = boneindices at this point
; first matrix
mov a0.x, $boneIndices.z
mul $blendedMatrix0, $vBoneWeights.x, c[a0.x]
mul $blendedMatrix1, $vBoneWeights.x, c[a0.x+1]
mul $blendedMatrix2, $vBoneWeights.x, c[a0.x+2]
; second matrix
mov a0.x, $boneIndices.y
mad $blendedMatrix0, $vBoneWeights.y, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $vBoneWeights.y, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $vBoneWeights.y, c[a0.x+2], $blendedMatrix2
; Calculate third weight
; compute 1-(weight1+weight2) to calculate weight2
; Use $boneIndices.w as a temp since we aren't using it for anything.
add $boneIndices.w, $vBoneWeights.x, $vBoneWeights.y
sub $boneIndices.w, $cOne, $boneIndices.w
; third matrix
mov a0.x, $boneIndices.x
mad $blendedMatrix0, $boneIndices.w, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $boneIndices.w, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $boneIndices.w, c[a0.x+2], $blendedMatrix2
; position
dp4 $worldPos.x, $vPos, $blendedMatrix0
dp4 $worldPos.y, $vPos, $blendedMatrix1
dp4 $worldPos.z, $vPos, $blendedMatrix2
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, $blendedMatrix0
dp3 $worldNormal.y, $vNormal, $blendedMatrix1
dp3 $worldNormal.z, $vNormal, $blendedMatrix2
&FreeRegister( \$boneIndices );
&FreeRegister( \$blendedMatrix0 );
&FreeRegister( \$blendedMatrix1 );
&FreeRegister( \$blendedMatrix2 );
}
}
sub SkinPositionNormalAndTangentSpace
{
local( $numBones ) = shift;
local( $worldPos ) = shift;
local( $worldNormal ) = shift;
local( $worldTangentS ) = shift;
local( $worldTangentT ) = shift;
if( $numBones == 0 )
{
;
; 0 bone skinning (13 instructions)
;
; Transform position + normal + tangentS + tangentT into world space
; position
dp4 $worldPos.x, $vPos, $cModel0
dp4 $worldPos.y, $vPos, $cModel1
dp4 $worldPos.z, $vPos, $cModel2
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, $cModel0
dp3 $worldNormal.y, $vNormal, $cModel1
dp3 $worldNormal.z, $vNormal, $cModel2
; tangents
dp3 $worldTangentS.x, $vUserData, $cModel0
dp3 $worldTangentS.y, $vUserData, $cModel1
dp3 $worldTangentS.z, $vUserData, $cModel2
; calculate tangent t via cross( N, S ) * S[3]
&Cross( $worldTangentT, $worldNormal, $worldTangentS );
mul $worldTangentT.xyz, $vUserData.w, $worldTangentT.xyz
}
elsif( $numBones == 1 )
{
;
; 1 bone skinning (17 instructions)
;
local( $boneIndices );
&AllocateRegister( \$boneIndices );
; Perform 1 bone skinning
; Transform position into world space
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
mov a0.x, $boneIndices.z
; position
dp4 $worldPos.x, $vPos, c[a0.x]
dp4 $worldPos.y, $vPos, c[a0.x + 1]
dp4 $worldPos.z, $vPos, c[a0.x + 2]
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, c[a0.x]
dp3 $worldNormal.y, $vNormal, c[a0.x + 1]
dp3 $worldNormal.z, $vNormal, c[a0.x + 2]
; tangents
dp3 $worldTangentS.x, $vUserData, c[a0.x]
dp3 $worldTangentS.y, $vUserData, c[a0.x + 1]
dp3 $worldTangentS.z, $vUserData, c[a0.x + 2]
; calculate tangent t via cross( N, S ) * S[3]
&Cross( $worldTangentT, $worldNormal, $worldTangentS );
mul $worldTangentT.xyz, $vUserData.w, $worldTangentT.xyz
&FreeRegister( \$boneIndices );
}
elsif( $numBones == 2 )
{
;
; 2 bone skinning (22 instructions)
;
local( $boneIndices );
local( $blendedMatrix0 );
local( $blendedMatrix1 );
local( $blendedMatrix2 );
&AllocateRegister( \$boneIndices );
&AllocateRegister( \$blendedMatrix0 );
&AllocateRegister( \$blendedMatrix1 );
&AllocateRegister( \$blendedMatrix2 );
; Transform position into world space using all bones
; denormalize d3dcolor to matrix index
mad $boneIndices, $vBoneIndices, $cColorToIntScale, $cModel0Index
; r11 = boneindices at this point
; first matrix
mov a0.x, $boneIndices.z
mul $blendedMatrix0, $vBoneWeights.x, c[a0.x]
mul $blendedMatrix1, $vBoneWeights.x, c[a0.x+1]
mul $blendedMatrix2, $vBoneWeights.x, c[a0.x+2]
; second matrix
mov a0.x, $boneIndices.y
mad $blendedMatrix0, $vBoneWeights.y, c[a0.x], $blendedMatrix0
mad $blendedMatrix1, $vBoneWeights.y, c[a0.x+1], $blendedMatrix1
mad $blendedMatrix2, $vBoneWeights.y, c[a0.x+2], $blendedMatrix2
; position
dp4 $worldPos.x, $vPos, $blendedMatrix0
dp4 $worldPos.y, $vPos, $blendedMatrix1
dp4 $worldPos.z, $vPos, $blendedMatrix2
mov $worldPos.w, $cOne
; normal
dp3 $worldNormal.x, $vNormal, $blendedMatrix0
dp3 $worldNormal.y, $vNormal, $blendedMatrix1
dp3 $worldNormal.z, $vNormal, $blendedMatrix2
; tangents
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -