更新済み 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- android 5.1、smasung s5 android 6.0)。すべてのデバイスはアンドロイドバージョンが5.0以上で、コードではopengl ES3がサポートされているかどうかを確認しました。
これには何らかの理由がありますか?それはデバイスからですか(それを確認する方法)?または私は間違った何かをしましたか? 私はこの方法でinstanceBufferにデータを渡されています。structデータは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);
これは、すべてのデバイス上で動作し、 しかし、私は1つ以上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を書いたときに渡されないようなデータ
#versionの前に空白がありますか?一部のデバイスでエラーが発生する可能性があります... – andras
いいえ、どこかに余分なスペースがありません –
実際に何が掛かっていますか?あなたはglLinkProgramとかinstanceBuffer.putFloatの両方に言及していますが、プログラムがリンクに失敗した場合でも、instanceBuffer.putFloatまでは到達しないはずです... – solidpixel