From f5ac6b8172eee83399e3789decf2c51119f38950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Tue, 19 Apr 2022 11:02:07 +0200 Subject: [PATCH] feat: fin du projet KEKW --- PerspectiveCorrectRasterizer.java | 4 ++++ Renderer.java | 28 +++++++++++++--------------- Texture.java | 10 ++++++++-- TextureShader.java | 7 ++++++- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/PerspectiveCorrectRasterizer.java b/PerspectiveCorrectRasterizer.java index 9f4194e..b5a9b3c 100644 --- a/PerspectiveCorrectRasterizer.java +++ b/PerspectiveCorrectRasterizer.java @@ -38,11 +38,15 @@ public class PerspectiveCorrectRasterizer extends Rasterizer { Vector3 v = new Vector3(1.0, (double) x, (double) y); Vector bar = C.multiply(v); + if ((bar.get(0) >= 0.0) && (bar.get(1) >= 0.0) && (bar.get(2) >= 0.0)) { + double oneOverZ = bar.get(0) / v1.getDepth() + bar.get(1) / v2.getDepth() + bar.get(2) / v3.getDepth(); + for (int i = 0; i < numAttributes; i++) { + double aOverZ = bar.get(0) * v1.getAttribute(i) / v1.getDepth() + bar.get(1) * v2.getAttribute(i) / v2.getDepth() + bar.get(2) * v3.getAttribute(i) / v3.getDepth(); diff --git a/Renderer.java b/Renderer.java index c7e295a..79194b5 100644 --- a/Renderer.java +++ b/Renderer.java @@ -26,7 +26,7 @@ public class Renderer { // shader = new SimpleShader(screen); shader = new PainterShader(screen); rasterizer = new PerspectiveCorrectRasterizer(shader); - rasterizer = new Rasterizer(shader); + // rasterizer = new Rasterizer(shader); xform = new Transformation(); xform.setLookAt(scene.getCameraPosition(), scene.getCameraLookAt(), scene.getCameraUp()); @@ -145,14 +145,14 @@ public class Renderer { /* wireframe rendering */ renderWireframe(); // screen.swapBuffers(); - wait(3); + wait(1); /* solid rendering, no lighting */ screen.clearBuffer(); shader.reset(); renderSolid(); screen.swapBuffers(); - wait(3); + wait(1); /* solid rendering, with lighting */ screen.clearBuffer(); @@ -163,19 +163,17 @@ public class Renderer { wait(1); /* solid rendering, with texture */ - /* - * screen.clearBuffer (); - * TextureShader texShader = new TextureShader (screen); - * texShader.setTexture ("data/brick.jpg"); - * shader = texShader; - * rasterizer.setShader (texShader); - * setLightingEnabled (true); - * renderSolid (); - * screen.swapBuffers (); - * wait (1); - */ + screen.clearBuffer(); + TextureShader texShader = new TextureShader(screen); + texShader.setTexture("data/brick.jpg"); + shader = texShader; + rasterizer.setShader(texShader); + setLightingEnabled(true); + renderSolid(); + screen.swapBuffers(); + wait(1); - wait(5); + wait(60); screen.destroy(); System.exit(0); } diff --git a/Texture.java b/Texture.java index e262c45..01a5328 100644 --- a/Texture.java +++ b/Texture.java @@ -28,8 +28,14 @@ public class Texture { */ public Color sample(double u, double v) { - /* A COMPLETER */ + double x = u * width; + double y = v * height; - return new Color(0, 0, 0); + int px = (int) Math.floor(x); + int py = (int) Math.floor(y); + + Color couleur = new Color(image.getRGB(px, py)); + + return couleur; } } diff --git a/TextureShader.java b/TextureShader.java index 74c47ba..b59ceb7 100644 --- a/TextureShader.java +++ b/TextureShader.java @@ -1,3 +1,5 @@ +import java.awt.Color; + /** * Simple shader that just copy the interpolated color to the screen, * taking the depth of the fragment into acount. @@ -34,8 +36,11 @@ public class TextureShader extends Shader { if (depth.testFragment(fragment)) { /* The Fragment may not have texture coordinates */ try { + double u = fragment.getAttribute(7) % 1; + double v = fragment.getAttribute(8) % 1; - /* à compléter */ + Color couleur = texture.sample(u, v); + screen.setPixel(fragment.getX(), fragment.getY(), couleur); } catch (ArrayIndexOutOfBoundsException e) { screen.setPixel(fragment.getX(), fragment.getY(), fragment.getColor());