首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL,FreeType2:斜体字符相互叠加

OpenGL,FreeType2:斜体字符相互叠加
EN

Stack Overflow用户
提问于 2018-02-07 12:45:04
回答 1查看 225关注 0票数 1

我正在尝试使用FreeType (v2)库在“我的OpenGL (v4.1)”场景中使用C++进行2D绘图。呈现文本,但不正确:一个字形隐藏另一个。如何防止这种行为?我的绘图代码如下:

代码语言:javascript
运行
复制
void CFreeTypeFont::Print(string sText, int x, int y, int iPXSize) {
    glBindVertexArray(uiVAO);
    glUniform1i(shp->uniform("gSampler"), 0);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    int iCurX = x, iCurY = y;
    if(iPXSize == -1)iPXSize = iLoadedPixelSize;
    float fScale = float(iPXSize)/float(iLoadedPixelSize);
    FOR(i, ESZ(sText)) {
        if(sText[i] == '\n') {
            iCurX = x;
            iCurY -= iNewLine*iPXSize/iLoadedPixelSize;
            continue;
        }
        int iIndex = int(sText[i]);
        iCurX += iBearingX[iIndex]*iPXSize/iLoadedPixelSize;
        if(sText[i] != ' ') {
            tCharTextures[iIndex].BindTexture(0);
            glm::mat4 mModelView = glm::translate(glm::mat4(1.0f), glm::vec3(float(iCurX), float(iCurY), 0.0f));
            mModelView = glm::scale(mModelView, glm::vec3(fScale));

            glUniformMatrix4fv(shp->uniform("matrices.modelViewMatrix"),
                               1, GL_FALSE, glm::value_ptr(mModelView));

            // Draw character
            glDrawArrays(GL_TRIANGLE_STRIP, iIndex*4, 4);
        }

        iCurX += (iAdvX[iIndex]-iBearingX[iIndex])*iPXSize/iLoadedPixelSize;
    }
    glDisable(GL_BLEND);
}

输出如下:

一定是“你好,世界!”

如果我禁用了blend mode,那么图片将清楚地显示字符覆盖:

相同的文本,没有不透明度

我的顶点着色器:

代码语言:javascript
运行
复制
#version 410

uniform struct Matrices {
    mat4 modelViewMatrix;
} matrices;

uniform float screenWidth;
uniform float screenHeight;

layout (location = 0) in vec2 inPosition;
layout (location = 1) in vec2 inCoord;

out vec2 texCoord;

void main() {
    texCoord = inCoord;
    vec4 pre = matrices.modelViewMatrix*vec4(inPosition, 0.0, 1.0);
    pre.x = pre.x / screenWidth - 1;
    pre.y = pre.y / screenHeight - 1;
    gl_Position = pre;
}

片段着色器:

代码语言:javascript
运行
复制
#version 410

in vec2 texCoord;
out vec4 outputColor;

uniform sampler2D gSampler;
uniform vec4 vColor;

void main() {
    vec4 vTexColor = texture(gSampler, texCoord);
    outputColor = vTexColor*vColor;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 14:11:13

在呈现字体时,结果似乎还没有禁用深度测试。深度测试可以防止其他象形文字被绘制在与以前相同的位置。

禁用深度测试调用

代码语言:javascript
运行
复制
glDisable(GL_DEPTH_TEST);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48664176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档