Browse Source

Added working gouraud shading

angel 7 years ago
parent
commit
c13a569916
5 changed files with 13 additions and 16 deletions
  1. 2 2
      include/displayManager.h
  2. 1 1
      include/shader.h
  3. BIN
      models/.elephant.obj.swp
  4. 3 3
      src/camera.cpp
  5. 7 10
      src/softwareRenderer.cpp

+ 2 - 2
include/displayManager.h

@@ -13,8 +13,8 @@
 class DisplayManager{
 
     public:
-        const static int SCREEN_WIDTH  = 640; //640
-        const static int SCREEN_HEIGHT = 480; //480
+        const static int SCREEN_WIDTH  = 1280; //640
+        const static int SCREEN_HEIGHT = 960; //480
         const static int SCREEN_PITCH  = SCREEN_HEIGHT*sizeof(Uint32);
 
         //Dummy Constructor / Destructor

+ 1 - 1
include/shader.h

@@ -42,7 +42,7 @@ struct GouraudShader : public IShader {
 
     bool fragment(Vector3 &bari, Vector3 &color, float &depth, Vector3 &zVerts) override{
         //varying_intensity.print();
-        float intensity = varying_intensity.dotProduct(bari);
+        float intensity = bari.y*varying_intensity.x + bari.z*varying_intensity.y + bari.x*varying_intensity.z;
         color = rgb * intensity;
         depth = bari.dotProduct(zVerts);
         return false;

BIN
models/.elephant.obj.swp


+ 3 - 3
src/camera.cpp

@@ -10,11 +10,11 @@ Camera::Camera(){
 
 void Camera::update(){
     float t = static_cast<float>(SDL_GetTicks());
-    float radius = 5;
+    float radius = 4.0;
     float camX   = std::sin(t/4000) * radius;
     float camZ   = std::cos(t/4000) * radius;
-    position.x = 0;
+    position.x = camX;
     position.y = 0;
-    position.z = radius;
+    position.z = camZ;
     viewMatrix = Matrix4::lookAt(position,target,up);
 }

+ 7 - 10
src/softwareRenderer.cpp

@@ -66,7 +66,7 @@ void SoftwareRenderer::drawTriangularMesh(Mesh* triMesh){
     Vector3 normalPrim[3];
 
     //Initializing shader
-    FlatShader shader;
+    GouraudShader shader;
 
     //Basic light direction
 
@@ -79,10 +79,7 @@ void SoftwareRenderer::drawTriangularMesh(Mesh* triMesh){
         //printf("\nCurrent Face: %d\n",j);
         Vector3 f = (*vIndices)[j];
         Vector3 n = (*nIndices)[j];
-        //printf("Vertices\n");
-        //f.print();
-        //printf("Normals\n");
-        //n.print();
+
         //Pack vertices together into an array
         buildTri(f,trianglePrimitive, *vertices);
         buildTri(n,normalPrim, *normals);
@@ -90,17 +87,17 @@ void SoftwareRenderer::drawTriangularMesh(Mesh* triMesh){
         //Skip faces that are pointing away from us
         if (backFaceCulling(trianglePrimitive)) continue;
 
-        Vector3 N1 = trianglePrimitive[1] - trianglePrimitive[0];
-        Vector3 N2 = trianglePrimitive[2] - trianglePrimitive[0];
-        Vector3 N  = (N2.crossProduct(N1)).normalized();
+        // Vector3 N1 = trianglePrimitive[1] - trianglePrimitive[0];
+        // Vector3 N2 = trianglePrimitive[2] - trianglePrimitive[0];
+        // Vector3 N  = (N1.crossProduct(N2)).normalized();
 
         //Apply vertex shader
         for(int i = 0; i < 3; ++i){
             //trianglePrimitive[i].print();
             //normalPrim[i].print();
             //printf("\n");
-            Vector3 normal = (mCamera->viewMatrix).matMultVec(N);
-            trianglePrimitive[i] = shader.vertex(trianglePrimitive[i], MVP, N, lightDir.normalized(), i);
+            //Vector3 normal = (mCamera->viewMatrix).matMultVec(N);
+            trianglePrimitive[i] = shader.vertex(trianglePrimitive[i], MVP, normalPrim[i].normalized(), lightDir.normalized(), i);
         }
 
         //Clipping should occur here