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
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); } }