C中的光线跟踪计算

时间:2016-04-03 07:00:23

标签: c raytracing

我是光线追踪的新手,并试图在C中编程。但我的程序继续在错误的位置显示球体的一个点(大约1-3个像素),现在我感到困惑。这感觉就像一个非常愚蠢的问题,但我对一个球体的半径究竟有多大感到困惑?我的意思是,如果半径是1,圆是2像素?

我知道所有的计算,如果我的代码中有任何错误,我会三倍检查。但只是来,这是我的代码的一部分:

路线:

//size: 1024x768, view point (512 384 1), screen (0 0 0) to (1024 768 0)
ray[0] = x - start_x;
ray[1] = y - start_y;
ray[2] = 0 - start_z;
//normalize
double length;
length = (sqrt((ray[0]*ray[0]) + (ray[1]*ray[1]) + (ray[2]*ray[2])));
ray[0] = ray[0]/length;
ray[1] = ray[1]/length;
ray[2] = ray[2]/length;

路口:

temp = top; //my struct with sphere data, _x, _y, _z, _r, _red, _green, _blue
//x and y is the current pixel value
while (temp != NULL) {
  x_diff = start_x - temp->_x + 0.0;
  y_diff = start_y - temp->_y + 0.0;
  z_diff = start_z - temp->_z + 0.0;
  //a = 1 because my direction is a normalized
  b = 2.0 * ((rayVector[0] * x_diff) + (rayVector[1] * y_diff) + (rayVector[2] * z_diff));
  c = (x_diff * x_diff * 1.0) + (y_diff * y_diff) + (z_diff * z_diff) - (temp->_r * temp->_r);

  check = (b * b) - (4.0 * c);
  if (check < 0) { //0
     pixels[width][height][0] = 0.0;
     pixels[width][height][1] = 0.0;
     pixels[width][height][2] = 0.0;
  }
  else if (check == 0) { //1
     r1 = (b * -1.0) /2.0;
     if (r1 < nearest_z) {
        nearest_z = r1;
        pixels[width][height][0] = temp->_red;
        pixels[width][height][1] = temp->_green;
        pixels[width][height][2] = temp->_blue;
     }
  }
  else { //2
     r1 = ((b * -1.0) + sqrt(check))/2.0;
     r2 = ((b * -1.0) - sqrt(check))/2.0;
     if ((r1 < r2) && (r1 < nearest_z)) {
        nearest_z = r1;
        pixels[width][height][0] = 255.0;
        pixels[width][height][1] = 0;
        pixels[width][height][2] = 0;
     }
     else if ((r2 < r1) && (r2 < nearest_z)) {
        nearest_z = r2;
        pixels[width][height][0] = temp->_red;
        pixels[width][height][1] = temp->_green;
        pixels[width][height][2] = temp->_blue;
     }
  }
  temp = temp->next;
}

我还没有完成任何照明,因为平面着色它不起作用。我是openGL的新手,所以希望我错过代码中的一些常见功能。提前谢谢。

编辑: 我目前只有一个球体,但我的输出如下:img1

我期待更大的圈子?另外,我为每个交叉点(如果有)都有一个printf,当我在纸上手动绘图时,它是一个4x5像素的正方形。但是输出中有4个点。

编辑2:我将球体的大小更改为:x = 512 y = 384 z = -21 r = 30,它给了我: img2 同样,我只有一个球体,图像中有4个球体。这些线之间是否存在?

如果我将z值更改为-20,现在我的输出全部为白色(球体颜色)。 我使用glDrawPixels(1024,768,GL_RGB,GL_FLOAT,pixels);来绘制

我有一个RBG输出文件,一切似乎都在正确的位置。但是当我使用该程序时,它已经关闭了。

0 个答案:

没有答案