orthoProject freetype opengl - PullRequest
       50

orthoProject freetype opengl

0 голосов
/ 06 июня 2018

Я пытаюсь использовать freetype с OpenGL.Сначала я попытался написать свой материал, и, поскольку он не работал, я просто загружаю код , который хорошо работает с этого урока .Как я уже сказал, это работает хорошо, но проекция отличается от того, что я хочу.В этом уроке мы имеем:

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(WIDTH), 0.0f, static_cast<GLfloat>(HEIGHT));

Я заменяю этим

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(WIDTH), 0.0f, static_cast<GLfloat>(HEIGHT), -1.0f, 1.0f);

, и он все еще работает хорошо.но я хочу, чтобы источник находился слева вверху, а не слева, поэтому я использую это:

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(WIDTH), static_cast<GLfloat>(HEIGHT),0.0f, -1.0f, 1.0f);

, и теперь он больше не работает, у меня нет текста на экране.другой объект правильно отображается, кроме текста.Обратите внимание, что с 2 предыдущими проекциями я получил текст, но присутствовали другие объекты, но с перевернутым (нормальным).

мой вопрос, почему, если я рисую текст в (0,0), ожидая увидеть его всверху слева у меня вообще ничего нет.но с другой проекцией у меня она внизу слева, как и ожидалось?

Я мог бы просто сохранить проекцию и переместить одну, но я действительно хочу понять, почему она не работает.

NB: Iпопытался увидеть результат проекции * Положение.скажем, P1 орто с 0 на и P2 орто с 0 на дне.

для x, y = (92.8000, 99.7000) Я получил:

P1 * (x, y, 0.0, 1.0) = [ 0.2320  0.3323 0.0000 -192.5000]
P2 * (x, y, 0.0, 1.0) = [ 0.2320 -0.3323 0.0000    6.9000]

как и ожидалось y1 = -y2.

в соответствии с запросом @ vu1p3n0x кода для текстового рендера.но это в первая ссылка

void RenderText(Shader &shader, std::string text, GLfloat x, GLfloat y,     GLfloat scale, glm::vec3 color)
{
    shader.Use();
    glUniform3f(glGetUniformLocation(shader.Program, "textColor"),  color.x, color.y, color.z);
    glActiveTexture(GL_TEXTURE0);
    glBindVertexArray(VAO);

    std::string::const_iterator c;
    for (c = text.begin(); c != text.end(); c++) 
    {
        Character ch = Characters[*c];

        GLfloat xpos = x + ch.Bearing.x * scale;
        GLfloat ypos = y - (ch.Size.y - ch.Bearing.y) * scale;

        GLfloat w = ch.Size.x * scale;
        GLfloat h = ch.Size.y * scale;

        GLfloat vertices[6][4] = {
        { xpos,     ypos + h,   0.0, 0.0 },            
        { xpos,     ypos,       0.0, 1.0 },
        { xpos + w, ypos,       1.0, 1.0 },

        { xpos,     ypos + h,   0.0, 0.0 },
        { xpos + w, ypos,       1.0, 1.0 },
        { xpos + w, ypos + h,   1.0, 0.0 }           
        };
        // Render glyph texture over quad
        glBindTexture(GL_TEXTURE_2D, ch.TextureID);
        // Update content of VBO memory
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);     

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        // Render quad
        glDrawArrays(GL_TRIANGLES, 0, 6);
        // Now advance cursors for next glyph (note that advance is  number of 1/64 pixels)
        x += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in    pixels (2^6 = 64 (divide amount of 1/64th pixels by 64 to get amount of pixels))
    }
    glBindVertexArray(0);
    glBindTexture(GL_TEXTURE_2D, 0);
}

1 Ответ

0 голосов
/ 07 июня 2018

Это вопрос Отбор лица :

Вы включили отбор лица, и вершины текстовых примитивов расположены в направлении против часовой стрелки:

 GLfloat vertices[6][4] = {
    { xpos,     ypos + h,   0.0, 0.0 },            
    { xpos,     ypos,       0.0, 1.0 },
    { xpos + w, ypos,       1.0, 1.0 },

    { xpos,     ypos + h,   0.0, 0.0 },
    { xpos + w, ypos,       1.0, 1.0 },
    { xpos + w, ypos + h,   1.0, 0.0 }           
};

Еслиматрица проекции равна

glm::mat4 projection = glm::ortho(
    0.0f, static_cast<GLfloat>(WIDTH),
    0.0f, static_cast<GLfloat>(HEIGHT));

, тогда грани не обрезаются, потому что по умолчанию задние грани обрезаются (см. glCullFace), а порядок намотки против часовой стрелки (см. * 1015)*).

Когда вы делаете

glm::mat4 projection = glm::ortho(
    0.0f, static_cast<GLfloat>(WIDTH),
    static_cast<GLfloat>(HEIGHT), 0.0f);

, тогда ось Y viespace переворачивается, и порядок намотки примитивов поворачивает форму против часовой стрелки, по часовой стрелке, путем преобразования сматрица ортографической проекции в вершинном шейдере.

Измените порядок намотки, определяющий фронтальные многоугольники, на glFrontFace(GL_CW), чтобы решить проблему:

glCullFace( GL_BACK ); // that is default
glFrontFace( GL_CW );  // that is NOT default
glEnable(GL_CULL_FACE);

Конечно, вы также можете изменить порядок намотки вершин (и отразить ось Y координат текстуры):

GLfloat xpos = x + ch.Bearing.x * scale;
GLfloat ypos = y + (ch.Size.y - ch.Bearing.y) * scale;

GLfloat w = ch.Size.x * scale;
GLfloat h = ch.Size.y * scale;

GLfloat vertices[6][4] = {
    { xpos,     ypos - h, 0.0, 0.0 },            
    { xpos,     ypos,     0.0, 1.0 },
    { xpos + w, ypos,     1.0, 1.0 },

    { xpos,     ypos - h,  0.0, 0.0 },
    { xpos + w, ypos,      1.0, 1.0 },
    { xpos + w, ypos - h,  1.0, 0.0 }           
};
...