void initFBO() {
// 创建FBO和颜色附件
glGenFramebuffers(1, &fbo_in);
glGenFramebuffers(1, &fbo_out);
// 创建纹理1(第一个着色器输出)
glGenTextures(1, &fboTexture);
glBindTexture(GL_TEXTURE_2D, fboTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dstWidth, dstHeight, 0,
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 必须设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(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);
// 创建Y分量纹理(R8格式)
glGenTextures(1, &m_yTexture);
glBindTexture(GL_TEXTURE_2D, m_yTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, dstWidth, dstHeight,
0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 创建UV分量纹理(RG8格式,半分辨率)
glGenTextures(1, &m_uvTexture);
glBindTexture(GL_TEXTURE_2D, m_uvTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, dstWidth, dstHeight,
0, GL_RG, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//=====================================================================
glBindFramebuffer(GL_FRAMEBUFFER, fbo_in);
// 附加纹理到颜色附件0
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, fboTexture, 0);
//===============================================
glBindFramebuffer(GL_FRAMEBUFFER, fbo_out);
// 附加Y纹理到颜色附件0
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, m_yTexture, 0);
// 附加UV纹理到颜色附件1
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL_TEXTURE_2D, m_uvTexture, 0);
// // 附加UV纹理到颜色附件1
// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2,
// GL_TEXTURE_2D, m_yTexture, 0);
GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);
// 检查FBO完整性
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
qWarning("Framebuffer is not complete!");
//return false;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}查看初始化FBO函数中 导致yuv 整体绿色的原因
最新发布