Jump to content
  • Advertisement
Sign in to follow this  
Creativ

Raytracing a Box

This topic is 2615 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,

I'm currently working on a small Raytracer in Python+CUDA and I'm kinda stuck right now.

Basically the raytracer should just display some Boxes for the beginning, but I'm already having trouble with this.
The Camera is currently always looking at (0,0,0) and if the camera is at e.g. (8,8,4) (like in the first Screenshot) everything is working fine, but
when the camera is at (-8,-8,-4) (second screenshot) it renders the last box and not the first as I want it to.
091e6ace9e847a6be61a48b0c173295f.png 98bc57e47bea545489118a125d06e08a.png


And here is the Code for shooting the Ray (this one gets called for each pixel):

__device__ Color3i shootRay(int x, int y) {
Ray ray;
ray.org = make_float3(cam.x, cam.y, cam.z);
ray.t = 999999;

// Calculate Direction
ray.dir.x = ( 2.0f * ((x/(float)resX - 0.5)*aspect) * xAxis.x)
+ ( 2.0f * (y/(float)resY - 0.5) * yAxis.x)
+ (focus * zAxis.x);
ray.dir.y = ( 2.0f * ((x/(float)resX - 0.5)*aspect) * xAxis.y)
+ ( 2.0f * (y/(float)resY - 0.5) * yAxis.y)
+ (focus * zAxis.y);
ray.dir.z = ( 2.0f * ((x/(float)resX - 0.5)*aspect) * xAxis.z)
+ ( 2.0f * (y/(float)resY - 0.5) * yAxis.z)
+ (focus * zAxis.z);



Voxel* hit;
bool hasHit = false;
for(unsigned int i=0;i<VOXELCOUNT;i++) {
if(rayIntersectsVoxel(ray, voxels)) {
hit = &voxels;
hasHit = true;
}
}

if(hasHit)
return hit->color;

Color3i c;
c.r = 0;
c.g = 0;
c.b = 0;
return c;
}


And the algorithm for checking ray against a box did I get from here:
http://www.siggraph....ce/rtinter3.htm

And here is my code for it:
__device__ bool rayIntersectsVoxel(Ray ray, Voxel v) {
// http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm
// check for intersection with voxel
float tnear = -9999999;
float tfar = 9999999;

if(ray.dir.x == 0) {
// Parallel
if(ray.org.x < v.min.x || ray.org.x > v.max.x )
return false;
}else{
float t1 = (v.min.x - ray.org.x) / ray.dir.x;
float t2 = (v.max.x - ray.org.x) / ray.dir.x;

if(t1 > t2) {
// Swap
float tmp = t1;
t1 = t2;
t2 = tmp;
}

if(t1 > tnear) tnear = t1;
if(t2 < tfar) tfar = t2;

if(tnear > tfar)
return false; // Box missed

if(tfar < 0)
return false;
}

if(ray.dir.y == 0) {
// Parallel
if(ray.org.y < v.min.y || ray.org.y > v.max.y )
return false;
}else{
float t1 = (v.min.y - ray.org.y) / ray.dir.y;
float t2 = (v.max.y - ray.org.y) / ray.dir.y;

if(t1 > t2) {
// Swap
float tmp = t1;
t1 = t2;
t2 = tmp;
}

if(t1 > tnear) tnear = t1;
if(t2 < tfar) tfar = t2;

if(tnear > tfar)
return false; // Box missed

if(tfar < 0)
return false;
}

if(ray.dir.z == 0) {
// Parallel
if(ray.org.z < v.min.z || ray.org.z > v.max.z )
return false;
}else{
float t1 = (v.min.z - ray.org.z) / ray.dir.z;
float t2 = (v.max.z - ray.org.z) / ray.dir.z;

if(t1 > t2) {
// Swap
float tmp = t1;
t1 = t2;
t2 = tmp;
}

if(t1 > tnear) tnear = t1;
if(t2 < tfar) tfar = t2;

if(tnear > tfar)
return false; // Box missed

if(tfar < 0)
return false;
}

if(tnear > ray.t)
return false;

ray.t = tnear;
return true;
}



I hope you can help me, because I've been stuck with this bug for quite some time now and I just can't figure it out.

Greets,
Dennis

Share this post


Link to post
Share on other sites
Advertisement
You should return the color of the NEAREST hit voxel. (if that doesn't already happen :) )

Share this post


Link to post
Share on other sites
I think I'm doing it.
rayIntersectsVoxel only returns true if it's the closest hit voxel:
if(tnear > ray.t)
return false;

and so hit should only contain the closest hit voxel, doesn't it?

Share this post


Link to post
Share on other sites
Thank you so much!

You can't believe how much time I spend trying to fix this freaking bug.
I didn't work with C or C++ for quite some time so I just forgot that I have to use a pointer....

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.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!