Легко peasy.
Просто рассчитайте размер пикселя в зависимости от разрешения. Затем посмотрите на +1 и -1.
vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;
gl_FragColor = (
texture2D(u_image, v_texCoord) +
texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) +
texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0))) / 3.0;
Есть хороший пример здесь
Как мне сказать, «какой» у меня пиксель?
Вы не пиксель. Вы фрагмент . Есть причина, по которой OpenGL называет их «Фрагментные шейдеры»; это потому, что они не являются пикселями еще . Действительно, они не только не могут стать пикселями (с помощью discard
или тестов глубины или чего-либо еще), благодаря мультисэмплингу, несколько фрагментов могут объединяться, образуя один пиксель.
Если вы хотите сказать, где находится ваш фрагментный шейдер в пространстве окна, используйте gl_FragCoord
. Позиции фрагментов являются значениями с плавающей точкой, а не целыми числами, поэтому вам нужно тестировать с диапазоном, а не с одним значением «100, 100».
Во-вторых, как мне получить значения из соседнего пикселя?
Если вы говорите о соседнем пикселе кадрового буфера, вы не . Фрагментные шейдеры не могут произвольно считывать данные из буфера кадров, как в своей собственной позиции, так и в соседней.
Если вы говорите о доступе к соседнему текселю из того, к которому вы обращались, то это просто вопрос смещения координаты текстуры, которую вы передаете texture2D
. Вы должны получить размер текстуры (так как вы не используете GLSL 1.30 или выше, вы должны передать это вручную), инвертировать размер и либо добавить, либо вычесть эти размеры из компонента S и T координаты текстуры .