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 问题的原因是只有一个线程可以拥有 OpenGL 上下文。

于 2012-07-29T14:53:44.013 回答