已更新 我试图用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时未将数据传递给着色器
答案 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