Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


[Ray Tracing] How to accumulate reflections?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Icebone1000   Members   -  Reputation: 1113

Like
0Likes
Like

Posted 04 September 2012 - 06:19 AM

Im not sure on how to apply the reflection coefficient over the recursion (more like "when" then "how").

Heres my scene with reflections, Im using "ILLUMINATION_MATERIAL_COLOR" as illumination, so its supposed to be really just the color, no illumination (for clarity of what the reflections are doing)
Posted Image

One problem is that I dont know how to let the clear/bg color with reflections on, because whenever a ray miss, it will add the clear color to the final color, making the scene too bright, so now Im returning black on ray miss...(any tips on that?)

And here is how Im applying the reflections:
// inside TraceCloserRayHitPlusReflection

... ray hit tests here

if( !candidatehit.hit ) return Color3();// return returnColor adds too many times the bg color, it sucks
   returnColor = ((this->*m_illuminationMethodFunction)(itCandidateShape, candidatehit));
   // reflect ray:
  
   // update global Kr, apply to color:
   globalKr_p *= m_shapes[itCandidateShape]->material.kr;
   if( globalKr_p < 0.001f ) return returnColor * globalKr_p;
   ray_p.direction = ReflectionVector(-ray_p.direction, candidatehit.normal );
   ray_p.origin = candidatehit.point;
   // add reflection contribution, modulated by reflection coefficient
   returnColor += ( TraceCloserRayHitPlusReflection( ray_p, globalKr_p, returnColor ) * globalKr_p );
   //returnColor*= globalKr_p;
   if( returnColor.r > 1.0f )
	returnColor.r = 1.0f;
   if( returnColor.g > 1.0f )
	returnColor.g = 1.0f;
   if( returnColor.b > 1.0f )
	returnColor.b = 1.0f;

   return returnColor;

Do you think Im doing it the right way?
I was expecting more attenuation on the reflections (due distance maybe?), but the reflection is allways so mirror perfect..

Heres with phong:
Posted Image

I cant say if it is right, looks uglier then what I was expecting..

Edited by Icebone1000, 04 September 2012 - 06:21 AM.


Sponsor:

#2 Bacterius   Crossbones+   -  Reputation: 9056

Like
0Likes
Like

Posted 04 September 2012 - 07:06 AM

If I remember correctly, you must multiply the running color by the reflected contribution (component-wise) instead of adding - this can be justified via energy conservation or some spectral theory. Then you might still be off by some constant factor, but it should look more realistic. I could be wrong though - try it out. Also! This means you start your ray at values (1, 1, 1) by definition, otherwise the image will be all black, obviously.

I was expecting more attenuation on the reflections (due distance maybe?), but the reflection is allways so mirror perfect..

Yes, perfect reflection won't do this for you. If you want to add this, you need to add Fresnel reflection, which'll attenuate the reflection depending on the angle between the incident ray and the surface normal, so you'll get realistic reflections. Also, instead of perfect reflection, you can make it so the rays are mostly reflected perfectly, but slightly jittered, which will make the reflected image blur out depending on its distance to the reflection plane - but for this you need to sample multiple rays per pixel, so you'll need to make modifications for this to work (you can also sort of fake it, but I wouldn't know).

One problem is that I dont know how to let the clear/bg color with reflections on, because whenever a ray miss, it will add the clear color to the final color, making the scene too bright, so now Im returning black on ray miss...(any tips on that?)

When a ray misses you have to stop the recursion - you are done. This'll fix your problem (I think, unless I misunderstood). If your ray instantly misses without hitting anything, you can give it whatever color you want (the background color) which is only used to color those "background pixels" and never comes into play anywhere else. Ideally, your rays should always hit something (even if just a skybox/skysphere) but having a background color is fine too.

Edited by Bacterius, 04 September 2012 - 07:20 AM.

The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS