2014-09-14 7 views
0

Я написал шейдер, чем преобразовывает вершинные положения по текстуре высотной карты. Поскольку геометрия трансформируется в вершинном шейдере, я не могу использовать традиционные алгоритмы выбора в javascript без обратной инженерии шейдера, чтобы получить вершины в их преобразованные позиции. Кажется, у меня проблема с моим пониманием функции texture2D в GLSL. Если вы проигнорируете обертывание текстуры, как бы вы собираетесь эмулировать одну и ту же функцию в JS? Вот как я это делаю сейчас:Эмуляция текстуры2D в Javascript

/** 
    * Gets the normalized value of an image's pixel from the x and y coordinates. The x and y coordinates expected here must be between 0 and 1 
    */ 
    sample(data, x, y, wrappingS, wrappingT) 
    { 
     var tempVec = new Vec2(); 

     // Checks the texture wrapping and modifies the x and y accordingly 
     this.clampCoords(x, y, wrappingS, wrappingT, tempVec); 

     // Convert the normalized units into pixel coords 
     x = Math.floor(tempVec.x * data.width); 
     y = Math.floor(tempVec.y * data.height); 

     if (x >= data.width) 
      x = data.width - 1; 
     if (y >= data.height) 
      y = data.height - 1; 

     var val= data.data[ ((data.width * y) + x) * 4 ]; 

     return val/255.0; 
    } 

Эта функция, как представляется, дает правильные результаты. У меня текстура размером 409 пикселей на 434 пиксела высотой. Я покрасил изображение черным, за исключением самого последнего пикселя, который я покрасил в красный цвет (408, 434). Поэтому, когда я называю функцию сэмплер в JS:

this.sample(imgData, 0.9999, 0.9999. wrapS, wrapT) 

Результат 1. Что для меня является правильным, как его отсылая к красному пикселу.

Однако это не похоже на то, что дает мне GLSL. В GLSL я использую это (как тест):

float coarseHeight = texture2D(heightfield, vec2(0.9999, 0.9999)).r; 

Что я ожидал бы coarseHeight должен быть 1, а также - но вместо того, чтобы ее 0. Я не понимаю ... Может кто-нибудь дать мне некоторое представление где я ошибаюсь?

ответ

1

Возможно, вы уже заметили, что любые обработанные текстуры являются зеркальными.

OpenGL и этим WebGL источник происхождения находится в нижнем левом углу, где, когда ваши данные буфера при загрузке с использованием метода холста 2d имеют начало в верхнем левом углу.

Вам нужно либо переписать свой буфер, либо инвертировать координату v.

Смежные вопросы