2015-04-25 3 views
1

Я пишу простую тестовую программу на Android с помощью GLES 2.0 или 3.0. (Если решение работает только на один над другим, чем то, что я пойду с.)GLES2.0 + framebuffer fade artifacts

Проблема:

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

Пример:

  • Example Pictures (Sorry, I cant post images directly yet)
  • Разрешение буферов кадров была снижена, чтобы сделать артефакты более заметными.
  • Эта проблема возникает на всех проверенных устройствах (Nexus 7 2012 и 2013, Galaxy Tab S 8.4, Galaxy S6 Edge, Galaxy Note 4)
  • На новых устройствах проблема выглядит как маленькие розовые однородные точки, на более старые устройства кажутся неоднородными, как показано на связанных изображениях.
  • Запуск размытия передачи на финальном рендеринге также не может быть и речи, поскольку это должно быть энергоэффективным и мобильным.

Планировка:

  • создать 2 буферов кадров. (Использование GLES20.GL_UNSIGNED_SHORT_5_6_5 формат.)
  • Я установил первый как цель рендеринга.
  • Я рисую квад, который является размером буфера для фреймбуфера.
  • Фрагмент фрагмента quads - это настройка для черной точки, которая перемещается по кругу.
  • Квадрат также может принимать текстуру и смешивать ее с точкой.
  • Затем я вернусь к рендерингу на экран.
  • Я представляю еще один квад, используя ранее установленную цель рендеринга в качестве текстуры.
  • Затем этот процесс повторяется, каждый кадр переключает текстуры.

Рендер Код:

int i = 0; 
@Override public void onDrawView() { 
    setRenderTarget(mRenderTexture[i]); 
    mTestShader.setTexture0(mRenderTexture[(i + 1) % 2].getTextureHandle()); 
    mTestShader.draw(mBlitQuad); 
    setRenderTarget(null); 
    mBlitShader.setTexture0(mRenderTexture[i].getTextureHandle()); 
    mBlitShader.draw(mBlitQuad); 
    i = ++i % 2; 
} 

Shader Код:

precision highp float; 

uniform float u_GlobalTime; 
uniform vec3 u_Resolution; 
uniform sampler2D u_Texture0; 

varying vec2 v_TexCoord; 

void main(void) { 
    vec2 uv = v_TexCoord * 2.0 - 1.0; 
    uv.x *= u_Resolution.z; 
    vec2 pos = vec2(cos(u_GlobalTime), sin(u_GlobalTime)) * 0.5; 
    vec4 circle = vec4(1.0 - smoothstep(0.09, 0.11, length(pos - uv))); 
    vec4 px = max(texture2D(u_Texture0, v_TexCoord), circle) - 0.025; 
    gl_FragColor = step(0.15, px) * px; 
} 

Любая помощь по этому вопросу?

EDIT:
После того, как Джерем отправился в поисковую систему, я нашел GLES20.glDisable (GLES20.GL_DITHER). Это помогает решить эту проблему, и на более новых устройствах она работает отлично. На старых устройствах я все еще сталкиваюсь с артефактами, как показано HERE.

EDIT2:
После нескольких тестов, переход на буферный формат с четными цветами RGB, похоже, сделал трюк GLES30.GL_UNSIGNED_SHORT_5_5_5_1.Я предполагаю, что это связано с тем, как GPU сжимает фреймбуфер, поскольку зеленый цвет становится более заметным. (Было бы полезно узнать конкретную причину того, почему ему не нравится формат 5_6_5.)
Окончательный результат после применения обоих исправлений: i.imgur.com/bQsG9YJ.png.

+0

Похоже, что у вас есть какие-то сглаживания на фотографиях, как вы теряете белую точку? (и какова текстура, которую вы используете при рисовании точки?) – Jerem

+0

Текстура @ u_Texture0 является буфером кадров, противоположным тому, который в настоящее время отображается. У белой точки 0,025 вычитается из нее каждый кадр, а любое значение ниже 0,15 установлено на 0. Изменение конфигурации фреймбуферов не устраняет эту проблему. «Код» mFormat = GLES20.GL_UNSIGNED_SHORT_5_6_5; mWrapMode = GLES20.GL_CLAMP_TO_EDGE; mFilterMode = GLES20.GL_LINEAR; 'code' –

+0

Попробуйте отключить альфа-тест, похоже, что он включен на новом снимке экрана. – Jerem

ответ

2

Его многокомпонентное решение, вызывайте GLES20.glDisable (GLES20.GL_DITHER), установите формат буфера визуализации в GLES30.GL_UNSIGNED_SHORT_5_5_5_1, и, как сказал Джерем, вы также сможете получить еще лучшие результаты с отключенной альфа-функцией, хотя эксперимент с тем, что на моем устройстве выбор, по-видимому, не имеет никакого эффекта, возможно, на других устройствах.