UV-отображение процедурно сгенерированной сферы в OpenGL

Я пытаюсь использовать UV 2D-текстуру на земном шаре. Вот кусок кода:

double 
    delta = 0.0, // angle of latitude
    theta = 0.0, // angle of longitude
    theta_interval = (2.0 * M_PI) / latitude, // angle of latitude
    delta_interval = M_PI / longitude, // angle of longitude
    u_lats = 0.0, 
    v_longs = 0.0,
    u_lats_interval = 1.0 / latitude,
    v_longs_interval = 1.0 / longitude;

for (int i = 0; i < longitude; ++i) {
    for (int j = 0; j < latitude; ++j) {
        double
            x0 = calc_x0(radius, x, theta, delta),
            y0 = calc_y0(radius, y, theta, delta),
            z0 = calc_z0(radius, z, theta, delta),
            u0 = u_lats,
            v0 = v_longs + v_longs_interval,

            x1 = calc_x1(radius, x, theta, delta, delta_interval),
            y1 = calc_y1(radius, y, theta, delta, delta_interval),
            z1 = calc_z1(radius, z, theta, delta, delta_interval),
            u1 = u_lats + u_lats_interval,
            v1 = v_longs + v_longs_interval,

            x2 = calc_x2(radius, x, theta, theta_interval, delta, delta_interval),
            y2 = calc_y2(radius, y, theta, delta, delta_interval),
            z2 = calc_z2(radius, z, theta, theta_interval, delta, delta_interval),
            u2 = u_lats + u_lats_interval,
            v2 = v_longs,

            x3 = calc_x3(radius, x, theta, theta_interval, delta),
            y3 = calc_y3(radius, y, theta, theta_interval, delta),
            z3 = calc_z3(radius, z, theta, theta_interval, delta),
            u3 = u_lats,
            v3 = v_longs;

            theta += theta_interval;
            u_lats += u_lats_interval;
        }
        v_longs += v_longs_interval;
        theta = 0.0;
        delta += delta_interval;

Таким образом, я хотел сделать это, пройдясь по первому «ремню» на текстуре, а затем перейти к следующему, но это выглядит не очень хорошо. Я начинаю думать, что это может быть связано с текстурой, потому что, если я отрисую меньше сферы, например, только 3 итерации широты, она будет выглядеть по-другому.

Вот несколько фотографий:

Полный глобус:

Полный глобус

Тот же глобус только с тремя интервалами широты:

Тот же глобус только с тремя интерполяциями широты

Кто-нибудь знает, что я делаю неправильно?


person carrotcake    schedule 10.11.2016    source источник
comment
Вы ноль theta, но не u_lats. Может быть, а может и не быть.   -  person Yakov Galka    schedule 10.11.2016
comment
Да, это было так, а также пришлось поменять местами u и v при создании сферы. Не знаю почему, но это работает. Ваше здоровье!   -  person carrotcake    schedule 11.11.2016