0

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 で使用できるようにすることは可能ですか?

4

1 に答える 1

0

私はあなたの質問全体を読んでいませんでした。私は「あなたのシナリオ」だけを読みました。そして、あなたはOpenGL / GameDevに不慣れであると言っているので、私は単にあなたの「シナリオ」が間違っていると言います。ずっと前に、私が書いた最初のゲームも同様のアプローチを使用していたので、私はあなたを責めません:)。

次のように機能する単一のスレッドを使用する必要があります。

load everything (textures, shaders, buffers, ...)
while (running)
{
    start timer
    update game (step by one frame, handle user input)
    render game
    show to openglbuffer to the screen (swap buffers)
    stop timer
    manage fps limiting (ie: sleep, using the difference of the timers)
}
clean up

あなたが持っているOpenGLに関するすべての問題の理由は、1つのスレッドだけがOpenGLコンテキストを持つことができるということです。

于 2012-07-29T14:53:44.013 に答える