Я пытаюсь использовать 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);
}