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

26
задан user697111 19 March 2012 в 23:25
поделиться

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;

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

3
ответ дан Marian Nasry 19 March 2012 в 23:25
поделиться
  • 1
    Это добилось цели! По моему очень скромному мнению о притворстве это должно быть лучшим ответом. – Pathros 11 March 2018 в 16:29
  • 2
    Это добилось цели! По моему очень скромному мнению о притворстве это должно быть лучшим ответом. – Pathros 11 March 2018 в 16:29
  • 3
    Это добилось цели! По моему очень скромному мнению о притворстве это должно быть лучшим ответом. – Pathros 11 March 2018 в 16:29
  • 4
    Это добилось цели! По моему очень скромному мнению о притворстве это должно быть лучшим ответом. – Pathros 11 March 2018 в 16:29
  • 5
    Это добилось цели! По моему очень скромному мнению о притворстве это должно быть лучшим ответом. – Pathros 11 March 2018 в 16:29

Как мне сказать, «какой» у меня пиксель?

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

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

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

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

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

30
ответ дан Nicol Bolas 19 March 2012 в 23:25
поделиться
  • 1
    +1, мне потребовались 4 часа для окончательного нахождения то, что вызывало проблему. После использования точного сценария соединения от ручного примера PHP, как это могло возможно быть проблемой? I' m настолько безумный в команде разработки PHP прямо сейчас... – NotGaeL 12 June 2013 в 23:56
  • 2
    +1, мне потребовались 4 часа для окончательного нахождения то, что вызывало проблему. После использования точного сценария соединения от ручного примера PHP, как это могло возможно быть проблемой? I' m настолько безумный в команде разработки PHP прямо сейчас... – NotGaeL 12 June 2013 в 23:56
  • 3
    +1, мне потребовались 4 часа для окончательного нахождения то, что вызывало проблему. После использования точного сценария соединения от ручного примера PHP, как это могло возможно быть проблемой? I' m настолько безумный в команде разработки PHP прямо сейчас... – NotGaeL 12 June 2013 в 23:56
  • 4
    +1, мне потребовались 4 часа для окончательного нахождения то, что вызывало проблему. После использования точного сценария соединения от ручного примера PHP, как это могло возможно быть проблемой? I' m настолько безумный в команде разработки PHP прямо сейчас... – NotGaeL 12 June 2013 в 23:56
  • 5
    +1, мне потребовались 4 часа для окончательного нахождения то, что вызывало проблему. После использования точного сценария соединения от ручного примера PHP, как это могло возможно быть проблемой? I' m настолько безумный в команде разработки PHP прямо сейчас... – NotGaeL 12 June 2013 в 23:56
Другие вопросы по тегам:

Похожие вопросы: