Exercise 1: Diffuse Lighting
//
// Effect File Workshop Solution for Exercise 1
// Copyright (c) 2001 Microsoft Corporation. All rights reserved.
//
vector lhtR; // Direction of light
vector matD; // Object diffuse material color
matrix mWld; // World
matrix mTot; // Total
// Load model
string XFile = "sphere.x";
// Background color
DWORD BCLR = 0xff333333;
// No pixel shader
pixelshader pNIL;
// Technique names for display in viewer window
string tec0 = "Exercise 1a: Fixed Function Diffuse Lighting";
string tec1 = "Exercise 1b: Vertex Shader Diffuse Lighting";
/////////////////////////////////////////////////////////////////////////////
/////// Exercise 1a: Fixed Function Diffuse Lighting //////////
/////// Change diffuse material color to color from model, //////////
/////// rather than the current white material constant. //////////
/////////////////////////////////////////////////////////////////////////////
// Given: The app has already set the matrices before calling this technique.
technique tec0
{
pass P0
{
// Diffuse, specular, and ambient material colors of object
MaterialDiffuse = ; // Diffuse from object material diffuse
MaterialDiffuse = (0.0f,0.0f,1.0f,1.0f); // Diffuse from constant color
MaterialSpecular = (0.0f,0.0f,0.0f,0.0f);
MaterialAmbient = (0.0f,0.0f,0.0f,0.0f);
// Light Properties. lhtR, the light direction, is input from the shader app
LightType[0] = DIRECTIONAL;
LightDiffuse[0] = (1.0f,1.0f,1.0f,1.0f);
LightSpecular[0] = (0.0f,0.0f,0.0f,0.0f);
LightAmbient[0] = (0.0f,0.0f,0.0f,0.0f);
LightDirection[0] = ;
LightRange[0] = 100000.0f;
// Turn lighting on and use light zero
LightEnable[0] = TRUE;
Lighting = TRUE;
// Assign diffuse color to be used
ColorOp[0] = SelectArg1;
ColorArg1[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
// Only one color being used
ColorOp[1] = Disable;
AlphaOp[1] = Disable;
// Z-buffering to be used
ZEnable = true;
ZWriteEnable = true;
}
}
/////////////////////////////////////////////////////////////////////////////
/////// Exercise 1b: Vertex Shader Diffuse Lighting //////////
/////// Change diffuse material color to color from model, //////////
/////// rather than the current white material constant. //////////
/////////////////////////////////////////////////////////////////////////////
technique tec1
{
pass p0
{
// Load matrices
VertexShaderConstant[0] = ; // World Matrix
VertexShaderConstant[4] = ; // World*View*Proj Matrix
// Material properties of object
VertexShaderConstant[9] = (1.0f,1.0f,1.0f,1.0f); // Diffuse from constant color
VertexShaderConstant[9] = ; // Diffuse from object material diffuse
VertexShaderConstant[10] = (0.0f,0.0f,0.0f,0.0f); // Specular from constant color
VertexShaderConstant[11] = (0.0f,0.0f,0.0f,0.0f); // Ambient from constant color
// Light Properties. lhtR, the light direction, is input from the shader app
VertexShaderConstant[13] = (1.0f,1.0f,1.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
// Assign diffuse color to be used
ColorOp[0] = SelectArg1;
ColorArg1[0] = Diffuse;
AlphaOp[0] = SelectArg1;
AlphaArg1[0] = Diffuse;
// Only one color being used
ColorOp[1] = Disable;
AlphaOp[1] = Disable;
// Definition of the vertex shader, declarations then assembly
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.
m3x3 r0,v3,c0 // Transform normal to world Space, put result into r0.
dp3 r0,r0,-c16 // Dot product against light, r0 now has lighting
// constant in x, y, and z components (r,g,b).
mul r0,r0,c13 // Modulate against diffuse light color.
mov oD0,r0 // Put into diffuse color output.
};
}
}