raytracing — C ++ создает квадратную плоскость пола, используя трассировку лучей. Segfault

Я пытался реализовать самолет, используя трассировку лучей и фонг. Я пока не смог его показать.

В настоящее время у меня есть 3 сферы с работающими тенями, но я не могу заставить самолет работать. Может кто-нибудь определить проблему с тем, почему мой самолет не показывает и почему происходит segFault? (Я объясняю точную строку и как я могу избежать получения segFault ниже, поэтому я чувствую, что точно определил проблему)

Я хотел бы, чтобы самолет был как пол, где я мог видеть тени. Я включил только соответствующий код плоскости и пропустил сферу для удобства чтения. Если кто-то просит об этом, я могу включить его. (Сфера вещи работают: http://imgur.com/i936UID , строка «tmin = t» в коде squarePlane закомментирована, чтобы показать это.)

SegFault происходит в функции ImplementPhong на

vec3 R = vec3 (0,0,0);
//normalize(reflect(-L, N));
//vec3 (0,0,0);

Если я использую закомментированную функцию нормализации вместо моего временного vec3(0,0,0),

Также будет происходить сегрегация, если я перенесу свой

squarePlane.normal = normalize(vec3(0,0.5,3)); // to (vec3(0,1,0))

//********** Global Variables *********
RgbImage * myImage;
vec3 nEye(0.0,0.0,-5.0);
vec3 lightSource1(-2.0,-1.5,0.0);
vec3 lightSource2(0.0,-2.0,0.0);
float tmin=100.0;struct Ray
{
vec3 pt;
vec3 vecDir;
};

struct Prim
{
vec3 origin;
double radius;
double underSquare;
vec3 ambient;
vec3 diffuse_albedo;
vec3 specular_albedo;
float specular_power;
vec3 light_intensity;
vec3 normal;
vec3 pt1;
vec3 pt2;
vec3 pt3;
};vec3 trace(Ray ray){
Prim squarePlane;
Prim pickSphere;
tmin = 100;
vec3 pixelColor(0,0,1);
squarePlane.pt1 = vec3(-0.2,0.0,0.0);
squarePlane.pt2 = vec3(0.2,0.0,0.0);
squarePlane.pt3 = vec3(-0.2,0.1,0.0);
squarePlane.ambient=vec3(0.329412, 0.223529, 0.027451);
squarePlane.diffuse_albedo=vec3(0.780392, 0.568627, 0.113725);
squarePlane.specular_albedo = vec3(0.992157,0.941176,0.807843);
squarePlane.specular_power = 27.8974;
squarePlane.light_intensity = vec3(1,1,1);
squarePlane.normal = normalize(vec3(0,1,0));

float D = 0;
float denom = dot(squarePlane.normal, nVecDir);
float numer = dot(squarePlane.normal, nEye) + D;
vec3 hitTemp;
vec3 hitPoint;
if (denom!=0){
float t= -(dot(squarePlane.normal, nEye) + D) / denom;
if (t>=0){
tmin=t;
}
}
//pickSphere = squarePlane;

pickSphere = checkForIntersection(nEye, nVecDir, spheres, false);  // last parameter is for print debugging

if (tmin != 100){ //if tmin has changed, we found and intersection, send shadow ray
vec3 hitTemp(nVecDir.x*tmin, nVecDir.y*tmin, nVecDir.z*tmin);
vec3 hitPoint = (nEye + hitTemp);
shadowRay.vecDir = (normalize(lightSource1 - (hitPoint)));

tmin = 100;  // Set tmin for a new ray trace.
checkForIntersection(hitPoint, shadowRay.vecDir, spheres, true);

if (tmin != 100){ //if tmin does not equal 100, we found an intersection, this point is in shadow, return ambient.
pixelColor = pickSphere.ambient;
return pixelColor;
}
else {
pickSphere.normal = hitPoint - pickSphere.origin;
pixelColor = implementPhong(pickSphere,nEye,hitPoint);
//pixelColor = vec3(0,1,0);
return pixelColor;
}
}
else{
return pixelColor;
}
}vec3 implementPhong(Prim drawSphere, vec3 camera, vec3 hitPoint){
vec3 L = drawSphere.light_intensity * normalize(lightSource1 - hitPoint);
vec3 N = normalize(drawSphere.normal);
vec3 V = normalize(camera - hitPoint);
vec3 R = vec3 (0,0,0); //normalize(reflect(-L, N)); //vec3 (0,0,0);
float zero = 0;

vec3 diffuse = std::max<float>(dot(N, L), zero) * drawSphere.diffuse_albedo;

vec3 specular = pow(std::max<float>(dot(R, V), zero), drawSphere.specular_power) * drawSphere.specular_albedo;

vec3 color = drawSphere.ambient + diffuse + specular;

return color;
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]