Я написал шейдер, чем преобразовывает вершинные положения по текстуре высотной карты. Поскольку геометрия трансформируется в вершинном шейдере, я не могу использовать традиционные алгоритмы выбора в 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. Я не понимаю ... Может кто-нибудь дать мне некоторое представление где я ошибаюсь?