2012-07-29 27 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