Я пытаюсь создать рендер для класса текстур, который имеет фреймбуфер для позиции и фреймбуфер для вращения. Эта часть отлично работает. Но когда я переключаюсь и возвращаюсь в свое приложение, он падает, потому что проверка состояния framebuffer возвращает frameBuffer неполного отсутствующего вложения.Android: Framebuffer отсутствует вложение
public void setup(Context context) {
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = 1.5f;
final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = -5.0f;
final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER,
ShaderHelper.readShader(context, R.raw.vertex_shader));
int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER,
ShaderHelper.readShader(context, R.raw.fragment_shader));
mProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle,
new String[] {"a_Position", "a_TexCoord"});
vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER,
ShaderHelper.readShader(context, R.raw.particle_vertex_shader));
fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER,
ShaderHelper.readShader(context, R.raw.particle_fragment_shader));
mPartProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle,
new String[] {"a_Position"});
// create the ints for the framebuffer, depth render buffer and texture
final int[] fb = new int[2];
// generate
GLES20.glGenFramebuffers(2, fb, 0);
if (!setup) {
posTex = ShaderHelper.genTexture(texW, texH, null);
velTex = ShaderHelper.genTexture(texW, texH, null);
rotTex = ShaderHelper.genTexture(texW, texH, null);
rotVelTex = ShaderHelper.genTexture(texW, texH, null);
atlasTex = ShaderHelper.loadTexture(context, R.drawable.ship_atlas);
}
posFb = fb[0];
rotFb = fb[1];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, posFb);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, posTex, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, rotFb);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, rotTex, 0);
final int buffers[] = new int[2];
GLES20.glGenBuffers(2, buffers, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, spriteBuffer.capacity() * BYTES_PER_FLOAT, spriteBuffer, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[1]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, renderQuad.capacity() * BYTES_PER_FLOAT, renderQuad, GLES20.GL_STATIC_DRAW);
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
mAtlasTexHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_TexAtlas");
mPosTexHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_PosTexture");
mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position");
mTexCoordHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoord");
mXTexHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Values");
mDXTexHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Transforms");
mPassHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Pass");
mFBPositionHandle = GLES20.glGetAttribLocation(mPartProgramHandle, "a_Position");
spriteBufferIdx = buffers[0];
fbQuadBufferIdx = buffers[1];
setup = true;
}
Из того, что я исследовал, текстуры не должны быть перегружены, и только фреймбуферов делать. Это хорошо, потому что тогда мне придется как-то поместить пиксели из старой текстуры в новую текстуру. Но не переделывая текстуры, он падает с ошибкой framebuffer. Чтобы было ясно, код запускается каждый раз при вызове функцииSurfaceChanged.
Как я могу это сделать, поэтому мне не нужно генерировать новую текстуру каждый раз, когда onSurfaceChanged вызывается, не получая ошибку «Ошибка неполного пропущенного вхождения FrameBuffer»?