Jump to content
  • Advertisement
Sign in to follow this  
UnrealSolo

OpenGL optimal tessellation for use with standard lights.

This topic is 3868 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, Im looking at using the standard lights and using tessellation to get a good result, but I cant seem to come up with or find a particularly good routine. I have alread split the polygon at the point perpendicular to the light source, and done some more splitting but although it is a fair bit better it is obviously not an optimal solution. I think I need to keep splitting each polygon along a line of same brightness if the difference in brightness acrross the polygon is significant. im looking to do this within opengl 1.1. has anyone got any good solutions they know of? thanks.

Share this post


Link to post
Share on other sites
Advertisement
Hmm, I remember having this problem way back, when I wrote my first radiosity solver that would use meshed vertex colours... *shudder* Oh dear, how could I ever live without PRT maps ;)

Anyway, the basic idea is to analyse the gradients over a triangle, and split along the direction where the gradient function becomes too non-linear. Or in other words, where a linear approximation of the gradient function yields an error term larger than some quality threshold you define (or the user).

Keep in mind that linear gradients can be very well represented by Gouraud style shading, so relying on gradient differences alone will get you too much tesselation where you don't really need it. And it can easily miss triangles that really need more tesselation (imagine a blob of light at the center of a face, with all three vertices black).

Obviously, in practice this is not that easy. You have to take special cases into account, such as light sources that only affect the interior or a single edge of a face. Or shadow boundaries, penumbra, and the like.

This stuff is called "discontinuity meshing", a Google search on these terms will get you plenty of information.

That said, may I ask why you would want to do this ? Good adaptive meshing algorithms can quickly become very complex. There are plenty of other, and better methods like lightmaps (also works on OGL 1.1), and a virtually unlimited choice of per-pixel lighting methods.

Share this post


Link to post
Share on other sites
per pixel ligting is cool, ive tried shaders to do it, but can it be done without shaders / I need a solution that will work on limited hardware,
ie no pixel shader/ opengl 1.1

I was thinking tessellation would be an easy method, but like all things turns out to be more dificult than i thought would be the case with just choping up some triangles wich in itself is fairly easy.

I looked for discontinuity meshing and theres loads of hits, but mostly descriptions, are there any routines about?

I would of thought lightmaps still require some effort ...

Share this post


Link to post
Share on other sites
If you have register combiners available, you can search the internet for Ron Frazier, he made a pretty amazing (well, amazing for that time) per pixel lighting demo a long, long time ago which ran on really, really old hardware. There was a long comprehensive article with that demo too.

Other than that, I think you might be able to do some nasty trickery using ARB_texture_env_dot3 to get something like N dot L lighting... but I'd rather bite off my arm than attempt to do that (shaders are so much nicer).

Share this post


Link to post
Share on other sites
well ive spent a while going through some of those hits,
not seen much in the way of anything close to code,
but ive come up with an idea for tessellation anyway, ...

take all the lines between any two points wich spilt a quad or larger polygon
and use the one with the highest non linearity to split it. so you eventually end up with triangles.

then do the same sort of thing with remaining triangles using one point and mid point of opposite side, stopping when the worst linearity is good enough.

just need to come up with a good way to measure non linearity, maybe measure linearity along a line that runs through the mid point of the splitting line through the closest point to the light.

im not sure if register combiner are availabale but i doubt it very much.

Share this post


Link to post
Share on other sites
Ive finnally managed to get a fairly simple tessellation working, and it looks reasonable.

I just compute the actual correct lighting at the vertexes and at the midpoints of each line, then compare the interpolated, value, and split the polygon if theres a significant error.

I also do the same for the center, and I also intend to do the same for each point on the polygon closest to each light.

took me quite a while cos I just generally made a hash of it to start with lol,
I also tried to do it other ways by investigating the linearity but that was too cumbersom and not very effective, actually computing the interpolated value and comparing to the correct value at specific points proved far more effective and simpler.

it works for 8 lights, now all I have to do is extend it to more lights, by changing the lights in use to the nearest ones.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!