Я пишу простую тестовую программу на 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.
Похоже, что у вас есть какие-то сглаживания на фотографиях, как вы теряете белую точку? (и какова текстура, которую вы используете при рисовании точки?) – Jerem
Текстура @ 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' –
Попробуйте отключить альфа-тест, похоже, что он включен на новом снимке экрана. – Jerem