Совместимость с шейдерами Android LibGDX - PullRequest
0 голосов
/ 16 октября 2019

Я использую LibGDX для Android. У меня есть фрагментные и вершинные шейдеры, как указано ниже

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

#ifdef GL_ES
#define LOW lowp
#define MED mediump
#define HIGH highp
precision mediump float;
#else
#define MED
#define LOW
#define HIGH
#endif

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

uniform vec2 oneOverResolution;

vec2 frgCOverRes;

void main() {
   frgCOverRes = gl_FragCoord.xy*oneOverResolution.xy;
   frgCOverRes.y = -frgCOverRes.y+1;

   vec4 c = texture2D(u_texture, frgCOverRes);

   gl_FragColor = c;
}

вершинный шейдер:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}

Но Я читал, что highp несовместим с некоторыми устройствами.

А также не используется (mediump, lowp также не используется).

Итак, я собираюсь изменить фрагментный шейдер на следующий код:

#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

uniform vec2 oneOverResolution;

vec2 frgCOverRes;

void main() {
   frgCOverRes = gl_FragCoord.xy*oneOverResolution.xy;
   frgCOverRes.y = -frgCOverRes.y+1.0;

   vec4 c = texture2D(u_texture, frgCOverRes);

   gl_FragColor = c;
}

Я использую 9 в качестве minSdkVersion.

Я тестировал этот код вЭмулятор и в моем телефоне (huaweii j6ii).

Но есть сомнения с другими устройствами.

Деос этот фрагментный шейдер совместим со всеми устройствами?

1 Ответ

1 голос
/ 16 октября 2019

Совместим ли этот фрагментный шейдер со всеми устройствами?

Он должен работать на любом устройстве, поддерживающем OpenGL ES 2.0 и более поздних версий.

Одно наблюдение состоит в том, что это делается для каждого пикселя. это дороже, чем нужно:

frgCOverRes = gl_FragCoord.xy * oneOverResolution.xy;
frgCOverRes.y = -frgCOverRes.y + 1.0;

Почему бы просто не загрузить правильную координату текстуры в первую очередь? Y-flip должен быть предсказуемым. (В противном случае было бы лучше исправить это в вершинном шейдере по каждой вершине, а не по фрагменту).

...