Question

Je tente d'ajouter des fonctionnalités à un traceur de rayons en C ++. A savoir, je suis en train d'ajouter la texture cartographie des sphères. Pour simplifier, j'utilise un tableau pour stocker les données de texture. J'ai obtenu les données de texture à l'aide d'un éditeur hexadécimal et copier les valeurs d'octets correctes dans un tableau dans mon code. C'était juste pour mes fins de test. Lorsque les valeurs de ce tableau correspondent à une image qui est simplement rouge, il semble travailler près de ce qui est prévu, sauf qu'il n'y a pas ombrage. première image http://dl.dropbox.com/u/367232/Texture.jpg En bas à droite de l'image montre ce qui devrait ressembler à une sphère correcte. La couleur de ce domaine en utilisant une couleur définie, pas une carte de texture.

Un autre problème est que lorsque la carte de texture est autre chose que seulement l'un des pixels de couleur, il devient blanc. Mon image test est une image de l'eau, et quand des cartes, il ne montre qu'un seul anneau de pixels bleuté entourant la couleur blanche.

bmp http://dl.dropbox.com/u/367232/vPoolWater. BMP

Lorsque cela est fait, il apparaît simplement comme ceci: seconde image http://dl.dropbox.com/u/367232/texture2.jpg

Voici quelques extraits de code:

  Color getColor(const Object *object,const Ray *ray, float *t)
  {
   if (object->materialType == TEXTDIF || object->materialType == TEXTMATTE) {
    float distance = *t;
    Point pnt = ray->origin + ray->direction * distance;
    Point oc = object->center; 
    Vector ve = Point(oc.x,oc.y,oc.z+1) - oc;
    Normalize(&ve);
    Vector vn = Point(oc.x,oc.y+1,oc.z) - oc;
    Normalize(&vn);
    Vector vp = pnt - oc;
    Normalize(&vp);

    double phi = acos(-vn.dot(vp));

    float v = phi / M_PI;
    float u;

    float num1 = (float)acos(vp.dot(ve));
    float num = (num1 /(float) sin(phi));

    float theta = num /(float) (2 * M_PI);
    if (theta < 0 || theta == NAN) {theta = 0;}
    if (vn.cross(ve).dot(vp) > 0) {
        u = theta;
    }
    else {
        u = 1 - theta;
    }
    int x = (u * IMAGE_WIDTH) -1;
    int y = (v * IMAGE_WIDTH) -1;
    int p = (y * IMAGE_WIDTH + x)*3;

    return Color(TEXT_DATA[p+2],TEXT_DATA[p+1],TEXT_DATA[p]);

}
else {
    return object->color;
}
};

J'appelle le code couleur ici Trace:

if (object->materialType == MATTE)
    return getColor(object, ray, &t);

Ray shadowRay;
int isInShadow = 0;
shadowRay.origin.x = pHit.x + nHit.x * bias;
shadowRay.origin.y = pHit.y + nHit.y * bias;
shadowRay.origin.z = pHit.z + nHit.z * bias;
shadowRay.direction = light->object->center - pHit;
float len = shadowRay.direction.length();
Normalize(&shadowRay.direction);
float LdotN = shadowRay.direction.dot(nHit);
if (LdotN < 0)
    return 0;
Color lightColor = light->object->color;
for (int k = 0; k < numObjects; k++) {
    if (Intersect(objects[k], &shadowRay, &t) && !objects[k]->isLight) {
        if (objects[k]->materialType == GLASS)
            lightColor *= getColor(objects[k], &shadowRay, &t); // attenuate light color by glass color
        else
            isInShadow = 1;
        break;
    }
}
lightColor *= 1.f/(len*len);
return (isInShadow) ? 0 : getColor(object, &shadowRay, &t) * lightColor * LdotN;
}

Je laisse le reste du code pour ne pas enliser le poste, mais il peut être vu ici . Toute aide est grandement appréciée. La seule partie non inclus dans le code, est où je définir les données de texture, qui comme on dit, est tout simplement pris directement à partir d'un fichier bitmap de l'image ci-dessus.

Merci.

Était-ce utile?

La solution

Il se pourrait que la texture est tout simplement lavé parce que la lumière est si brillante et si proche. Remarquez comment dans le cas rouge solide, il ne semble pas y avoir de gradation autour de la sphère. Les regards rouges comme elle est saturée.

Votre u, ressemble cartographie v droit, mais il pourrait y avoir une erreur là. Je rajouterais quelques déclarations de assert pour vous assurer u et v et vraiment entre 0 et 1 et que l'indice p dans votre tableau de TEXT_DATA est également à portée.

Autres conseils

Si vous déboguez vos textures, vous devez utiliser un matériau constant dont la couleur est déterminée uniquement par la texture et non les lumières. De cette façon, vous pouvez vous assurer que vous mappez correctement votre texture à votre primitive et filtrer correctement avant de faire un éclairage sur elle. Ensuite, vous savez qu'une partie n'est pas le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top