Вычисление нормалей вершин из карты нормалей

Я хочу сгенерировать нормали для вершин, смещенных картой высот. У меня есть соответствующая карта нормалей, однако примеры, которые я видел, показывают, что вектор нормали равен значениям RGB пикселя на карте нормалей. Но это означает, что все векторы нормалей положительны, тогда как некоторые векторы должны иметь отрицательные значения. Как бы вы рассчитали их, используя карту нормалей?

Спасибо!


person Alex L    schedule 18.12.2015    source источник


Ответы (1)


Вы просто сдвигаете диапазон на <-1.0,+1.0>, так что

  1. если у вас есть цветовые каналы в диапазоне <0.0,1.0>

    // a)
    nx=(2.0*r)-1.0
    ny=(2.0*g)-1.0
    nz=(2.0*b)-1.0
    

    or:

    // b)
    nx=2.0*(r-0.5)
    ny=2.0*(g-0.5)
    nz=2.0*(b-0.5)
    
  2. если у вас 8 бит на канал, то диапазон равен <0,255>

    nx=(float(r)/127.5)-1.0
    ny=(float(g)/127.5)-1.0
    nz=(float(b)/127.5)-1.0
    

Если вы посмотрите на изображение карты нормалей, вы должны увидеть голубоватые цвета, потому что нейтральный normal=(0,0,1), направленный вверх от плоской грани, кодируется как color=(r=0.5,g=0.5,b=1.0), как здесь:

нормальный

также посмотрите здесь: сопоставление нормалей пошло ужасно неправильно, где нормаль вычисляется из такой текстуры в GLSL методом #1b:

const vec4 v05=vec4(0.5,0.5,0.5,0.5);
texture2D(txr_normal,pixel_txr.st)-v05)*2.0;

Также (r,g,b) можно сопоставить с (nz,ny,nx) вместо (nx,ny,nz), в этом случае просто поменяйте местами r,b (вместо этого карта нормалей становится красноватой)

person Spektre    schedule 19.12.2015