在调用glLinkProgram之后,应用程序冻结了

时间:2017-05-02 14:45:37

标签: android opengl-es glsles opengl-es-3.0

已更新 我试图用openGL ES3绘制纹理,并使用实例绘图绘制我的绘图应用程序。这是我的顶点着色器

#version 300 es
precision highp float;

uniform mat3 u_Matrix;

in vec2 Position;
in vec2 TexPosition;

struct Data {
    vec2 pos;
    vec2 scale;
    uint color;
    float rotation;
};

layout(std140) uniform InstanceData {
    Data data[256];
};

out vec4 v_Color;
out vec2 v_TexPosition;

void main() {
vec2 endPos = Position * data[gl_InstanceID].scale;
if (data[gl_InstanceID].rotation != 0.0) {
    float cos = cos(data[gl_InstanceID].rotation);
    float sin = sin(data[gl_InstanceID].rotation);


    endPos = vec2(endPos.x * cos - endPos.y * sin, endPos.x * sin + 

    endPos.y * cos) + data[gl_InstanceID].pos;
    } else {
        endPos = endPos + data[gl_InstanceID].pos;
    }

    uint fColor = data[gl_InstanceID].color;
    v_Color.r = float((fColor & 0x00FF0000U) >> 16) / 255.0;
    v_Color.g = float((fColor & 0x0000FF00U) >> 8) / 255.0;
    v_Color.b = float(fColor & 0x000000FFU) / 255.0;
    v_Color.a = float((fColor & 0xFF000000U) >> 24) / 255.0;

    v_TexPosition = TexPosition;
    gl_Position = vec4(u_Matrix * vec3(endPos, 1.0), 1.0);
}

这是我的fragment_shader

#version 300 es
precision highp float;

in vec2 v_TexPosition;
in vec4 v_Color;

uniform sampler2D u_Texture2D;

out vec4 fragColor;

void main() {
    vec4 color = texture(u_Texture2D, v_TexPosition);
    fragColor = vec4(v_Color.rgb, color.a * v_Color.a);
}

当我创建程序,附加着色器并尝试链接到程序时,应用程序冻结在线glLinkProgram上。着色器和程序具有正常的ID。

这项工作正常在某些设备上(sony xperia Z -android 5.0,smasung s7 edge android 7,nexus 5x - android 7,nexus 6p - android 7)但这并不适用于其他设备(motX) - android 5.1,smasung s5 android 6.0)。所有设备的Android版本都大于5.0,在代码中我检查了opengl ES3支持。

这有什么理由吗?是来自设备(如何检查)?还是我做错了什么? 我用这种方式将数据传递给了instanceBuffer:

instanceBuffer.putFloat(posX);
instanceBuffer.putFloat(posY);
instanceBuffer.putFloat(scaleX);
instanceBuffer.putFloat(scaleY);
instanceBuffer.putInt(colorARGB);
instanceBuffer.putFloat((float) Math.toRadians(rotate));
instanceBuffer.position(instanceBuffer.position() + 8);

使用+8偏移量,因为struct data读取具有vec4大小(16byte)的元素

当我用一个vec4编写我的结构时:

struct Data {
    vec4 posAndScale;
};

并传递数据:

instanceBuffer.putFloat(posX);
instanceBuffer.putFloat(posY);
instanceBuffer.putFloat(scaleX);
instanceBuffer.putFloat(scaleY);

这适用于所有设备, 但是当我再添加一个vec4时:

struct Data {
    vec4 posAndScale;
    vec4 color;
};

并传递数据

instanceBuffer.putFloat(posX);
instanceBuffer.putFloat(posY);
instanceBuffer.putFloat(scaleX);
instanceBuffer.putFloat(scaleY);
instanceBuffer.putFloat(color.r);
instanceBuffer.putFloat(color.g);
instanceBuffer.putFloat(color.b);
instanceBuffer.putFloat(color.a);

应用程序没有冻结,但是当我尝试绘制时没有任何反应。它似乎在某些设备上std140以不同的方式工作,或者在使用2 vec4-s编写struct时未将数据传递给着色器

2 个答案:

答案 0 :(得分:0)

好的,我找到了一些解决方案。这项工作通常来自opengl es version 3.1。我认为3.0版本不支持包含float或int元素的struct数据。

答案 1 :(得分:0)

我遇到了同样的问题。当我打电话给gllinkprogram()时,Nexus 7(2013)被冻结了。我发现这只发生在我的着色器中有'if statements'时。我能够将我的'if语句'改为'条件运算符'并且它有效。

E.g。 (条件)? COND1:COND2