Android / OpenGLES2 - 在不同的线程中创建“着色器”程序

时间:2012-07-29 14:44:00

标签: java android opengl-es

我是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);

如果线程A创建了mProgram,则glGetAttribLocation返回-1 当线程B创建mProgram时,glGetAttribLocation返回有效位置

如果线程A创建了mProgram并且positionHandle被硬编码到有效位置着色器程序不起作用。

我的问题:是否可以在线程A中创建着色器程序以供线​​程B使用?

1 个答案:

答案 0 :(得分: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的所有问题的原因是,只有一个线程可以拥有OpenGL上下文。