Установить и получить данные из FBO - PullRequest
2 голосов
/ 24 ноября 2011

Я пытаюсь провести 2D симуляцию жидкости с помощью OpenGL ES 2.0. После чтения некоторых книг и поиска в Интернете некоторое время. У меня есть некоторые основные идеи, но я не уверен, что это правильно. Может быть, вы можете помочь мне в этом.

Во-первых, я прочитал книгу, в которой говорится, что мы можем использовать текстуру в качестве 2D-массива, мы можем получать / устанавливать данные в фрагментном шейдере. Это то, что делает FBO? Мы можем установить и получить данные с помощью gl_FragData [n]? Однако, если мы сохраним целое число в текстуре, как мы можем установить / получить данные с помощью float?

Во-вторых, как мы можем получить правильный 2D-индекс с помощью gl_FragCoord? Как мы знаем, мы используем (s, t) для представления координат текстуры, но это между [0,1]. Если я просто хочу нарисовать прямоугольник, который равен (0,0) (0,1) (1,0) (1,0) и текстура 512 * 512. Как мы можем получить правильный двумерный индекс в фрагментном шейдере?

После того, как вопрос приходит из шейдера Игрушка http://www.iquilezles.org/apps/shadertoy/

vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;

Я не совсем понимаю, что означает эта строка. Я знаю, что это о позиции, я думаю. Однако я не понимаю, почему.

Извините за мой плохой английский.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Вы не можете писать в gl_FragData, вы можете только читать из него.

То, что вы можете сделать, это:

  • Создание 2 целей рендеринга (2D текстуры)
  • Свяжите rt0 как текстуру, с которой вы читаете, и rt1 как текстуру, которую вы визуализируете "сцену" в
  • Привязать rt1 ко второму шейдеру, который используется для отображения текущей текстуры на экране
  • Поменяйте местами rt0 (запись) и rt1 (чтение) и начните с начала

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

1 голос
/ 24 ноября 2011

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

Я сомневаюсь, что gl_FragData может читать текст сообщениятекстура, прикрепленная к фреймбуферу: gl_FragData должна быть неопределенной, пока она не будет записана.На самом деле вы можете читать gl_FragData только после того, как написано, в противном случае вы получите неопределенный bahvior.

Значения образцов текстуры обычно нормализуются в диапазоне [0.0,1.0].Поскольку gl_FragData объявлено как vec4, запись значения в диапазоне [0.0,1.0] определяет значение текселя [0, MAX_VALUE], где MAX_VALUE - максимальное значение базового типа, определенного внутренним форматом текстуры.Вы можете получить эти целочисленные значения, вызвав glGetTexImage.Не уверен, что произойдет, если вы установите значение вне диапазона [0.0,1.0].

Внутренние форматы текстуры также могут быть определены как с плавающей точкой .

Фрагменты назначенияопределяются текстурой, так как текстура является буфером назначения.Каждый фрагментный шейдер определяет цвет фрагмента в позиции gl_FragCoord.xy (в координатах текстура / буфер / экран): эта переменная предлагается исполнителем шейдера и доступна только для чтения.По сути, один фрагментный шейдер для каждого текстурного текселя.

Зная размеры «экрана» (то есть размеры текстуры), вы можете написать координаты текстуры (x/y) в диапазоне [0.0,1.0], используя экземпляр шейдера, имеющийgl_FragCoord равно (gl_FragCoord.x/texSizeX,gl_FragCoord.y/texSizeY).

...