Android GLES20.glBlendEquation не работает?

#android #opengl-es-2.0 #pixel-shading

#Android #opengl-es-2.0 #затенение пикселей

Вопрос:

Я уже несколько недель пытаюсь создать движок 2.5D с текстурами карты глубины и нормалей, мало чем отличающийся от того, что используется здесь Linky. Подумав, что отрисовка карты глубины в шейдере фрагмента из текстуры была невозможна из-за того, что в ES 2.0 отсутствовала переменная gl_FragDepth, я нашел учебное пособие для iOS, где они использовали glBlendEquation с режимом GL_MIN / GL_MAX для «подделки» буферизации глубины фрагмента в Linky framebuffer-texture. К сожалению, GLES20.glBlendEquation приводит к сбою приложения на обоих моих телефонах (SGS 1/2) с помощью исключения UnsupportedOperationException. Итак, мне интересно, использовал ли кто-нибудь эту функцию с каким-либо успехом? GL_MIN / GL_MAX также, похоже, отсутствуют в спецификации Android Opengl ES 2.0, поэтому мне, вероятно, здесь не повезло… Есть идеи?

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

Комментарии:

1. @jave Нет, я больше не изучал это, и у меня не было никаких отзывов на каких-либо форумах. Итак, я предполагаю, что это не реализовано в Android OpenGL ES 2.0. Возможно, это было исправлено в более новых версиях ОС? Я тестировал это с помощью Android OS v2.3.

2. Хорошо, я сам столкнулся с этой проблемой пару дней назад, но тоже не нашел решения. (Кстати, используется Android 2.2). Если вы решите проблему, я хотел бы посмотреть, как вы это сделали.

3. Привет, я изучал это, и на Android 2.2 мне не удалось заставить glBlendEquation () работать даже для простого аддитивного смешивания. Я бы сказал, что это один из многих недостатков. Я бы попробовал на устройстве 2.3, некоторые проблемы, связанные с OpenGL, там исправлены. Кроме того, на Tegra (и других устройствах с GL_NV_shader_framebuffer_fetch) блендер является частью fragment shader (поэтому уравнение смешивания может быть записано в GLSL, и его довольно легко реализовать min()).

4. Я также заметил, что приложение вылетает всякий раз, когда я вызываю glBlendEquation. Использование Android 2.3.

Ответ №1:

я экспериментировал на своем планшете Vega (Tegra), и это сработало для меня:

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

 #extension GL_NV_shader_framebuffer_fetch : require 
// makes gl_LastFragColor accessible

precision highp float;

varying vec2 v_texcoord;

uniform sampler2D n_sampler;

void main()
{
    vec4 v_tex = texture2D(n_sampler, v_texcoord);
    gl_FragColor = min(gl_LastFragColor, v_tex); // MIN blending
}
  

Довольно просто, да? Но я боюсь, что это будет только для NV.