Browse Source

Latest changes to attempt a fix for lighting bug.

angel 7 years ago
parent
commit
7294be0d0d
2 changed files with 14 additions and 12 deletions
  1. 9 7
      include/shader.h
  2. 5 5
      src/softwareRenderer.cpp

+ 9 - 7
include/shader.h

@@ -233,7 +233,9 @@ struct PBRShader : public IShader {
     Vector3f F0{0.04, 0.04, 0.04}, F0corrected; //Default value dielectric
     Vector3f F0{0.04, 0.04, 0.04}, F0corrected; //Default value dielectric
     float nDotL, nDotV, ambientInt = 0.01;
     float nDotL, nDotV, ambientInt = 0.01;
     int numLights;
     int numLights;
-    Vector3f *lightDirForInterp, *lightColor, *lightPos;
+    Vector3f *lightDirVal;
+    Vector3f *lightCol;
+    Vector3f *lightPos;
 
 
     //Variables set per vertex
     //Variables set per vertex
     Vector3f viewDir[3], texCoords[3];
     Vector3f viewDir[3], texCoords[3];
@@ -292,8 +294,7 @@ struct PBRShader : public IShader {
         //Passing all lighting related data to tangent space
         //Passing all lighting related data to tangent space
         for(int lIndex = 0; lIndex < numLights; ++lIndex){
         for(int lIndex = 0; lIndex < numLights; ++lIndex){
             int indc2 = (lIndex*3) + index;
             int indc2 = (lIndex*3) + index;
-            lightDirForInterp[indc2]  = TBN.matMultVec(lightPos[lIndex]);
-            //printf("%d\n",indc2);
+            lightDirVal[indc2]  = TBN.matMultVec(lightPos[lIndex]);
         }
         }
         viewDir[index]   = TBN.matMultVec(cameraPos - M.matMultVec(vertex));
         viewDir[index]   = TBN.matMultVec(cameraPos - M.matMultVec(vertex));
         
         
@@ -323,9 +324,10 @@ struct PBRShader : public IShader {
         radianceOut.zero();
         radianceOut.zero();
         for(int light = 0; light < numLights; ++light ){
         for(int light = 0; light < numLights; ++light ){
             int val = light*3;
             int val = light*3;
-            interpLightDir = lightColor[0];
-            //interpLightDir = lightDirForInterp[0] + (lightDirForInterp[1] - lightDirForInterp[0])* u + (lightDirForInterp[2] - lightDirForInterp[0]) * v;
-            halfwayDir = (interpLightDir + interpViewDir).normalized();
+            //interpLightDir = lightColor[0];
+
+            interpLightDir = lightDirVal[0] +  (lightDirVal[1] - lightDirVal[0])* u +  (lightDirVal[2] - lightDirVal[0]) * v;
+            halfwayDir = (interpLightDir.normalized() + interpViewDir).normalized();
             nDotV = std::max(interpNormal.dotProduct(interpViewDir), 0.0f);
             nDotV = std::max(interpNormal.dotProduct(interpViewDir), 0.0f);
             nDotL = std::max(interpNormal.dotProduct(interpLightDir), 0.0f);
             nDotL = std::max(interpNormal.dotProduct(interpLightDir), 0.0f);
             F0corrected = (F0 * (1.0f-interpMetal)) + (interpCol * interpMetal);//Varying f0 based on metallicness of surface
             F0corrected = (F0 * (1.0f-interpMetal)) + (interpCol * interpMetal);//Varying f0 based on metallicness of surface
@@ -347,7 +349,7 @@ struct PBRShader : public IShader {
             kS = F;
             kS = F;
             kD = (Vector3f(1.0) - kS);
             kD = (Vector3f(1.0) - kS);
             kD = kD * (1.0f - interpMetal); 
             kD = kD * (1.0f - interpMetal); 
-            radianceOut = radianceOut +  ( (kD * (interpCol * (1/M_PI)) + specular ) * nDotL * lightColor[light]);
+            radianceOut +=  ( (kD * (interpCol * (1/M_PI)) + specular ) * nDotL * lightCol[light]);
         }
         }
         
         
         //Simplistic ambient term
         //Simplistic ambient term

+ 5 - 5
src/softwareRenderer.cpp

@@ -52,9 +52,9 @@ void SoftwareRenderer::drawTriangularMesh(Model * currentModel){
     //Setting up lighting
     //Setting up lighting
     Vector3f lightDir[mNumLights * 3 ];
     Vector3f lightDir[mNumLights * 3 ];
     Vector3f lightPositions[mNumLights];
     Vector3f lightPositions[mNumLights];
-    Vector3f lightCol[mNumLights];
+    Vector3f lColor[mNumLights];
     for(int x = 0; x < mNumLights; ++x){
     for(int x = 0; x < mNumLights; ++x){
-        lightCol[x] = mLights[x].color;
+        lColor[x] = mLights[x].color;
         lightPositions[x] = mLights[x].position;
         lightPositions[x] = mLights[x].position;
     }
     }
 
 
@@ -67,8 +67,8 @@ void SoftwareRenderer::drawTriangularMesh(Model * currentModel){
     shader.cameraPos = mCamera->position;
     shader.cameraPos = mCamera->position;
 
 
     shader.numLights  = mNumLights;
     shader.numLights  = mNumLights;
-    shader.lightColor = lightCol;
-    shader.lightDirForInterp = lightDir;
+    shader.lightCol = lColor;
+    shader.lightDirVal = lightDir;
     shader.lightPos = lightPositions;
     shader.lightPos = lightPositions;
 
 
 
 
@@ -79,7 +79,7 @@ void SoftwareRenderer::drawTriangularMesh(Model * currentModel){
     int count = 0;
     int count = 0;
     Vector3f dummyDir; //TO DO FIX THIS
     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) firstprivate(shader)
     for (int j= 0; j < numFaces; ++j){
     for (int j= 0; j < numFaces; ++j){
         //Current vertex and normal indices
         //Current vertex and normal indices
         Vector3i f = (*vIndices)[j];
         Vector3i f = (*vIndices)[j];