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

Как получить информацию о пикселях внутри фрагментарного шейдера?

В моем шейдере фрагмента я могу загрузить текстуру, а затем сделать это:

uniform sampler2D tex;

void main(void) {
   vec4 color = texture2D(tex, gl_TexCoord[0].st);
   gl_FragColor = color;
}

Это устанавливает текущий пиксель в значение цвета текстуры. Я могу изменить их и т.д., И он работает хорошо.

Но несколько вопросов. Как я могу сказать, "какой" пиксель я? Например, скажем, я хочу установить пиксель 100 100 (x, y) на красный. Все остальное черное. Как мне сделать:

", если currentSelf.Position() == (100,100), затем color = red, else color = black?"

?

Я знаю, как устанавливать цвета, но как мне получить "мое" местоположение?

Во-вторых, как мне получить значения из соседнего пикселя?

Я пробовал это:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);

Но непонятно, что он возвращает? если я пиксель 100 100; как получить значения от 101 100 или 100 101?

4b9b3361

Ответ 1

Как я могу указать "какой" пиксель?

Ты не пиксель. Вы фрагмент. Есть причина, по которой OpenGL называет их "Фрагментными шейдерами"; потому что они еще не пиксели. Действительно, они не только не могут стать пикселями (через discard или глубинные тесты или что-то еще), благодаря мультисэмплированию несколько фрагментов могут объединяться, чтобы сформировать один пиксель.

Если вы хотите указать, где ваш шейдер фрагмента находится в пространстве окна, используйте gl_FragCoord. Позиции фрагмента - это значения с плавающей запятой, а не целые числа, поэтому вам нужно протестировать диапазон, а не одно значение "100, 100".

Во-вторых, как мне получить значения из соседнего пикселя?

Если вы говорите о соседнем пикселе фреймбуфера, вы этого не делаете. Фрагментные шейдеры не могут произвольно считываться из фреймбуфера, либо в их собственной позиции, либо в соседнем.

Если вы говорите о доступе к соседнему текселю из того, к которому вы обращались, то это просто вопрос смещения координаты текстуры, которую вы передаете на texture2D. Вы должны получить размер текстуры (поскольку вы не используете GLSL 1,30 или выше, вам нужно вручную передать это), инвертируйте размер и добавьте или вычтите эти размеры из S и T компонента координаты текстуры.

Ответ 2

Легкий 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;

Вот хороший пример здесь