Browse Source

Fix lighting bug and enabled multiple lights in scene.

angel 7 years ago
parent
commit
d699646546
4 changed files with 23 additions and 21 deletions
  1. 10 13
      include/shader.h
  2. 7 3
      scenes/teapot/teapot_config.txt
  3. 3 3
      src/camera.cpp
  4. 3 2
      src/softwareRenderer.cpp

+ 10 - 13
include/shader.h

@@ -252,7 +252,7 @@ struct PBRShader : public IShader {
     Vector3f halfwayDir, radianceOut, ambient;
     Vector3f specular, kD, kS;
     float interpRough, interpAO, interpMetal;
-    float u, v, intPart;
+    float uTexture, vTexture, intPart;
 
     //BRDF functions
     Vector3f fresnelSchlick(float cosTheta, Vector3f &fresnel0 ){
@@ -294,7 +294,7 @@ struct PBRShader : public IShader {
         //Passing all lighting related data to tangent space
         for(int lIndex = 0; lIndex < numLights; ++lIndex){
             int indc2 = (lIndex*3) + index;
-            lightDirVal[indc2]  = TBN.matMultVec(lightPos[lIndex]);
+            lightDirVal[indc2]  = TBN.matMultDir(lightPos[lIndex]);
         }
         viewDir[index]   = TBN.matMultVec(cameraPos - M.matMultVec(vertex));
         
@@ -308,15 +308,15 @@ struct PBRShader : public IShader {
         interpViewDir  = viewDir[0] + (viewDir[1] - viewDir[0])* u + (viewDir[2] - viewDir[0]) * v;
 
         //Correcting UV's for tiling
-        u = std::modf(interpCoords.x, &intPart);
-        v = std::modf(interpCoords.y, &intPart);
+        uTexture = std::modf(interpCoords.x, &intPart);
+        vTexture = std::modf(interpCoords.y, &intPart);
 
         //Reading data from textures for use in lighting calculations
-        interpCol    = albedoT->getPixelVal(u, v);
-        interpAO     = ambientOT->getIntensityVal(u, v);
-        interpRough  = roughT->getIntensityVal(u, v);;
-        interpMetal  = metalT->getIntensityVal(u, v);
-        interpNormal = normalT->getPixelVal(u, v);
+        interpCol    = albedoT->getPixelVal(uTexture, vTexture);
+        interpAO     = ambientOT->getIntensityVal(uTexture, vTexture);
+        interpRough  = roughT->getIntensityVal(uTexture, vTexture);;
+        interpMetal  = metalT->getIntensityVal(uTexture, vTexture);
+        interpNormal = normalT->getPixelVal(uTexture, vTexture);
         interpNormal = interpNormal.normalized();
         interpViewDir = interpViewDir.normalized();
 
@@ -324,15 +324,12 @@ struct PBRShader : public IShader {
         radianceOut.zero();
         for(int light = 0; light < numLights; ++light ){
             int val = light*3;
-            //interpLightDir = lightColor[0];
-
-            interpLightDir = lightDirVal[0] +  (lightDirVal[1] - lightDirVal[0])* u +  (lightDirVal[2] - lightDirVal[0]) * v;
+            interpLightDir = lightDirVal[val] +  (lightDirVal[val + 1] - lightDirVal[val])* u +  (lightDirVal[val + 2] - lightDirVal[val]) * v;
             halfwayDir = (interpLightDir.normalized() + interpViewDir).normalized();
             nDotV = std::max(interpNormal.dotProduct(interpViewDir), 0.0f);
             nDotL = std::max(interpNormal.dotProduct(interpLightDir), 0.0f);
             F0corrected = (F0 * (1.0f-interpMetal)) + (interpCol * interpMetal);//Varying f0 based on metallicness of surface
 
-
             //We assume the only light in the scene is the sun so there is no attenuation
             
             //Setting up BRDF

+ 7 - 3
scenes/teapot/teapot_config.txt

@@ -14,18 +14,22 @@ rot 90.0 0 0.0
 sca 0.4 0.4 0.4 
 /
 //SECTION: lights
-l 1
+l 2
 l01 sun
 pos 1.0 0.0 0.0
 col 1.0 1.0 1.0
 /
 l02 sun
-pos 0.0 1.0 0.0
+pos 1.0 0.0 1.0
 col 1.0 1.0 1.0
 /
 l03 sun
 pos 0.0 0.0 1.0
-col 1.0 1.0 1.0
+col 0.0 0.0 1.0
+/
+l04 sun
+pos 1.0 1.0 1.0
+col 1.0 0.0 1.0
 /
 //SECTION: cameras
 c 

+ 3 - 3
src/camera.cpp

@@ -14,9 +14,9 @@ void Camera::update(){
     float radius = 2;
     float camX   = std::sin(t/6000) * radius;
     float camZ   = std::cos(t/6000) * radius;
-    position.x   = 0;
-    position.y   = 0;
-    position.z   = 2;
+    position.x   = camX;
+    position.y   = camX;
+    position.z   = camZ;
     target.z     = 0;
     viewMatrix   = Matrix4::lookAt(position,target,up);
     cameraFrustrum.updatePlanes(viewMatrix, position);

+ 3 - 2
src/softwareRenderer.cpp

@@ -68,7 +68,7 @@ void SoftwareRenderer::drawTriangularMesh(Model * currentModel){
 
     shader.numLights  = mNumLights;
     shader.lightCol = lColor;
-    shader.lightDirVal = lightDir;
+    
     shader.lightPos = lightPositions;
 
 
@@ -79,8 +79,9 @@ void SoftwareRenderer::drawTriangularMesh(Model * currentModel){
     int count = 0;
     Vector3f dummyDir; //TO DO FIX THIS
 
-    //#pragma omp parallel for private(trianglePrimitive, normalPrim, uvPrim, tangentPrim) firstprivate(shader)
+    #pragma omp parallel for private(trianglePrimitive, normalPrim, uvPrim, tangentPrim, lightDir) firstprivate(shader)
     for (int j= 0; j < numFaces; ++j){
+        shader.lightDirVal = lightDir;
         //Current vertex and normal indices
         Vector3i f = (*vIndices)[j];
         Vector3i n = (*nIndices)[j];