prev up next

Implementation

Die Classe FlatTextureMapper.java , die in der Praktikumszeit aus TextureMapper.java entstanden ist, führt wie der GreyFlatRenderer.java
Back-Face-Culling und Clipping durch.

Aber im Vergleich zu dem Konstruktor von GreyFlatRenderer.java erstellt der Konstruktor von FlatTextureMapper.java zwei zweidimensionale Integer-Arrays (colors und umcolors)

  public TextureMapper() {
    clipper = new WCClipper();
    bfculler = new BFCuller();

    colors = new int[256][256];
    for (int i=0; i<256; i++) {
      for (int j=0; j<256; j++) {
        colors[i][j] = (int)Math.round(i * j / 255f);
      }
    }
    umcolors = new int[256][256];
    for (int i=0; i<256; i++) {
      for (int j=0; j<256; j++) {
        umcolors[i][j] = colors[255 - i][j];
      }
    }
  }
die folgende Form haben
(colors erhält in i-ter Zeile und j-ter Spalte den Eintrag (i * j) / 256 (gerundet) und umcolors erhält an der Stelle den Eintrag ((255 - i) * j) / 256 (gerundet)),
was entspricht in dem collors-Array für den i-ten Farb-Wert der j-ten Interpolationsstufe.

  0.. ... ..127 128.. ... ..255
0 0.. ... ... ... ..0
1 0.. ... ..0 1.. ... ..1
2 0.. ..0 1.. ..1.. ..1 2.. ..2
::: ::: ::: ::: ::: :::
128 0.. ... ..63 64.. ... ..128
::: ::: ::: ::: ::: :::
255 0.. ... ..127 128.. ... ..255

Nach der Triangulisierung, so wie in GreyFlatRenderer.java werden die Intensität-Werte an den Eckpunkten genommen, gemittelt und an die Scanline-Methode übergegeben.

  shade(triangle, (l0+l1+l2)/3.0f); // l0, l1, l2 Intensität an den Eckpunkten.
  :::
  putScanline(y, xAC, xAB, zAC, zAB, uAC, uAB, vAC, vAB, wAC, wAB, vA.face, fi); // fi für gemittelte Intensität von {\bf l0, l1, l2}.

Die Umsetzung der Farbwert-Interpolation in JAVA-Code ist nicht schwer. Hier ist der Ausschnitt aus dem Code, der genau die Umsetzung durchführt.

    int alpha = 255 << 24;		// bereitet Endform der Farbe vor
    int rmask = 255 << 16;		// bereitet Maske fuer Rot
    int gmask = 255 << 8;		// bereitet Maske fuer Gruen
    int bmask = 255;			// bereitet Maske fuer Blau
    int r,g,b;				// Farben selbst
    float fix;

    if (x1 == x2) {			// Linie ist Punkt
      int x = (int)x1;

					// hole den Texel-Farbwert
      int col = f.tex.getTexel(f.uMode.getUInt(u1/w1,f.tex), f.vMode.getVInt(v1/w1,f.tex));

      r = rmask & col;			// bekomme aus Texel-Farbe nur Rot-Anteil
      g = gmask & col;			// bekomme aus Texel-Farbe nur Gruen-Anteil
      b = bmask & col;			// bekomme aus Texel-Farbe nur Blau-Anteil

      r = r >> 16;			// ist < 256
      g = g >> 8;			// ist < 256
      fix = fi * 2f;

      if (fi < 0.5f) {
        int fixint = (int)(255 * fix);
        r = colors[r][fixint];		// hole den interpolierten Wert fuer Rot
	r = r << 16;
	g = colors[g][fixint];		// hole den interpolierten Wert fuer Gruen
	g = g << 8;
					// hole den interpolierten Wert fuer Blau
        col = ((alpha | r) | g) | colors[b][fixint];	// und setze col auf interpolierte Gesamtfarbe	\newline
      }
      else {
        fix --;				// fi > 1 , ernidrige um 1
        int fixint = (int)(255 * fix);
        r += umcolors[r][fixint];	// hole den interpolierten Wert fuer Rot
	r = r << 16;
	g += umcolors[g][fixint];	// hole den interpolierten Wert fuer Gruen
	g = g << 8;

        col = ((alpha | r ) | g ) | (umcolors[b][fixint] + b);
      }
  }


prev up next