2012-07-29 25 views
0

我是新来的OpenGLES,我已经得到了与着色器程序的问题 我的情况是:的Android/OpenGLES2 - 在不同的线程创建“着色器”程序

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不能访问attribs,统一地点

这是一个如何创建着色器程序:

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

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

如果创建mProgram和positionHandle线程A是硬编码到有效位置着色器程序不工作eather。

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

+0

一次只能有一个呈现上下文处于活动状态,并且不能从其他线程使用。您应该阅读以下内容:http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html#.UBWq0bQlVTI 但是,我无法找到GLES20的makecurrent替代方案。很可能它不存在。我会建议在主线程中调用OpenGL命令。 – 2012-07-29 21:33:47

回答

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上下文。

+0

我在GameDev(directX)和多重威胁方面有经验,所以它不是问题。 我的问题是着色器程序,因为我知道,OpenGL的工作作为国家机器,我100%肯定的是,当线程A创建着色器程序线程B什么都不做,我应该能够创建有效的着色器程序 – EOG 2012-07-29 15:02:55

+1

也许,你误会了我的句子,但只有一个**固定**线程有上下文。但我认为应该可以手动更改它。 http://www.opengl.org/wiki/OpenGL_context – 2012-07-29 15:18:08

+0

DirectX以与OGL完全不同的方式工作。 DX版本的工作方式各不相同,因此您必须将其考虑在内。它在我看来,你正在尝试做双缓冲,有一个适当的OGL方式来做到这一点(谷歌它)。 – Astronaut 2012-07-29 21:13:38