User:Akopytov
Contact Information
Name: Andrei Kopytov
Seneca e-mail address: akopytov@learn.senecac.on.ca
Lighting
Instructions to incorporate advanced lighting into your game:
Download the full working solution here:
OR
Download just the files that have changes relevant to lighting here:
Copy from the files or manually code the following:
Configuration.h
- Increase the MAX_STR_ARRAYS macro by 1 (Line 46)
- Add two more elements to the Integer enum: GF_NO_ALGS and GF_DF_ALGO (Line 88-89)
- Add an element to the StrArray enum: GF_LITDESC (Line 127)
- Create a macro called LIGHT_DESCRIPTIONS (Line 331)
- Create an enum called LightAlgorithm (Line 389)
Context.cpp
- Allocate memory for str array and set it to LIGHT_DESCRIPTIONS (Line 67-69)
- Set the GF_NO_ALGS element to the number of algorithms (Line 70)
iUserDialog.h
- Add virtual void populateLightingList(void*) = 0; to the interface (Line 29)
UserDialog.h
- Add a wchar_t variable to store the lighting description (Line 34)
- Add void populateLightingList(void*); to the header file (Line 54)
UserDialog.cpp
- Set the previously created wchar_t variable to an empty string (Line 48)
- Call the populateLightingList(hwnd) function in populateUserDialog (Line 88)
- Create the void populateLightingList(void*) function (Line 150-161)
- Retrieve the selected algorithm and set its index into GF_DF_ALGO (Line 581-585)
- Store the lighting description inside of the wchar_t variable (Line 594)
iObject.h
- Declare the LightAlgorithm enum (Line 26)
- Declare the get and set functions for the input variables, remove the parameter from power() (Line 43-50)
Object.h
- Change the shine variable from float* to float (Line 41)
- Add a float variable for roughness (Line 42)
- Add a float variable for index of refraction (Line 43)
- Add a LightAlgorithm variable that will store the index of the algorithm to be used for the object (Line 45)
- Add a static iContext* variable under the protected list of variables (Line 58)
- Add the void hasContext(iContext* c) function to the Object class (Line 67)
- Remove the static iContext* variables from the derived classes (Line 138, 174, 196, 214)
- Define the get and set functions (Line 78-85)
Object.cpp
- Set the iContext* variable to NULL (Line 37)
- Remove the iContext* variables from the derived classes (Line 389, 475, 552, 572)
- Set the default values for shine, roughness and index (Line 65-67)
- Call the setAlgorithm function, passing in the value of GF_DF_ALGO (Line 69)
- Remove the code that initializes the shine variable's subsets, as it is no longer an array (Line 72-75)
- Set roughness and index variables to NULL (Line 113-114)
- Remove the conditional statement that deletes a shine array (Line 134-137)
- Set the input variables and algorithm to the values from the object being copied (Line 152-154, 156)
- Remove the code that instantiates shine as a new array (Line 168-172)
- Remove the code that destroys the shine array (Line 282-283)
Scene.cpp
- Pass the context to the Object class, and remove the code that passes the context to derived classes (Line 47-50)
Graphic.h
- Add the handles to the algorithm, roughness and refraction variables (Line 58-60, 131-133)
- Change the power variable in SubdividedGraphic from a FLOAT* to a FLOAT
Graphic.cpp
- Remove the parameter from the power() function (Line 112, 343)
- Get the addresses to the shader variables for the new handles (Line 121-123, 353-355)
- Set the values of the shader variables (Line 166-168, 398-400)
- Remove the code that initializes the power variable to an array (Line 243)
- Remove the code that deletes the power array (Line 295-296)
- Set the power variable to the src object's power value (Line 300)
- Remove the code that sets an array of powers (Line 305)
- Remove the index from the power variable (Line 397)
- Remove the code that deletes a power array (Line 448-449)
************************ Lighting Documentation v1.00 ************************ * Lighting with the programmable graphics pipeline currently requires the use of * the effects framework and works on the object level. This means the algorithm * with which you wish to illuminate your object will work on the entire object, not * a subset of that object. The inputs for the algorithm also work on the object level, * meaning all subsets will use the same values. * * To avoid bloating the object class, three variables will be used across the various * algorithms in different ways. It is very important to note that an algorithm may not * necessarily use all three variables in its calculations. Also, each algorithm may * accept different ranges of values from each of the variables it does use. The * lighting algorithms available for use in the framework are described below: * * Functions * --------- * power(), setPower(float) * getRoughness(), setRoughness(float) * getIndexOfRefraction, setIndexOfRefraction(float) * getAlgorithm(), setAlgorithm(LightAlgorithm) * * Inputs for setAlgorithm() * PHONG * BLINN_PHONG * COOK_TORRANCE * OREN_NAYAR * WARD_ANISO * ASH_SHIRLEY * * == Phong == * Isotropic * * Input Effective Range * power 0.0 - 1000 * * Makes objects look plastic * ========================================================================== * == Blinn-Phong == * Isotropic * * Input Effective Range * power 0.0 - 1000 * * Like Phong, but uses less instructions, also gives objects a plastic look * ========================================================================== * == Cook-Torrance == * Isotropic * * Input Effective Range * roughness 0.0 - 15.0 * index of refraction 0.0 - 10.0 * * Gives objects a metallic look * ========================================================================== * == Oren-Nayar == * Isotropic * * Input Effective Range * roughness 0.0 - 2.0 * * Diffuse only model, good for making objects look rough * ========================================================================== * == Ward Anisotropic == * Anisotropic * * Input Effective Range * roughness 0.0 - 2.0 * power 0.0 - 2.0 * * Allows the manipulation of specular lobe (change its shape) * ========================================================================== * == Ashikhmin-Shirley == * Anisotropic * * Input Effective Range * roughness 0 - 10000 * power 0 - 10000 * index of refraction 0.0 - 10.0 * * Good for making objects look metal or plastic, and can manipulate specular lobe * ========================================================================== * * For more information on lighting, check out: http://wiki.gamedev.net/index.php/D3DBook:Lighting