Sign in to follow this  
Vectorg

Perspective texture mapping

Recommended Posts

Vectorg    104
I was looking around for information on perspective correct texture mapping and found lots of articles and tutorials, and read them all. They basically say use u/z, v/z, and 1/z, and you're done. But, obviously I'm not done and still have questions. I'm using a z-buffer, so I already know the z at each pixel, but it's not a perspective correct z. If I divide the u and v by z, then divide by 1/z, it's a wash. Where do each of these z's come from? Also, I'm not sure how to step through the edges and scan lines. How do I calculate the deltas? Thanks for the help.

Share this post


Link to post
Share on other sites
timw    598
for each pixel of your triangle you calculate 1/z through interpolation. you can change your zbuffer to a 1/z buffer also. you can't just divide your u by z. you need to interpolate with u/z instead of u. do you see the difference? then when calculating your true perspective correct u value you divide by 1/z. you cannot just interpolate u, and z and then take the division of the two.



suppose I am doing one scanline of a triangle
I have 1/zl for the left most point and 1/zr further say I have
ul, vl, ur, vr, for the left and right most points these are the texture coord
also I have xl and xr the pixel position for the start(left) and end(right) of my current scanline.

dZ = (1/zr - 1/zl)/(xr - xl)
z = 1/zl

u = ul/zl
v = vl/zl
dU = (ul/zl - ur/zr)/(xr - xl)
dV = (vl/zl - vr/zr)/(xr - xl)

for(x = xl;x <= xr; x++) { //xl and xr are the left and right most pixel positions of this scanline
plot(x,y, 1/z, u/z, v/z);
u += dU;
v += dV;
z += dZ;
}

Quote:

If I divide the u and v by z, then divide by 1/z

if you were doing this, you'd simply be dividing by z then multiplying, it would just give you back u,v.

Tim

Share this post


Link to post
Share on other sites
C0D1F1ED    452
Have a look at how Direct3D and OpenGL use homogeneous coordinates and a 4x4 projection matrix. After homogeneous division and viewport scaling, this results in (x, y, z, w) per vertex. 'z' is to be used -only- for the z-buffer. It is scaled by the projection matrix between 0.0 and 1.0. 'w' is used only for perspective correction and corresponds to 1/z where this 'z' denotes the 'z' before the projection matrix.

Confused? Sorry, the full explanation takes a few pages. But at least you have some keywords to google up. This approach also has great advantages for frustum clipping. In time you'll notice that the approach taken by hardware APIs is optimal.

For the actual rasterization I can only recommend Chris Hecker's Perspective Texture Mapping articles. They are worth gold for creating a flawless rasterizer with perspective texture mapping so read them ten times if you have to.

Don't hesitate to ask for some clarification!

Share this post


Link to post
Share on other sites
Vectorg    104
Thanks for the replies, and I do need some clarification if you don't mind.

Tim, did you really mean:

dU = (ul/zl - ur/zr)/(xr - xl)
dV = (vl/zl - vr/zr)/(xr - xl)

or...

dU = (ur/zr - ul/zl)/(xr - xl)
dV = (vr/zr - vl/zl)/(xr - xl)

C0D1F1ED, I have looked at Chris Hecker's excellent articles but am confused when he says that x' is derived from x/z and interpolated from x0' to x1'. My scan lines are already projected into screen space when I get to the texturing, so the only interpolation for x is by exactly 1 each pixel. What am I missing?

Thanks.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this