OpenGL, FreeType2: символы перекрывают друг друга

212
09 февраля 2018, 21:19

Пытаюсь использовать библиотеку FreeType (v2) для 2Д отрисовки в OpenGL (v4.1) сцене на языке C++. Текст отображается, но не правильно, символы друг друга коряво перекрывают. Как это починить? Мой код отрисовки:

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

Вывод такой:

Должно быть "Hellow, World!"

Если отключить blend mode, то хорошо видны границы символов:

Тот же текст без прозрачности

Код вершинного шейдера:

#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;
}

Фрагментный шейдер:

#version 410
in vec2 texCoord;
out vec4 outputColor;
uniform sampler2D gSampler;
uniform vec4 vColor;
void main() {
    vec4 vTexColor = texture(gSampler, texCoord);
    outputColor = vTexColor*vColor;
}
Answer 1

В английской версии мне подсказали, что этот артефакт возникает при включенной проверке глубины. Действительно, если добавить glDisable(GL_DEPTH_TEST); то отрисовка текста происходит корректно.

READ ALSO
Как открыть С++ DLL из Python3

Как открыть С++ DLL из Python3

Написал на с++ dllКак вызвать ее из python 3 с помощью ctypes?

248
Memo в Embarcadero C++ Builder 10.2 [требует правки]

Memo в Embarcadero C++ Builder 10.2 [требует правки]

Как создать это Memo в Embarcadero C + + Builder 102 (Проблема наверху rectangular FMX!)

232
Где найти cuda_data и cudpp_config.h? [требует правки]

Где найти cuda_data и cudpp_config.h? [требует правки]

Нужен в программе заголовочный файлcuda_data и cudpp_config

223
Решить задачу на с++ [требует правки]

Решить задачу на с++ [требует правки]

Фирме принадлежат два магазинаИзвестна стоимость товаров, проданных в каждом магазине за каждый день в июле и августе, которая хранится...

175