| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 
 | GLfloat vertices[] = {-1.0f,  1.0f, 0.0f,
 -1.0f, -1.0f, 0.0f,
 1.0f, -1.0f, 0.0f,
 1.0f,  1.0f, 0.0f,
 };
 
 GLfloat onScreenTexCoords[] = {
 0.0f,  0.0f,
 0.0f,  1.0f,
 1.0f,  1.0f,
 1.0f,  0.0f
 };
 
 GLfloat offScreenTexCoords[] = {
 0.0f,  1.0f,
 0.0f,  0.0f,
 1.0f,  0.0f,
 1.0f,  1.0f
 };
 
 GLushort indices[] = {0, 1, 2, 0, 2, 3 };
 
 glGenVertexArrays(2, mVAO);
 
 
 glBindVertexArray(mVAO[0]);
 glGenBuffers(3, mVBO);
 glBindBuffer(GL_ARRAY_BUFFER, mVBO[0]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(0));
 glEnableVertexAttribArray(0);
 glBindBuffer(GL_ARRAY_BUFFER, mVBO[1]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(offScreenTexCoords), offScreenTexCoords, GL_STATIC_DRAW);
 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(0));
 glEnableVertexAttribArray(2);
 glGenBuffers(1, &mEBO);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mEBO);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
 
 
 glBindVertexArray(mVAO[1]);
 glBindBuffer(GL_ARRAY_BUFFER, mVBO[0]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(0));
 glEnableVertexAttribArray(0);
 glBindBuffer(GL_ARRAY_BUFFER, mVBO[2]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(onScreenTexCoords), onScreenTexCoords, GL_STATIC_DRAW);
 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(0));
 glEnableVertexAttribArray(1);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mEBO);
 glBindVertexArray(GL_NONE);
 
 
 
 glGenTextures(1, &mOffScreenTextureID);
 glBindTexture(GL_TEXTURE_2D, mOffScreenTextureID);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mImage.width, mImage.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, mImage.planes[0]);
 glBindTexture(GL_TEXTURE_2D, GL_NONE);
 
 
 glGenFramebuffers(1, &mFBO);
 glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
 glGenTextures(1, &mOnScreenTextureID);
 glBindTexture(GL_TEXTURE_2D, mOnScreenTextureID);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mImage.width, mImage.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mOnScreenTextureID, 0);
 
 if (glCheckFramebufferStatus(GL_FRAMEBUFFER)!= GL_FRAMEBUFFER_COMPLETE) {
 LOGE("FBOSample::CreateFrameBufferObj glCheckFramebufferStatus status != GL_FRAMEBUFFER_COMPLETE");
 return;
 }
 glBindTexture(GL_TEXTURE_2D, GL_NONE);
 glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);
 
 |