Я работаю над эффектом, который требует двухпроходного рендеринга (т. е. два отдельных шейдера применяются последовательно). Я использую GLSurfaceView с пользовательским средством визуализации.
Чтобы добиться этого эффекта, я сначала пытаюсь выполнить рендеринг в FrameBuffer, а затем в GL_TEXTURE_2D для отображения в GLSurfaceView.
Соответствующий код в методе OnSurfaceCreated выглядит следующим образом:
GLES20.glGenTextures(1, this.textureID, 0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,this.textureID[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
GLES20.glGenTextures(1, textures2D, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures2D[0]);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glGenFramebuffers(1, fboId, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, textures2D[0], 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
Соответствующий код в OnDrawFrame таков:
synchronized (this) {
if (this.updateSurface) {
this.surfaceTexture.updateTexImage();
this.surfaceTexture.getTransformMatrix(this.stMatrix);
this.updateSurface = false;
}
}
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId[0]);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, this.textureID[0]);
// apply the first shader
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures2D[0]);
// apply the second shader
GLES20.glFinish();
Однако программа аварийно завершает работу из-за ошибки glError 1286, которая, похоже, указывает на недопустимую операцию буфера кадра. Я не уверен, что вызывает эту проблему, хотя я подозреваю, что это может быть связано с тем фактом, что SurfaceTexture связана с текстурой GL_TEXTURE_EXTERNAL_OES, в то время как FrameBuffer выводит текстуру GL_TEXTURE_2D.
Любая помощь или совет будут оценены. Спасибо.
glCheckFramebufferStatus()
? - person fadden   schedule 21.02.2016GL_TEXTURE_2D
в качестве конечной цели FBO, поэтому я настроил его таким образом вGLES20.glFramebufferTexture2D()
. В чем я не уверен, так это в том, как сделать образец FBO изGL_TEXTURE_EXTERNAL_OES
для первого прохода рендеринга. Достаточно ли вызватьGLES20.glBindTexture()
для текстуры, из которой будет производиться выборка, а затем я просто настроил FBO, как если бы он выполнял выборку изGL_TEXTURE_2D
? - person Michael   schedule 22.02.2016glClear()
вызовами и пропустите его через многопроходную систему. Как только это сработает, добавьте внешний источник текстуры. - person fadden   schedule 22.02.2016GL_TEXTURE_2D
, если источником являетсяGL_TEXTURE_EXTERNAL_OES
? Могут ли различия в форматах текстур вызвать конфликт? - person Michael   schedule 22.02.2016