Android LibGDX 着色器兼容性
Android LibGDX shader compatibility
我正在为 Android 使用 LibGDX。
我的片段和顶点着色器如下
片段着色器:
#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。
我已经在模拟器和我的 phone (huaweii j6ii) 中测试了这段代码。
但对其他设备有疑问。
取消此片段着色器是否兼容所有设备?
Does this fragment shader compatible with all device?
它应该适用于任何支持 OpenGL ES 2.0 以上的设备。
一个观察结果是,按像素执行此操作比需要的更昂贵:
frgCOverRes = gl_FragCoord.xy * oneOverResolution.xy;
frgCOverRes.y = -frgCOverRes.y + 1.0;
为什么不首先上传正确的纹理坐标? y 翻转应该是可预测的。 (如果失败,最好在每个顶点而不是每个片段的顶点着色器中更正它)。
我正在为 Android 使用 LibGDX。 我的片段和顶点着色器如下
片段着色器:
#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。
我已经在模拟器和我的 phone (huaweii j6ii) 中测试了这段代码。
但对其他设备有疑问。
取消此片段着色器是否兼容所有设备?
Does this fragment shader compatible with all device?
它应该适用于任何支持 OpenGL ES 2.0 以上的设备。
一个观察结果是,按像素执行此操作比需要的更昂贵:
frgCOverRes = gl_FragCoord.xy * oneOverResolution.xy;
frgCOverRes.y = -frgCOverRes.y + 1.0;
为什么不首先上传正确的纹理坐标? y 翻转应该是可预测的。 (如果失败,最好在每个顶点而不是每个片段的顶点着色器中更正它)。