2017-05-02 1 views
0

내가 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-의

+0

#version 이전에 공백이 있습니까? 일부 장치에서 오류가 발생할 수 있습니다 ... – andras

+0

아니요, 여유 공간이 없습니다 어딘가에 –

+0

실제로 매달려있는 것은 무엇입니까? 당신은 glLinkProgram뿐만 아니라 instanceBuffer.putFloat를 언급 할 것입니다 만, 아마도 당신의 app이 심지어 instanceBuffer.putFloat까지 도달해서는 안됩니다 ... – solidpixel

답변

0

좋아, 내가 찾은 몇 가지 솔루션 구조체를 쓸 때 쉐이더에 전달되지 않은 데이터와 같은 std140 일 일부 장치처럼 보인다. 이 작업은 일반적으로 opengl 3.1 이후 버전입니다. 3.0 버전은 float 또는 int 요소가 들어있는 구조체 데이터를 지원하지 않습니다.

+0

freez on linking은 성공적으로 생성되지 않았거나 _invalid_ 상태에있는 OpenGL 개체의 사용을 나타냅니다. 작성한 모든 오브젝트에 대해 컴파일 및 기타 오류를 점검 했습니까? –

+0

예, 오류가 없으며 glLinkProgram 행이 정상적으로 표시되고 오류가 없습니다. –

0

같은 문제가 발생했습니다. gllinkprogram()을 호출하면 Nexus 7 (2013)이 정지되었습니다. 나는 이것이 내 쉐이더에서 'if 문'을 가지고있을 때만 일어난다는 것을 알았다. 나는 'if statements'를 '조건부 연산자'로 바꿀 수 있었고 효과가 있었다.

예. (cond)? cond1 : cond2

관련 문제