OpenGL ES 2.0 SL записывает из фрагментного шейдера в текстуру

Надеюсь, это действительно простой вопрос.

Как записать текстуру, прикрепленную к фреймбуферу, из фрагментного шейдера. Я предполагаю, что это просто gl_FragColor, я должен определить/использовать другую переменную, например gl_Data[0]?

Фрагмент шейдера:

        precision mediump float;
        varying vec2 vTextureCoord;
        uniform sampler2D displayTexture;
        void main() {
          gl_FragColor = texture2D(displayTexture, vTextureCoord);
        }

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


person HPP    schedule 08.01.2014    source источник
comment
Да, это должно быть то же самое. Когда вы переключитесь на буфер отображения, вам нужно будет изменить программу шейдера, если у вас есть другие потребности в юниформе/обработке.   -  person Prabindh    schedule 08.01.2014


Ответы (1)


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

person Matic Oblak    schedule 08.01.2014
comment
Может ли быть что-то странное с форматом текстуры, прикрепленным к FBO? Например, я определяю некоторые атрибуты конфигурации в EGL как RGBA8, но нет возможности прикрепить текстуру к FBO, только RGBA4, поэтому преобразование выполняется автоматически или это что-то, что меня убьет? - person HPP; 16.01.2014
comment
Преобразование может убить вас. Вы должны быть в состоянии сделать это RGBA8. Куда вы вставляете этот параметр? Это может быть просто RGB по умолчанию. Кроме того, если я правильно помню, внутри openGL всегда будет работать с RGBA8 и будет масштабировать другие форматы при передаче данных: RGBA4 будет масштабироваться x2 до RGBA8, но данные, которые вы нажимаете на текстуру, должны быть 16-битными (что убивает вас). - person Matic Oblak; 16.01.2014
comment
glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, rain.width, rain.height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_4_4_4_4, juliaTexBuff) предположительно, это всегда работает с GL_UNSIGNED_SHORT_4_4_4_4, поэтому я не думаю, что это та часть, которая меня убивает. Этот вопрос завершен, и на этот вопрос дан ответ здесь - person HPP; 16.01.2014
comment
Поскольку вы прикрепляете этот буфер, соответствующими параметрами являются GLES20.GL_RGBA. Вам даже не нужен juliaTexBuff, вы можете отправить его как NULL, если вы не начинаете буфер с некоторыми данными, но очистка буфера кадра будет работать над этими данными. Если вы используете его (или дополнительное изображение), то этот буфер данных должен соответствовать значениям GL_UNSIGNED_SHORT_4_4_4_4. - person Matic Oblak; 16.01.2014
comment
Откуда вы знаете о Юлии? ВЫ ШПИОНИТЕ ЗА МНОЙ? о, ic, неважно. Что вы имеете в виду, что juliaTexBuff может быть нулевым? Это может быть важно. Итак, вы говорите, что при переключении между двумя текстурами (чтение/запись) вызовите glTexImage2D() после каждого glBindTexture() (во время инициации), чтобы обе текстуры были присоединены как TexImage2D, а intBuff НЕ является точкой соединения? - person HPP; 17.01.2014
comment
ВАУ ты пинаешь так много ***! Я бы всю жизнь пытался разобраться с этой ошибкой, если бы вы не добавили это примечание. - person HPP; 18.01.2014