OpenGLES は初めてで、シェーダー プログラムに問題があります。私のシナリオは次のとおりです。
Thread A(works as loop) manages everything but it does not draw on screen
Thread B only draws on screen
Thread A decides if Thread B will draw in current cycle
私の問題は、スレッド A がスレッド B のシェーダー プログラムを作成するときに、B が属性と均一な場所にアクセスできないことです。
これは、A がシェーダー プログラムを作成する方法です。
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, pixelShader);
GLES20.glLinkProgram(mProgram);
これは、スレッド B がプログラムを使用する方法です。
GLES20.glUseProgram(mProgram);
int positionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
mProgram がスレッド A によって作成された場合、glGetAttribLocation は -1 を返します mProgram がスレッド B によって作成された場合、glGetAttribLocation は有効な場所を返します
スレッド A が作成した mProgram と positionHandle が有効な場所にハードコードされている場合、シェーダー プログラムは動作しません。
私の質問: スレッド A でシェーダー プログラムを作成し、スレッド B で使用できるようにすることは可能ですか?