我是 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 使用?