有没有办法放入缓冲区FBO纹理输出格式GL_ALPHA?

时间:2013-03-14 07:21:50

标签: c++ opengl alphablending fbo ftgl

我正在使用ftgl字体库。

用于创建图像的ftgl函数具有以下代码:

glBindTexture(GL_TEXTURE_2D, textID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, textureWidth, textureHeight,0, GL_ALPHA, GL_UNSIGNED_BYTE, textureMemory);

格式GL_ALPHA。

当我渲染到FBO图像(GL_RGBA)时,它们看起来不错。 但是当我将字体渲染为fbo纹理时,颜色和alpha存在一些问题。

此图像应在编辑器中打开,不要触摸像素(浏览器使用抗锯齿)。


代码:

/// 1步创建FBO

 // Create the color buffer
    glGenTextures(1, &id_tex);
    glBindTexture(GL_TEXTURE_2D, id_tex);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wid, hei, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // GL_RGBA GL_ALPHA

    // Create the frame buffer
    glGenFramebuffersEXT(1, &id_buf);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id_buf);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, id_tex, 0);

    GLenum err = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    assert(err == GL_FRAMEBUFFER_COMPLETE_EXT);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

/// 2步渲染到fbo

glBindTexture(GL_TEXTURE_2D, 0);    
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id_buf);       
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glViewport(0,0, 1920 , 1080); 

ftgl ::渲染();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);                    
glDisable(GL_TEXTURE_2D);
glFlush ();     
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);

glViewport (0, 0, 1920, 1080);
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);

/// 3步渲染纹理

glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR);

glBindTexture(GL_TEXTURE_2D, id_tex);
glBegin(GL_QUADS); 

glTexCoord2d(0,0); glVertex3f(point4.X , point4.Y , point4.Z);
glTexCoord2d(0,1); glVertex3f(point1.X , point1.Y , point1.Z);
glTexCoord2d(1,1); glVertex3f(point2.X , point2.Y , point2.Z);
glTexCoord2d(1,0); glVertex3f(point3.X , point3.Y , point3.Z);

glEnd();
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);

0 个答案:

没有答案
相关问题