Подтвердить что ты не робот

WebGL и мощность двух размеров изображения

Я хочу использовать WebGL для создания небольшой 3D-галереи потоков Flickr. Похоже, что WebGL позволяет только квадратные изображения, размеры которых равны двум, которые будут использоваться в качестве текстур. Мне нужно иметь возможность отображать изображения любой пропорции и размера. Я могу видеть, что если я скопирую данные изображения в другое изображение, которое является ближайшим квадратным размером, а затем используйте координаты текстуры, чтобы он отображался правильно. Проблема в том, что, если я ошибаюсь, я не могу сделать это манипулирование изображениями в JavaScript и вам нужен сервер, на котором запущены ASP.NET, Java или что-то в этом роде, чтобы выполнить обработку для меня, прежде чем WebGL сможет получить свои руки на нем.

Есть ли способ использовать изображения с произвольным размером в WebGL и JavaScript без необходимости того, чтобы сервер выступал в роли обработчика изображений среднего человека?

4b9b3361

Ответ 1

У меня нет проблем с текстурами npot (FF и chrome) при условии, что вы выполните:

texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR);
texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, LINEAR);
texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);
texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);

Ответ 2

Эта страница прекрасно подводит итог ситуации (и более или менее повторяет то, что уже говорили другие ответчики). В принципе, WebGL не поддерживает текстуры NPOT с mipmapping и/или повторами. И если вы не можете уйти без этих режимов, текстуру можно изменить в 2D-холсте. И страница содержит некоторый удобный код для изменения размера холста.

Обновление: WebGL2, следующая версия WebGL, поддерживает текстуры NPOT.

Ответ 3

Простым решением было бы изменить размер с использованием 2d-холста и использовать его как текстуру.

Ответ 4

Я не понимаю детали низкого уровня достаточно хорошо, чтобы полностью ответить на ваш вопрос, но вот несколько вещей, которые я нашел:

Этот пост не обнадеживает:

Обработка текстуры была обновлена ​​в Минефилд, чтобы [он] лучше совпадал спецификация; ранее это было довольно прощающий [...] и позволивший вам использовать текстуры, которые действительно действителен с точки зрения WebGL. Теперь это does not [...] вы увидите ошибку сообщение: "Текстура собирается быть сделанным, как если бы он был черным, так как в разделе спецификации OpenGL ES 2.0.24 3.8.2, потому что это 2D-текстура, с фильтром фильтрации требуя mipmap, с его шириной или высота не может быть двух, а с режим переноса отличается от CLAMP_TO_EDGE".

Я не знаю, применяются ли эти дополнительные условия к вашему приложению. См. Также спецификацию OpenGL ES.

Этот поток идет довольно подробно по поддержке "NPOT":

  
    

OpenGL поддерживает текстуры NPOT двумя способами. Первый называется "Прямоугольник       Текстуры" (RT), которые могут быть любого размера, но не могут повторяться, отображаться в mip или       имеют границы. И вместо того, чтобы использовать 0-1 текстурные координаты, они используют 0-w,       0-ч. OpenGL Также поддерживает истинные текстуры NPOT, которые имеют аналогичные ограничения       к RT, но которые используют нормальные координаты текстуры 0-1.

             

Проблема в том, что некоторые старые аппаратные средства (и когда я говорю "старше", я имею в виду       аппаратное обеспечение с 2005 года) поддерживает только RT, а не NPOT. Невозможно       эмулировать NPOT, когда у вас есть поддержка RT, потому что в GLSL вы используете       различный сэмплер для RT (sampler2DRect vs sampler2D).

             

OpenGL ES поддерживает только NPOT, а не RT.

    

...

  

Реализация WebGL может масштабировать данные текстуры NPOT до следующего     максимальная мощность двух измерений во время texImage2D и texSubImage2D     звонки. Это не будет связано с изменениями API. O3D делает это в некоторых     случаев как доказательство того, что метод может работать без конечного пользователя     зная. Я думаю, было бы плохой идеей выставить прямоугольные текстуры     в API WebGL; они определенно не путь вперед.

  

Итак, возьмите этот FWIW...

Ответ 5

Ссылка, предоставленная @EnabrenTane, очень полезна. Поддержка Non-Power of Two Texture

В то время как OpenGL 2.0 и более поздние версии для настольных компьютеров предлагают полную поддержку текстур не-двух (NPOT), OpenGL ES 2.0 и WebGL имеют ограниченную поддержку NPOT. Ограничения определены в разделах 3.8.2 "Выполнение шейдеров" и 3.7.11 "Генерация Mipmap" спецификации OpenGL ES 2.0, и их краткое описание приведено здесь:

  • generateMipmap (target) генерирует ошибку INVALID_OPERATION, если изображение уровня 0 текстуры, в настоящее время привязанной к цели, имеет ширину или высоту NPOT.
  • Сэмплирование текстуры NPOT в шейдере даст цвет RGBA (0, 0, 0, 1), если:
    • Фильтр минификации установлен на что угодно, кроме NEAREST или LINEAR: другими словами, если он использует один из отображаемых фильтров.
    • Режим повтора установлен на что угодно, кроме CLAMP_TO_EDGE; повторяющиеся текстуры NPOT не поддерживаются.