|
Scenergy #02
31 декабря 1999 |
|
Coding - Texture Mapping - Implementation of SaiR00S/EI.

TEXTURE MAPPING-ESPECIALLY 4 SCENERGY
(C) 1999 SaiR00S/EI
The essence of the linear texture mapping
is a linear interpolation
coordinates of the polygon and their corresponding
texture coordinates.
As the landfill is most often
selected triangle, although described
following algorithm is suitable for any
landfill.
Thus, the polygon is a triangle,
all of whose vertices have a pair of coordinates
(X, Y) and related textural
coordinates (U, V). By polygon, we
move from top to bottom and from left to right,
ie when moving from top to bottom we
increase at each vertical step
Y coordinate of the triangle at
simultaneous linear interpolation
X coordinate and texture coordinates (in
That will have the contour of the polygon and
corresponding contour triangle
texture), and when moving from left to right,
increasing coordinate of the X-coordinate of
the left border of the contour to the right to
unit, perform linear interpolation
texture and set the coordinates Xi, Yj
color value from the texture coordinates
Up, Vq.
The first thing to do - it
sort the coordinates of the triangle
vmeste with texture coordinates in
ascending order of the coordinates of Y, ie
If vert1.y> vert2.y then
swap (vert1, vert2);
If vert2.y> vert3.y then
swap (vert2, vert3);
If vert3.y> vert1.y then
swap (vert3, vert1);
Or (Lexis STORM'a):
LD HL, (VERT1); Take X, Y coordinates
LD DE, (VERT2); you have a triangle
LD BC, (VERT3);
EXX
LD HL, (VERT1 +2); Take textural
LD DE, (VERT2 +2); coordinates U, V
LD BC, (VERT3 +2);
EXX
LD A, D
CP H
JR NC, NOSWAP1
EX DE, HL
EXX
EX DE, HL
EXX
NOSWAP1 LD A, B
CP H
JR NC, NOSWAP2
LD A, L, L, C, C, A
LD A, H, H, B, B, A
EXX
LD A, L, L, C, C, A
LD A, H, H, B, B, A
EXX
NOSWAP2 LD A, B
CP D
JR NC, NOSWAP3
LD A, E, E, C, C, A
LD A, D, D, B, B, A
EXX
LD A, E, E, C, C, A
LD A, D, D, B, B, A
EXX
NOSWAP3 LD (VERT1), HL
LD (VERT2), DE
LD (VERT3), BC
EXX
LD (VERT1 +2), HL
LD (VERT2 +2), DE
LD (VERT3 +2), BC
EXX
The result is a picture
shown in the figure. In this case,
inflection point is on the left
respectively, in the left half
triangle have 2 faces, and the right -
one.
vert1
,,
,,
,,
,,
,,
H1,,
,,
,,
,, H
,,
vert2,
'U,
'U,
'U,
H2 'u,
'U,
u,
<W> 'u
'' U
vert3
Ha below:
H - Maximum height of the triangle
H1 - the height of ribs (vert1, vert2);
H2 - the height of ribs (vert2, vert3);
W - maximum width of the triangle
triangle of X. Determined
it follows:
t = (vert2.y-vert1.y) / (vert3.y-vert1.y)
w = (vert1.x + t * (vert3.x-vert1.x))-vert2.x
If H and / or W are zero, then
Draw a triangle is not necessary.
Next, we determine which side
is an inflection point in the triangle.
This is done checking the sign of W.
If this value is positive, then the point
inflection - the left is negative - on the right.
If w> 0 then "point" on left
else "point" on right
Then perform a linear interpolation
X coordinate of the triangle and texture
coordinates U, V. Interpolation can be
conduct the formula below, or
by Brezenhemu - as you like, but
the second option more quickly (although, for small
number of polygons that we have to
Spectrum, it's almost not noticeable).
So, if the inflection point on the left (W> 0);
then you need to draw two faces to the left and one
on the right:
Building a left-hand side of the triangle:
h1 = vert2.y-vert1.y
DeltaLeftX1 = (vert2.x-vert1.x) / h1
DeltaLeftU1 = (vert2.u-vert1.u) / h1
DeltaLeftV1 = (vert2.v-vert1.v) / h1
h2 = vert3.y-vert2.y
DeltaLeftX2 = (vert3.x-vert2.x) / h2
DeltaLeftU2 = (vert3.u-vert2.u) / h2
DeltaLeftV2 = (vert3.v-vert2.v) / h2
X: = vert1.x;
For i = 0 to h1 do
Begin
TableLeftX [i]: = X;
TableU [i]: = U;
TableV [i]: = V;
X: = X + DeltaLeftX;
U: = U + DeltaLeftU;
V: = V + DeltaLeftV;
End;
For i = h1 to h2 do
Begin
TableLeftX [i]: = X;
TableU [i]: = U;
TableV [i]: = V;
X: = X + DeltaLeftX2;
U: = U + DeltaLeftU2;
V: = V + DeltaLeftV2;
End;
Construct the right-hand side of the triangle:
h = vert3.y-vert1.y;
DeltaRightX = (vert3.x-vert1.x) / h;
For i = 0 to h do
Begin
TableRightX [i]: = X;
X: = X + DeltaRightX;
End;
Here:
TableLeftX [] - the table containing the X
coordinates of the left half
guilty of a triangle;
TableRightX [] - the same for the right position
guilt;
TableU [] - the table containing the U
coordinates of the left half
treuglnika guilt;
TableV [] - the same for V-coordinates
DeltaLeftX - constant interpolation
(On the ZX should be considered
Camping with the fixed point 8.8);
DeltaRightX - same thing.
If the inflection point is on the right
(W <0), then all the same, only the left
Draw one edge of the triangle, and
right - two.
Next we define the steps in texture,
which are constant for all
landfill (to ZX assume them fixed
point 8.8, and with the sign!):
DeltaU = (t * (u3-u1) + (u1-u2)) / w
DeltaV = (t * (v3-v1) + (v1-v2)) / w
Further, immediately draw a polygon:
i: = 0;
For Y: = vert1.y to (vert1.y + H) do
Begin
U: = TableU [i];
V: = TableV [i];
For X: = TableLeftX [i] to TableRigtX [i] do
Begin
{Puts an end to the coordinate (X, Y) color
from the texture coordinate (U, V)}
PutPixel (X, Y, Texture [U, V])
X: = X +1;
U: = U + DeltaU;
V: = V + DeltaV
End;
i: = i +1
End;
The inner loop would look like
follows (by the way, perhaps
faster ...):
LD A, H; V-coordinate in the texture
ADD HL, DE; to calculate the following
; Ordinate V
EXX
LD B, A
LD C, H; U-coordinate in the texture
ADD HL, DE; to calculate the following
; Ordinate U
LD A, (BC); take texel
EXX
LD (BC), A; put texel in bu
, Fer
INC C; increasing X-coordinates
; That
It is recalled that all (almost)
calculations are performed with the fixed point 8.8,
For example:
HL = HL, ie, H contains an integer part
number, and L - fractional.
Well, like all good luck in the coding.
Other articles:
Similar articles:
В этот день... 29 October