1

我正在使用 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::render();

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);

/// 三步渲染纹理

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);
4

0 回答 0