Android 调用GLLINK程序后,应用程序冻结

Android 调用GLLINK程序后,应用程序冻结,android,opengl-es,glsles,opengl-es-3.0,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(

更新 我正在尝试使用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);
}
这是我的碎片着色器

#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

这在某些设备(索尼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偏移量,因为结构数据读取的元素大小为vec4(16字节)

当我只使用一个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时未传递到着色器的数据一样,我找到了一些解决方案。自opengl es版本3.1以来,此功能正常工作。我认为3.0版本不支持包含float或int元素的结构数据。

我也遇到过同样的问题。当我调用gllinkprogram()时,Nexus7(2013)被冻结了。我发现只有在着色器中有“if语句”时才会发生这种情况。我能够将我的两个“if语句”都更改为“条件运算符”,并且它起了作用


例如(cond)?cond1:cond2

版本前是否有空格?它可能会在某些设备上导致错误…不,在实际挂起的位置没有任何冗余空间?你提到了glLinkProgram,但也提到了instanceBuffer.putFloat,但假设你的应用程序连instanceBuffer.putFloat都不应该到那么远,如果程序链接失败…@solidpixel,你是对的,如果应用程序冻结在glLinkProgram上,那么应用程序就不能到达instanceBuffer.putFloat。但是当我从struct中删除float和uint时,它就变成了instancebufferput;驱动程序不应该像这样挂起…链接上的freez表示未成功创建或处于无效状态的opengl对象的使用。您是否检查了您创建的所有对象的编译和其他错误?是的,我检查了,没有任何错误,它的get-to-Gllink程序行正常,没有错误。