Отображение текстуры в трассировке лучей для сферы в C++

Я настроил простую трассировку лучей на C++. Я хотел добавить наложение текстуры на сферу. По сути, это просто сопоставляет текстуру из файла PPM со сферой. Ниже мой код для части.

//Call shaderay from trace ray function
// index_of_winning_object = index of scene object array
// point = intersection point
Color shadeRay (int index_of_winning_object, Vect point, Ray ray){

double final_index2;    

//if no intersection, return the background color (double confirm)
if (index_of_winning_object == -1) {
    return bkgcolor;
}else{

    Vect c = scene_objects[index_of_winning_object].getSphereCenter();
    Vect p = point;

    //Normal to the intersection point and sphere
    Vect N = p.vectSub(c).normalize();

    //Calculating the texture coordinate for a sphere
    double temp = acos(N.getVectZ());
    double temp2 = atan2(N.getVectY(), N.getVectX());
    //u,v 
    double v = temp / 3.141592653589793;

    if (temp2 < 0) {
        temp2 = temp2 + (2 * 3.141592653589793);
    }

    double u = temp2 / (2 * 3.141592653589793);

    // get_ppm_width = width of the sample texture ppm file like (picture.ppm)
    // get_ppm_height = height of the sample texture ppm file like (picture.ppm)

    int width = u * get_ppm_width;
    int height = v * get_ppm_height;        


    //calculating the pixel of the ppm file, I store the pixel in get_array in RGB struct
    // ___ ___ ___ ___ ___ ___ ___
    //  0   1   2   3   4   5   6
    //  7   8   9  10   11  12  13
    // ___ ___ ___ ___ ___ ___ ___
    // above is the example of the get_array. get_array is a one dimensional array of RGB struct

    int px = height + (width * get_ppm_width);

    // Get the color from the get_array 
    Color final (get_array[px].r, get_array[px].g, get_array[px].b );

    return final;
  }
}

Может кто-нибудь, пожалуйста, дайте мне знать, что я сделал неправильно для функции шейдера? Большое спасибо. Слева вверху фотография сферы, которую я получил. Внизу текстура карты мира.введите здесь описание изображения


person user3382260    schedule 15.03.2014    source источник
comment
Не могли бы вы загрузить скриншот? Лучшее понимание того, что вы получаете и чего вы надеетесь достичь, может помочь.   -  person Liam M    schedule 15.03.2014
comment
@Liam M Я пытался загрузить, но не смог, так как у меня недостаточно репутации, чтобы опубликовать картинку.   -  person user3382260    schedule 15.03.2014


Ответы (1)


После вычисления N попробуйте вычислить (u, v) по этому алгоритму:

u = 0.5 + arctan2(dz, dx) / (2*pi)
v = 0.5 - arcsin(dy) / pi

Я подозреваю, что это ваша проблема.

Попробуйте изолировать свою проблему, создав цвет исключительно с использованием ваших координат UV, а не выбирая их из текстуры. Вы можете попробовать:

int red = u % 255;
int green = 0;
int blue = 0;

Изучите результаты. Это то, что вы ожидаете увидеть?

person Liam M    schedule 15.03.2014
comment
Я был бы уверен, что расчет правильный, поскольку он был сделан моим профессором. Однако я попытался, и это дало мне такое же неправильное изображение. Скажите, если возможно, мой алгоритм для шейдеров правильный? Спасибо - person user3382260; 15.03.2014
comment
В чем неправильный образ? Вот предложение: вместо того, чтобы выбирать пиксель из PPM, попробуйте сгенерировать цвет процедурно (как функцию (u, v)), чтобы убедиться, что ваши UV-сопоставления верны, и изолируйте код ниже как источник вашей проблемы. - person Liam M; 15.03.2014
comment
Спасибо за ответ. Но не могли бы вы подробнее объяснить, как процедурно генерировать цвет? Я понятия не имею, как это сделать. Спасибо - person user3382260; 15.03.2014
comment
Смотрите измененный ответ :). - person Liam M; 15.03.2014
comment
Я попробовал, и он создает сферу красного цвета. - person user3382260; 15.03.2014
comment
Ваши значения RGB измеряются от 0 до 255 или от 0,0 до 1,0? Я думаю, вы можете оценить подход, который я отстаиваю. - person Liam M; 15.03.2014
comment
0-255. Какую картинку он должен был создать? - person user3382260; 15.03.2014
comment
Он должен генерировать шаблон затенения по сфере, показывающий изменение координаты u. Похоже, в ваших расчетах UV есть ошибка или где-то еще. Боюсь, я не смогу дать вам гораздо больше помощи, чем у меня есть: вам нужно просмотреть каждую из частей вашего кода и убедиться, что каждая из них верна (напишите тесты и убедитесь, что они дают вам ожидаемые результаты). , и вы должны найти ошибку. - person Liam M; 15.03.2014
comment
привет, я прикрепил текущую картинку вывода. Не могли бы вы взглянуть? - person user3382260; 18.03.2014