내가 OpenGL을 ES3와 질감을 그릴려고 업데이트 내 그리기 응용 프로그램에 대한 복제 된 도면을 사용 정지. 이건 내 버텍스 쉐이더통화 후 glLinkProgram 앱에서
#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- 안드로이드 5.1, smasung s5 안드로이드 6.0). 모든 장치는 5.0보다 큰 안드로이드 버전을 가지고 있으며 코드에서 OpenGL ES3를 지원하는지 확인했습니다.
여기에는 몇 가지 이유가있을 수 있습니까? 기기에서 가져 왔습니까 (확인 방법)? 또는 나는 틀린 무엇을 했습니까? 나는이 방법을 instanceBuffer에 데이터를 전달 해요 : 구조체 데이터가 vec4 크기 (16 바이트)을 가진 요소를 읽을 수 있기 때문에 +8 오프셋을 사용
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);
나는 하나의 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);
응용하지 정지를하지만 그릴 때 아무 일도하지 않습니다. 그건 다른 방법 또는 2 vec4-의
#version 이전에 공백이 있습니까? 일부 장치에서 오류가 발생할 수 있습니다 ... – andras
아니요, 여유 공간이 없습니다 어딘가에 –
실제로 매달려있는 것은 무엇입니까? 당신은 glLinkProgram뿐만 아니라 instanceBuffer.putFloat를 언급 할 것입니다 만, 아마도 당신의 app이 심지어 instanceBuffer.putFloat까지 도달해서는 안됩니다 ... – solidpixel