我是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使用?
答案 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上下文。