Exercise 5: Vertex Shader Specular Lighting
//
// Effect File Workshop Exercise 5
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
//
vector lhtR; // Light direction
matrix mWld; // World
matrix mTot; // Total
vector matD; // Material diffuse
vector matS; // Material specular
vector vCPS; // Camera position
// Background color
DWORD BCLR = 0xFF000000;
pixelshader pNIL;
string XFile = "f40.x";
// Technique names for display in viewer window
string tec0 = "Exercise 5: Vertex Shader Specular Lighting";
technique tec0
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = ; // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light direction
// Blending Constants
VertexShaderConstant[20] = (0.7f,0.7f,0.7f,0.7f);
VertexShaderConstant[21] = (0.3f,0.3f,0.3f,0.3f);
// Camera Information.
VertexShaderConstant[24] = ;
ColorOp[0] = SelectArg1;
ColorArg1[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Disable;
AlphaOp[1] = Disable;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to world space
add r0,-r0,c24 // Get a vector toward the camera position
// This is the negative of the camera direction
// Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = -(camera vector)
add r2.xyz,r0.xyz,-c16 // Get half angle
// Normalize
dp3 r11.x,r2.xyz,r2.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r2.xyz,r2.xyz,r11.xyz // Multiply, r2 = HalfAngle
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
// r2 = half angle, r1 = normal, r3 (output) = intensity
dp3 r3.xyzw,r1,r2
// Now raise it several times
mul r3,r3,r3 // 2nd
mul r3,r3,r3 // 4th
mul r3,r3,r3 // 8th
mul r3,r3,r3 // 16th
// Compute diffuse term
dp3 r4,r1,-c16
// Blend it in
mul r3,c20,r3 // Kd
mul r4,r4,c21 // Ks
mul r4,r4,c10 // Specular
mad r4,r3,c9,r4 // Diffuse
mov oD0,r4 // Put into Diffuse Color
};
}
}
Exercise 5B
//
// Effect File Workshop Exercise 5B
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
//
vector lhtR; // Light Direction
matrix mWld; // World
matrix mTot; // Total
vector vCPS; // Camera position
texture tEnv; // Environment texture
texture tDif;
vector matD; // Object Diffuse Material Color
vector matS; // Object Specular Material Color
// Background color
DWORD BCLR = 0xFF000000;
pixelshader pNIL;
//string XFile = "f40.x";
string XFile = "viper.x";
string BIMG = "lobbyzneg.bmp";
// Technique names for display in viewer window
string tec0 = "Exercise 5b: Vertex Shader Specular Envmap";
technique tec0
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light Direction
// Blending constants
VertexShaderConstant[20] = (-2.0f,-2.0f,-2.0f,-2.0f);
VertexShaderConstant[21] = ( 0.25f, 0.25f, 0.25f, 0.05f );
VertexShaderConstant[22] = ( 0.75f, 0.75f, 0.75f, 0.95f );
VertexShaderConstant[23] = ( 1.00f, 1.00f, 1.00f, 1.00f );
// Camera information
VertexShaderConstant[24] = ;
ColorOp[0] = Modulate;
ColorArg2[0] = Diffuse;
ColorArg1[0] = Texture;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Disable;
AlphaOp[1] = Disable;
Texture[0] = ;
PixelShader = ;
AlphaBlendEnable = True;
SrcBlend = One;
DestBlend = InvSrcAlpha;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to world space
add r0,r0,-c24 // Get a vector toward the camera position
// This is the camera direction
// Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = (camera vector)
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
dp3 r3,r0,r1 // Dot product Cam*Normal
mul r2,c20,r3
mad oT0.xyz,r2,r1,r0 // Compute reflection vector
// (1-cos)^4 = approx fresnel
add r0,c23,r3 // Complement color
mul r1,r0,r0 // Square
mul r0,r1,r1 // 4th
mul r0,r0,c22
// mov r1,c9
// mul r1,r1,c21 // Blend in scaled diffuse material color
add oD0,r0,r1 // Put into Diffuse Color
};
}
}
technique tec1
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light direction
// Blending Constants
VertexShaderConstant[20] = (-2.0f,-2.0f,-2.0f,-2.0f);
VertexShaderConstant[21] = ( 0.25f, 0.25f, 0.25f, 0.05f );
VertexShaderConstant[22] = ( 0.75f, 0.75f, 0.75f, 0.95f );
VertexShaderConstant[23] = ( 1.00f, 1.00f, 1.00f, 1.00f );
VertexShaderConstant[24] = ( 1.0f, 1.0f, 1.0f, 1.0f );
// Camera Information
VertexShaderConstant[25] = ;
ColorOp[0] = Modulate;
ColorArg1[0] = Texture;
ColorArg2[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Add;
ColorArg1[1] = Current;
ColorArg2[1] = Specular;
ColorOp[2] = Disable;
AlphaOp[2] = Disable;
Texture[0] = ;
PixelShader = ;
// AlphaBlendEnable = True;
// SrcBlend = One; //SrcAlpha;
// DestBlend = InvSrcAlpha;
// CullMode = None;
SpecularEnable = True;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to World Space
add r0,r0,-c25 // Get a vector toward the camera position,
// this is the camera direction
// Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = (camera vector)
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
dp3 r3,r0,r1 // Dot product Cam*Normal
mul r2,c20,r3
mad oT0.xyz,r2,r1,r0 // Compute reflection vector
// (1-cos)^4 = approx fresnel
add r0,c23,r3 // Complement color
mul r1,r0,r0 // Square
add oD0,r1,c21
mov r1,c9
mul oD1,r1,c21 // Blend in scaled diffuse material color
};
}
}
technique tec2
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = ; // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light direction
// Blending constants
VertexShaderConstant[20] = (-2.0f,-2.0f,-2.0f,-2.0f);
VertexShaderConstant[21] = ( 0.25f, 0.25f, 0.25f, 0.05f );
VertexShaderConstant[22] = ( 0.75f, 0.75f, 0.75f, 0.95f );
VertexShaderConstant[23] = ( 1.00f, 1.00f, 1.00f, 1.00f );
VertexShaderConstant[24] = ( 1.0f, 1.0f, 1.0f, 1.0f );
// Camera information
VertexShaderConstant[25] = ;
ColorOp[0] = Modulate;
ColorArg1[0] = Texture;
ColorArg2[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Add;
ColorArg1[1] = Current;
ColorArg2[1] = Specular;
ColorOp[2] = Disable;
AlphaOp[2] = Disable;
Texture[0] = ;
PixelShader = ;
// FillMode = Wireframe;
SpecularEnable = True;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to world Space
add r0,r0,-c25 // Get a vector toward the camera position,
// this is the camera direction
//Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = (camera vector)
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
dp3 r3,r0,r1 // Dot product Cam*Normal
mul r2,c20,r3
mad oT0.xyz,r2,r1,r0 // Compute reflection vector
//(1-cos)^4 = approx fresnel
add r0,c23,r3 // Complement color
mul r1,r0,r0 // Square
// add r1, r1, c21
// mul oD0, r1, c10
mad oD0, r1, c10, c10
mov r1,c9
mul oD1,r1,c21 // blend in scaled diffuse mat color
};
}
}
technique tec4
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = ; // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light direction
// Blending Constants
VertexShaderConstant[20] = (-2.0f,-2.0f,-2.0f,-2.0f);
VertexShaderConstant[21] = ( 1.0f, 1.0f, 1.0f, 1.0f );
VertexShaderConstant[22] = ( 0.75f, 0.75f, 0.75f, 0.95f );
VertexShaderConstant[23] = ( 1.00f, 1.00f, 1.00f, 1.00f );
// Camera Information
VertexShaderConstant[24] = ;
// FillMode = Wireframe;
ColorOp[0] = Modulate;
ColorArg2[0] = Diffuse;
ColorArg1[0] = Texture;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Disable;
AlphaOp[1] = Disable;
Texture[0] = ;
PixelShader = ;
AlphaBlendEnable = True;
SrcBlend = One;
DestBlend = InvSrcAlpha;
// CullMode = None;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to World Space
add r0,r0,-c24 // Get a vector toward the camera position,
// this is the camera direction
// Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = (camera vector)
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
dp3 r3,r0,r1 // Dot product Cam*Normal
mul r2,c20,r3
mad oT0.xyz,r2,r1,r0 // Compute reflection vector
// (1-cos)^4 = approx fresnel
add r0,c23,r3 // Complement color
mul r1,r0,r0 // Square
mul r0,r1,r1 // 4th
mul r0,r0,c22
mov r1,c9
// add r0, r0, c10 // Add in specular
add oD0,r0,r1 // Put into Diffuse Color
};
}
}
Exercise 5C
//
// Effect File Workshop Exercise 5C
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
//
vector lhtR; // Light direction
matrix mWld; // World
matrix mTot; // Total
vector vCPS; // Camera position
texture tEnv; // Environment texture
texture tDif;
vector matD; // Object diffuse material color
// Background color
DWORD BCLR = 0xFF000000;
pixelshader pNIL;
// string XFile = "sphere.x";
// string XFile = "f40.x";
string XFile = "viper.x";
string BIMG = "lobbyzneg.bmp";
// Technique names for display in viewer window
string tec0 = "Exercise 5b: Vertex Shader Specular Envmap";
technique tec0
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = ; // Diffuse
VertexShaderConstant[10] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient
// Properties of light
VertexShaderConstant[13] = (1.0f,0.0f,0.0f,1.0f); // Diffuse
VertexShaderConstant[14] = (0.0f,0.0f,0.0f,0.0f); // Specular
VertexShaderConstant[15] = (0.0f,0.0f,0.0f,0.0f); // Ambient
VertexShaderConstant[16] = ; // Light direction
// Blending Constants
VertexShaderConstant[20] = (-2.0f,-2.0f,-2.0f,-2.0f);
VertexShaderConstant[25] = ( 1.0f, 1.0f, 1.0f, 1.0f );
VertexShaderConstant[21] = ( 0.25f, 0.25f, 0.25f, 0.05f );
VertexShaderConstant[22] = ( 0.75f, 0.75f, 0.75f, 0.95f );
VertexShaderConstant[23] = ( 1.00f, 1.00f, 1.00f, 1.00f );
// Camera information
VertexShaderConstant[24] = ;
ColorOp[0] = Modulate;
ColorArg1[0] = Texture;
ColorArg2[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
ColorOp[1] = Add;
ColorArg1[1] = Current;
ColorArg2[1] = Specular;
AlphaOp[1] = Disable;
Texture[0] = ;
PixelShader = ;
// AlphaBlendEnable = True;
// SrcBlend = One;//SrcAlpha;
// DestBlend = InvSrcAlpha;
// CullMode = None;
SpecularEnable = True;
VertexShader =
decl
{
stream 0;
float v0[3]; // Position
float v3[3]; // Normal
float v7[3]; // Texture coord1
float v8[3]; // Texture coord2
}
asm
{
vs.1.1 // Version number
m4x4 oPos, v0, c4 // Transform point to projection space
m4x4 r0,v0,c0 // Transform point to World Space
add r0,r0,-c24 // Get a vector toward the camera position,
// this is the camera direction
// Normalize
dp3 r11.x,r0.xyz,r0.xyz // Load the square into r1
rsq r11.xyz,r11.x // Get the inverse of the square
mul r0.xyz,r0.xyz,r11.xyz // Multiply, r0 = (camera vector)
m3x3 r1,v3,c0 // Transform normal to world space, put in r1
dp3 r3,r0,r1 // Dot product Cam*Normal
mul r2,c20,r3
mad oT0.xyz,r2,r1,r0 // Compute reflection vector
// (1-cos)^4 = approx fresnel
add r0,c23,r3 // Complement color
mul r1,r0,r0 // Square
// mul r0,r1,r1 // 4th
// mul r0,r1,r1
add oD0,r1,c21
mul r0,r0,c22
mov r1,c9
mul oD1,r1,c25 // Blend in scaled diffuse mat color
// add oD0,r0,r1 // Put into Diffuse Color
// add oD0,r0,r1 // Put into Diffuse Color
};
}
}