Что такое координата текстуры P в поиске текстуры sampler2d GLSL

Я просматривал спецификацию OpenGLSL ES 3.0. , но я ничего не могу найти о том, как встроенная функция texture(sampler, p) определяет P. Я знаю, что это vec2.

Является ли это нормализованной плавающей запятой между 0,0 и 1,0, определяющей масштабирование от верхнего левого угла до правой кнопки?

Или это поиск текселей от 0 до размерности минус 1, как функция texelFetch()?

Или это еще сложнее и как-то определяется в свойствах текстуры? Здесь В нем говорится: "Координаты текстуры могут быть нормализованы или в пространстве текселей". Но я настроен скептически, так как не вижу места для нормализованной текстуры.


person HPP    schedule 11.07.2015    source источник


Ответы (1)


Как вы уже заметили, семейство функций texelFetch() обращается к определенному текселю по фактическим целочисленным координатам текселя, в которых указаны данные изображения.

Напротив, отображение между текстурными координатами, используемыми для семейства texture() функций GLSL, и фактическими координатами текселей немного сложнее.

Во-первых, координаты текстуры определяются как числа с плавающей запятой, и концептуально выборка текстур представляет собой оценку непрерывной 1-, 2- или 3D-функции без доступа к дискретному массиву. Режимы фильтрации, конечно же, определяют, какие значения вы получите при сэмплировании между точками данных, представленными в самой текстуре. Вы должны знать, что первое отличие состоит в том, что выборка текстуры в общем случае не означает, что адресуется один тексел, а используется несколько текселей, и режим фильтра (а также другие обстоятельства, такие как производные экранного пространства от tex coords) определяет, какие тексели должны быть извлечены во время работы.

Текскоорды для «обычных» 2D-текстур определяются таким образом, что (0,0) определяет нижний левый угол нижнего левого текселя, а (1,1) верхний правый угол верхнего правого пикселя. . Обратите внимание, что это определение подразумевает, что если вы хотите произвести выборку точно в центре текселя для целочисленных координат текселя (i,j) с 0 ‹= i ‹= texWidth -1 и 0 ‹= j ‹= texHeight -1, у вас будет использовать координаты текстуры ( (i+0.5)/texWidth, (j+0.5)/texHeight).

Если указаны координаты текстуры за пределами диапазона [0,1], для определения того, как это сопоставляется с диапазоном, используется режим переноса текстуры. В основном у вас есть возможность зажать их или повторить текстуру (зеркально и не зеркально).

Или это еще сложнее и как-то определяется в свойствах текстуры?

Режимы фильтрации и переноса являются частью состояния семплера. GLES 3 поддерживает объекты сэмплера, которые позволяют указывать состояние сэмплера независимо от объекта текстуры. В традиционном GL объекты текстур содержат состояние сэмплера. Объекты сэмплера позволяют вам при желании переопределить это состояние.

Здесь В нем говорится: "Координаты текстуры могут быть нормализованы или в пространстве текселей". Но я настроен скептически, так как не вижу места для нормализованной текстуры.

Что ж, это относится к настольному GL, а не к GLES 3. Ссылка, которую вы дали, фактически объясняет это сразу после абзаца, из которого вы цитируете. Текстуры прямоугольников используют отображение, где [0, ширина) x [0, высота) представляет все изображение в координатах текстуры, а не в нормализованном диапазоне [0,1]. Но в ES3 прямоугольные текстуры не поддерживаются, так что здесь это не имеет значения.

person derhass    schedule 12.07.2015