#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.