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