Вывод текста glfw
Можно ли как то вывести текст с помочью методов openGL? Вариант с TextOut мне бы подошёл но он не может перемещаться вместе с координатами объекта есть какие ни будь другие варианты? (без дополнительных библиотек)
#include <GLFW/glfw3.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
void Button(string text,double size, float posX, float posY);
GLuint LoadTexture(const char* filename);
GLuint textureid;
int main()
{
GLFWwindow* window;
std::cout << "Started";
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(500, 500, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
LoadTexture("test.bmp");
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
Button("Test",0, 0.2, 0.2);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
GLuint LoadTexture(const char* filename)
{
GLuint texture;
int width, height;
unsigned char* data;
FILE* file;
#pragma warning(disable : 4996)
file = fopen(filename, "rb");
if (file == NULL) return 0;
width = 1024;
height = 512;
data = (unsigned char*)malloc(width * height * 3);
//int size = fseek(file,);
fread(data, width * height * 3, 1, file);
fclose(file);
for (int i = 0; i < width * height; ++i)
{
int index = i * 3;
unsigned char B, R;
B = data[index];
R = data[index + 2];
data[index] = R;
data[index + 2] = B;
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
free(data);
textureid = texture;
}
void Button(string text,double size, float posX, float posY) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureid);
glPushMatrix();
glTranslatef(-1 + posX, -1 + posY, -1);
glScalef(0.2, 0.2, 0);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(0, 0);
glVertex2f(1 + size, 0);
glVertex2f(1 + size, 0.5 + size);
glVertex2f(0, 0.5 + size);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, 0);
}
Ответы (2 шт):
В целом, отрисовка текста - это просто создания большой картинки с набора маленьких массивов для каждой буквы. Потом это превращается в текстуру и отрисовывается два треугольника, которые составляет прямоугольник. Все просто. Есть готовый пример - http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-11-2d-text/
Если шрифт не подходит, всегда можно поискать в интернете картинки или нарисовать свою.
Но если ручками не хочется, но "лишних библиотек" также, то можно взять библиотеку stb, а там нужно взять один нужный хедер. Там же на гитхабе есть минимальный пример - https://github.com/justinmeiners/stb-truetype-example/blob/master/main.c
по такой ссылке можно найти много вопросов и примеров на SO.
Если все таки захочется библиотечно - вот пример
Код взял с форума , полностью рабочий.
Обычный текст(2d):
GLuint nFontList;
// Создание
nFontList = glGenLists(256);
wglUseFontBitmaps(hDC, 0, 256, nFontList); //(hDC - Devece Context с выбранным шрифтом)
// Использование
glRasterPos2i(0, 200);
glListBase(nFontList);
glCallLists (13, GL_UNSIGNED_BYTE, "Hello, world!");
3d текст:
GLuint nFontList;
GLYPHMETRICSFLOAT agmf[256];
// Создание
nFontList = glGenLists(256);
wglUseFontOutlines(hDC, 0, 256, nFontList, 0.0f, 0.5f, WGL_FONT_POLYGONS, agmf);
// Использование
glPushMatrix();
glListBase(nFontList);
glCallLists (6, GL_UNSIGNED_BYTE, "OpenGL");
glPopMatrix();