سؤال

أرغب في تقديم مشهد يحتوي على صندوق واحد ومصدر ضوء نقطة باستخدام مخطط إضاءة Phong. فيما يلي مقتطفات الرمز ذات الصلة لحسابي:

R3Rgb Phong(R3Scene *scene, R3Ray *ray, R3Intersection *intersection)
{
  R3Rgb radiance;
  if(intersection->hit == 0)
  {
    radiance = scene->background;
    return radiance;
  }

  ...
  // obtain ambient term
  ... // this is zero for my test

  // obtain emissive term
  ... // this is also zero for my test

  // for each light in the scene, obtain calculate the diffuse and specular terms
  R3Rgb intensity_diffuse(0,0,0,1);
  R3Rgb intensity_specular(0,0,0,1);
  for(unsigned int i = 0; i < scene->lights.size(); i++)
  {
    R3Light *light = scene->Light(i);
    R3Rgb light_color = LightIntensity(scene->Light(i), intersection->position);
    R3Vector light_vector = -LightDirection(scene->Light(i), intersection->position);

    // check if the light is "behind" the surface normal
    if(normal.Dot(light_vector)<=0)
      continue;

    // calculate diffuse reflection
    if(!Kd.IsBlack())
      intensity_diffuse += Kd*normal.Dot(light_vector)*light_color;

    if(Ks.IsBlack())
      continue;

    // calculate specular reflection
    ... // this I believe to be irrelevant for the particular test I'm doing

  }

  radiance = intensity_diffuse;
  return radiance;
}

R3Rgb LightIntensity(R3Light *light, R3Point position)
{
  R3Rgb light_intensity;
  double distance;
  double denominator;
  if(light->type != R3_DIRECTIONAL_LIGHT)
  {
    distance = (position-light->position).Length();
    denominator = light->constant_attenuation + 
                         (light->linear_attenuation*distance) + 
                         (light->quadratic_attenuation*distance*distance);
  }   

  switch(light->type)
  {
    ...

    case R3_POINT_LIGHT:
      light_intensity = light->color/denominator;
      break;

    ...
  }
  return light_intensity;
}

R3Vector LightDirection(R3Light *light, R3Point position)
{
  R3Vector light_direction;
  switch(light->type)
  {
    ...
    case R3_POINT_LIGHT:
      light_direction = position - light->position;
      break;
    ...
  }
  light_direction.Normalize();
  return light_direction;
}

أعتقد أن الخطأ يجب أن يكون في مكان ما في أي منهما LightDirection(...) أو LightIntensity(...) وظائف لأنه عندما أقوم بتشغيل الكود الخاص بي باستخدام مصدر ضوء اتجاهي ، أحصل على الصورة المقدمة المطلوبة (وبالتالي فإن هذا يقودني إلى الاعتقاد بأن معادلة إضاءة فونغ صحيحة). أيضا ، في فونغ (...) ، عندما قمت بحساب intensity_diffuse وأثناء تصحيح الأخطاء ، انقسمت light_color بحلول العاشرة من عمري ، كنت أحصل على صورة ناتجة تشبه ما أحتاجه. هل أقوم بحساب light_color بشكل صحيح؟

شكرًا.

هل كانت مفيدة؟

المحلول

اتضح أنه لم يكن لدي أي خطأ. لم يتم حساب "الصورة النهائية" التي كنت أقارن عن نتائجي بها بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top