Ray Tracing in Opengl Using C

Ray Tracing in Opengl Using C

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

float viewer[3] = {10,10,200};
float RD[3];

float sphere_intersect(float sc[3], float sr)
{
    float a, b, c, D, rootD, u;

    a = RD[0]*RD[0] + RD[1]*RD[1] + RD[2]*RD[2];
    b = 2*(RD[0]*(viewer[0]-sc[0]) + RD[1]*(viewer[1]-sc[1]) + RD[2]*(viewer[2]-sc[2]));
    c = (viewer[0]-sc[0])*(viewer[0]-sc[0]) + (viewer[1]-sc[1])*(viewer[1]-sc[1]) + (viewer[2]-sc[2])*(viewer[2]-sc[2]) - sr*sr;

    D = b*b - 4*a*c;

    if(D<0){
        return 1.0;
    }

    rootD = sqrtf(D);

    if(b<0){
        u = (-b - rootD)/(2.0*a);
    }
    else{
        u = (-b + rootD)/(2.0*a);
    }
    if(u>=0.0&&u<=1.0){
        return u;
    }
    else{
        return 1.0;
    }
}

void Raytracer()
{
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    float sc1[3] = {20,30,40};
    float sc2[3] = {-10,10,-10};
    float sr1 = 40;
    float sr2 = 40;
    int i, j, k;
    float u, x, y, z, newu;

    for(i=0; i<1000; i++){
        for(j=0; j<600; j++){
            u = 1.0;
            k=0;
            x = i-500;
            y = j-300;
            z = -200;
            RD[0] = x - viewer[0];
            RD[1] = y - viewer[1];
            RD[2] = z - viewer[2];

            newu = sphere_intersect(sc2,sr2);

            if(newu<u){
                u=newu;
                k=2;
            }

            newu = sphere_intersect(sc1,sr1);

            if(newu<u){
                u = newu;
                k=1;
            }

            if(k==1){
                glColor3f(1.0,1.0,1.0);
                glBegin(GL_POINTS);
                glVertex3f(x, y, z);
                glEnd();
            }
            else if(k==2){
                glColor3f(0.0,1.0,0.0);
                glBegin(GL_POINTS);
                glVertex3f(x, y, z);
                glEnd();
            }
        }
    }
    glFlush();
}

void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Raytracer();
glFlush();
}

void init(void)
{
glClearColor (0.0, 0.0, 0.0, 1.0);
glOrtho(-454.0, 454.0, -250.0, 250.0, -250.0, 250.0);
glEnable(GL_DEPTH_TEST);
}


int main (int argc, char *argv)
{
glutInit(&argc, &argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (1000, 600);
glutInitWindowPosition (0, 0);
glutCreateWindow ("RayTracer");
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Copyright © C Program | Java | OpenGL Programming | Hadoop at Computaholics