Last visited

Community Reputation

About BadEggGames

Hi
I have written a simple CPU raytracer which just generated this image:
I just realized that I am calculating the secondary rays origin incorrectly. I was simply adding a random number to the x and y of the origin point. This is fine when my lookat point is at the same height at my camera position but if it is higher or lower, my square aperture will be tilted. How do I find a random point in the aperture rectangle around my camera?
Some code:
//primary ray
Ray newRay = camera.GetRay(x, y, HEIGHT, WIDTH, antiX, antiY);
//convergent point on focal plane
Vec3 focalPoint = newRay.calculate(camera.focalLength);
double origX = randOrigin(generator);
double origY = randOrigin(generator);
Vec3 randomOrigin(newRay.origin.x + origX, newRay.origin.y + origY, newRay.origin.z);
//direction to focal plane
Vec3 focalDir(focalPoint - randomOrigin);
focalDir = focalDir.normalized();
newRay = Ray(randomOrigin, focalDir);
Thanks

Hi all
I have made a simple ray tracer and all was well until i tried to render a background image for my laptop with a resolution of 1366x768.
When rendering to this aspect ratio of 1.78 my spheres become ovals. In almost every other resolution this doesnt happen. Is there something wrong with my raster space -> camera space code? Or is this some kind of perspective or aspect ratio problem?
Thanks
500x500 - AR = 1
800x400 - AR = 2
800x260 - AR = 3
'
800x450 - AR = 1.78

Hi
I have made a real time raytracer that renders a plane, a bouncing sphere and allows motion of the camera via mouse and keys.
I am using visual studio 2015. When i click the green debug play button, everything works fine.
When i build a release or debug version, i double click the exe file, my window opens, the sky and plane renders but the ball is nowhere to be seen and the camera controls dont work.
I am using opengl to render a texture to a quad, opencl for the actual raytracers and sdl2 for inut and window. And using C
Thanks for any tips

Thanks guys.
For the simple task of updating position data, i do only need the write. Before i used interop, i needed to read the image buffer in order to output it to the window. Even so, the write still does a considerable slow down.
Anyway, i think it might just be the case that my old laptop cant handle it and i will probably see much better perfomance on a better machine to the point it will be useable. Time for a new computer :P

cl_gl interop just means that in the above example, i am using an opengl texture, using opencl to change the texture and giving it back to opengl to render it to a quad that covers the screen. No user input, no gpu->cpu reading or writing, it is all done on the gpu and is super fast. The position data is stored in global gpu memory and is updated each frame by a kernel.
If i want to update the position via keyboard i have to send the data to the kernel each frame from the host .
Correct.
clEnqueueWriteBuffer and clEnqueReadBuffer.
These two commands have a lot of overhead and there isnt anyway around them.

I dont see how it can be done any faster.
I did a simple experiment where I ray traced one sphere, no reflections, no shading, no lighting, no antialiasing. Just a ray sphere intersection for each pixel per frame. Doing one readbuffer and one writebuffer each frame in opencl did this simple image at 100fps. By eliminating the read and write and using gl_cl interop, it did 1200fps.
Rendering one sphere and one plane with antialiasing and reflections drops it down to 30fps. Doing it with one read and one write takes it below 1fps. This i thought was good considering the same image took over 2 minutes to render one frame 10 years ago. Obviously realtime raytracing is future technology and computers need to improve a fair bit to have a full rt raytracer with a million triangles and radiosity and the rest but in the mean time, this little test shows that the gpu has no problem rendering. The real problem is moving memory between global and host space as far as this little example is concerned. I understand when the scene gets more complex then the update between host and gpu will become less significant, but it is the most significant factor when it comes to moving this particular camera around the above red sphere.

Hi
For the past few days I have been writing a realtime raytracer. I get 150fps with blinn-phong shading, one reflection ray and a gradient sky. It drops to about 30fps with 9 times anti aliasing which is to be expected and i am on a really crappy laptop.
https://www.youtube.com/watch?v=bFVo0aC1s9c
Anyway, it has made me want to turn it into a simple ray traced game. Rendering the frames is the easy part, but making it interactive slows it way down. It is fast because of opencl/opengl interop by sharing a texture between the two eliminating the reading and writing from cpu to gpu each frame. As there is no way to update the position of the camera or objects via user input without sending info from the host without slowing it down, i am at a loss.
Is this the bottleneck everyone faces? Are there any workarounds? Do other platforms do things differently/better?
Curious to see what other people have done in this area.
Thanks

Hi all
I am using SDL2 and I need to get the current window and context to pass to opencl.
I tried:
//get the GL rendering context
HGLRC hGLRC = wglGetCurrentContext();
//get the device context
HDC hDC = wglGetCurrentDC();
Doesnt work, visual studio says cant read memory.
I then tried:
gContext = SDL_GL_GetCurrentContext();
gWindow = SDL_GL_GetCurrentWindow();
Causes opencl to bug out.
Any help with this would be greatly appreciated.
Thanks

Thanks Joe.
My original problem was that my image was 600x600 and it needed to be a multiple of 256.
I changed it to 512x512 and the full image gets rendered.
What I dont understand is that every realtime raytracer that i have looked at sets up NDRange like I have.
Another thing i dont understand is that i run the same program using the cpu and i get 1 frame per second and i gett 30 fps out of the gpu using NULL as local size. If the cpu has a faster clock speed and setting local size to null makes the gpu run one kernel at a time, how come the gpu is 30 times faster?
Thanks again
edit:
Never mind, i just read the following in the opencl spec:

Thanks again guys, got it working. Changed this line:
clEnqueueUnmapMemObject(queue, &center, CENTERptr, 0, 0, 0);
I put the center vector in instead of the buffer :P
She works.
I knew it was going to be faster but not this fast. Its like watching an opengl raster sphere floating around only raytraced.
Insane.