我是光线追踪的新手,并试图在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输出文件,一切似乎都在正确的位置。但是当我使用该程序时,它已经关闭了。