Простое отображение текстуры на объект в шейдере фрагмента GLSL

У меня проблема с отображением текстуры во фрагментном шейдере. У меня есть текстура того же размера, что и у окна (я использую часть сцены, отрендеренную на предыдущем проходе, но я использую текстуру кирпича в приведенном ниже примере), и мне нужно сопоставить ее, как в 2D. Это как-то возможно? Я пробовал разные способы, но ничего не вышло.

Не могли бы вы посоветовать мне, как должен выглядеть фрагментный шейдер? Пожалуйста, любой совет будет полезным. Спасибо!

тепаот с обычным отображением


person Bhiefer    schedule 11.12.2011    source источник


Ответы (1)


У меня есть текстура того же размера, что и у окна (…), и мне нужно отобразить ее, как в 2D.

Итак, если я вас правильно понял, то вы хотите использовать ранее сгенерированную текстуру, как если бы это был какой-то «слой», где пиксели текстуры отображают 1: 1 пикселям области просмотра, а текстура имеет тот же размер, что и область просмотра?

Если так, то это очень просто (начиная с GLSL версии 1.30). Существует функция texelFetch, которая принимает индекс пикселя в качестве координаты (в отличие от texture, который принимает значение в диапазоне [0; 1]). Встроенная переменная gl_FragCoord дает координаты окна обрабатываемого в данный момент фрагмента. Таким образом, используя координаты gl_FragCoord для texelFetch, вы получите желаемый результат.

person datenwolf    schedule 11.12.2011
comment
В качестве небольшого замечания, если функция texelFetch недоступна (я думаю, на оборудовании GL2 / DX9) вы можете просто использовать обычный texture2D, но должны разделить gl_FragCoord на размер экрана / текстуры, прежде чем использовать его в качестве координаты текстуры. - person Christian Rau; 11.12.2011
comment
@ChristianRau: Это не так просто, как просто разделить размер теста, потому что координаты 0 и 1 не находятся в центрах текселей. Я подробно объяснил это здесь, stackoverflow.com/a/5879551/524368 - person datenwolf; 11.12.2011
comment
Да, я знаю, что (0,0) не является центром текселя. Но разве gl_FragCoord тоже не должен быть в центрах пикселей? Итак, gl_FragCoord, скажем, нижний левый пиксель должен быть (0,5, 0,5) вместо (0, 0) в любом случае, не так ли? Так что вы действительно должны получить центры текселей от gl_FragCoord. - person Christian Rau; 11.12.2011
comment
Я еще не нашел его в спецификации GLSL, но это расширение (который уже должен быть основным) указывает, что gl_FragCoord действительно дает значения x.5 вместо целых чисел по умолчанию. Так что это действительно так же просто, как разделение по размеру текстуры. - person Christian Rau; 11.12.2011
comment
@ChristianRau: Спасибо за внимание. - person datenwolf; 11.12.2011