[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
Well, I finally managed to get my hands on this book describing an algorithm
for phong shading using only two additions. I'll use ù for the dot-product (I
assume you know how to calculate a dot-product :-)
Here goes:
For the intensity at a certain point in a triangle with normals N1, N2 and N3
at the vertices, and with a vector L pointing to the light-source:
ax+by+c
I(x,y) = ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
û(d*xý + e*x*y + f*yý + gx + hy + i)
where:
a = Lu ù N1
b = Lu ù N2
c = Lu ù N3
d = N1 ù N1
e = 2N1 ù N2
f = N2 ù N2
g = 2N1 ù N3
h = 2N2 ù N3
i = N3 ù N3
L
Lu = ÄÄÄ
³L³
I hope the extended characters come thru :-).
This can be simplified (?) to:
I(x,y) = ê5*xý + ê4*x*y + ê3*yý + ê2*x + ê1*y + ê0
with: c
ê0 = ÄÄÄ
ûi
2*b*i - c*h
ê1 = ÄÄÄÄÄÄÄÄÄÄÄ
2*i*ûi
2*a*i - c*g
ê2 = ÄÄÄÄÄÄÄÄÄÄÄ
2*i*ûi
3*c*hý - 4*c*f*i - 4*b*h*i
ê3 = ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
8*iý*ûi
3*c*g*h - 2*c*e*i - 2*b*g*i - 2*a*h*i
ê4 = ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4*iý*ûi
3*i*gý - 4*c*d*i - 4*a*g*i
ê5 = ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
8*iý*ûi
Which can be rewritten as:
I(x,y) = ê5*xý + x(ê4*y + ê2) + ê3*yý + ê1*y + ê0
Thus needing only 2 additions per pixel.
}
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]