【问题标题】:Android LibGDX shader compatibilityAndroid LibGDX 着色器兼容性
【发布时间】:2019-10-16 05:45:35
【问题描述】:

我正在为 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。

我已经在模拟器和手机(华为 j6ii)中测试了这段代码。

但对其他设备有疑问。

Deos 这个片段着色器兼容所有设备?

【问题讨论】:

  • texture2D 已弃用,但您应该没问题。

标签: java android opengl-es libgdx


【解决方案1】:

这个片段着色器是否与所有设备兼容?

它应该适用于任何支持 OpenGL ES 2.0 及更高版本的设备。

一个观察结果是,按像素执行此操作的成本比实际需要的要高:

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

为什么不首先上传正确的纹理坐标呢? y 翻转应该是可预测的。 (如果在每个顶点而不是每个片段的顶点着色器中纠正它会更好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2018-09-27
    相关资源
    最近更新 更多