@Gokilla

Freetype c++ windows opengl?

Хочу в свой проект добавлять шрифты,чтобы отрисовывать очки и слова типа winner, не могу найти простой код вот связка такая freetype+ opengl+ windows+c++
Вот мой код для текста Hello:
// ! Устанавлеваем локаль для нормальной работы с кирилицей 
	std::wcin.imbue(std::locale("rus_rus.866")); 
	string font_file_name= "arial.ttf"; // путь к шритфу 
	wstring draw_str=L"Hello";  // юникод текст для отрисовки 
	string render_to_file_name=".Q.txt";// файл для сохранения отрисованной строки 
							   // ! Просим путь к файлу шрифта 
	cout<<"Enter font file path: \n"; 
	//std::getline(std::cin, font_file_name); // ! Инициализация библиотеки Freetype 
	if(FT_Init_FreeType(&ft)) 
	{ 
		cout<<"Could not init freetype library\n"; 
		return 1; 
	} // ! Загрузка шрифта 
	if (FT_New_Face(ft, font_file_name.c_str(), 0, &face))
	{
		// ! Не удалось загрузить 
		cout << "Could not " << font_file_name << "\n";
		return 1;
	}
	//! Просим ввести текст для отрисовки 
	cout<<"Enter text to render: \n"; 
	//std::getline(std::wcin, draw_str); 
	// ! Просим ввести путь к файлу для сохранения 
	cout<<"Enter file to save render result: \n"; 
	//std::getline(std::cin, render_to_file_name); 
	// ! Открываем файл для записи (или создаем, если его нет) 
	file.open(render_to_file_name.c_str(), std::ios_base::out); 
	if (!file)
	{
		// ! Не удалось открыть файл 
		cout << "Could open file: " <<render_to_file_name<<"\n";
		return 1;
	}
	// ! Установка размера пикселя (специфическое понятие в Freetype) 
	// и обязательное для FT_Load_Glyph 
	FT_Set_Pixel_Sizes(face, 0, 36); // ! Указатель на глиф 
	FT_GlyphSlot g = face->glyph;
	// ! Цикл отрисовки образов символов из строки в файл 
	
	for (unsigned int i = 0; i < draw_str.size(); ++i)
		{
			// ! Пытаемся загрузить образ одного символа 
			// эта функция(FT_Load_Char) вызывает FT_Load_Glyph и FT_Get_Char_Index 
			if (FT_Load_Char(face, draw_str.at(i), FT_LOAD_RENDER))
			{
				// ! Не удалось загрузить битовый образ символа 
				cout << "glyph not load!! \n";
				continue;
			}
			// ! Отрисовываем образ в файл 
			for (int y = 0; y < g->bitmap.rows; ++y)
			{
				for (int i = 0; i < g->bitmap.width; ++i)
				{
					// ! Вытяваем значение байта образа 
					unsigned char c = g->bitmap.buffer[y * g->bitmap.width + i];
					if (c == 0)
						file << ' '; // Если ноль, записываем пробел 
					else
						if (c < 128)
							file << '+';
					// Если "прозрачность" ниже 128 
						else file << '#'; // Если "прозрачность" выше 128 
				}
				file << '\n';
			}
			file << "\n\n";
		} // ! Заставлем сбросить внутренний буфер Ofstream в файл 
		file.flush(); // ! Закрываем файл 
		file.close(); // ! Освобождаем выделенные ресурсы и библиотеку 
		IndexTexture[CountIndexTexture] = 0;
		glGenTextures(1, &IndexTexture[CountIndexTexture]);


		glBindTexture(GL_TEXTURE_2D, IndexTexture[CountIndexTexture]);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		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);
		//
		gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, g->bitmap.width, g->bitmap.rows, GL_RGBA, GL_UNSIGNED_BYTE, g->bitmap.buffer);
		CountIndexTexture++;
		FT_Done_Face(face);
		FT_Done_FreeType(ft);

Но он отрисовывает ересь
5aae9b4f5bd2b395137343.jpeg
в центре космос
  • Вопрос задан
  • 239 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы