openGL+freetype 动态加载中文

2023-10-19 05:40

本文主要是介绍openGL+freetype 动态加载中文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   能搜索这个相信你已经openGL已经入门了,所以我只上传了加载freetype的类。如果你根据我写的实现不出效果的话,可以私信我,发你项目源码(如果我看到的话)

.h文件

#pragma once#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>#include <iostream>
#include <vector>#include "Shader.h"struct word {unsigned int texture;unsigned int VAO;
};class LoadText
{
public:LoadText(std::string rootPath);void loadText(const wchar_t* text, GLfloat x, GLfloat y);void drawText();~LoadText(){delete this->shader;}
private:std::string rootPath;Shader* shader;std::vector< word> textVecs;void loadShader(); //加载shader的
};

.cpp文件

#include "LoadText.h"#include <fstream>
#include <sstream>#include <ft2build.h>
#include FT_FREETYPE_H#include<wchar.h>LoadText::LoadText(std::string rootPath):rootPath(rootPath)
{this->loadShader();
}// 文本 坐标
void LoadText::loadText(const wchar_t* text, GLfloat x, GLfloat y)
{std::string fontPath = this->rootPath + "\\simkai.ttf";glm::mat4 projection = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f);this->shader->use();this->shader->setMat4("projection", projection);//字体颜色this->shader->set3f("textColor", glm::vec3(0.0f, 1.0f, 0.0f));//初始化FreeType库FT_Library ft;if (FT_Init_FreeType(&ft))std::cout << "FreeType初始化失败" << std::endl;FT_Face face;if (FT_New_Face(ft, fontPath.c_str(), 0, &face))std::cout << "字体加载失败" << std::endl;//定义字体大小FT_Set_Pixel_Sizes(face, 0, 48);glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //禁用字节对齐限制int lew_w = wcslen(text);for (GLubyte i = 0; i < lew_w; i++){// 加载字符的字形 if (FT_Load_Char(face, text[i], FT_LOAD_RENDER)){std::cout << "字形加载失败" << std::endl;continue;}// 字形大小int font_width = face->glyph->bitmap.width;int font_rows = face->glyph->bitmap.rows;// 从基准线到字形左部/顶部的偏移值int font_left = face->glyph->bitmap_left;int font_top  = face->glyph->bitmap_top;// 原点距下一个字形原点的距离int font_x = face->glyph->advance.x;//unsigned char* data = face->glyph->bitmap.buffer;// 生成纹理GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexImage2D(GL_TEXTURE_2D,0,GL_RED,font_width,font_rows,0,GL_RED,GL_UNSIGNED_BYTE,data);// 设置纹理选项glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);GLfloat xpos = x + font_left;GLfloat ypos = y - (font_rows - font_top);GLfloat w = font_width;GLfloat h = font_rows;// 对每个字符更新VBOGLfloat vertices[6][4] = {{ xpos,			     ypos + font_rows,   0.0, 0.0 },{ xpos,				 ypos,				 0.0, 1.0 },{ xpos + font_width, ypos,				 1.0, 1.0 },{ xpos,				 ypos + font_rows,   0.0, 0.0 },{ xpos + font_width, ypos,				 1.0, 1.0 },{ xpos + font_width, ypos + font_rows,   1.0, 0.0 }};unsigned int VAO, VBO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) * 4, &vertices[0][0], GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);word fw1;fw1.texture = texture;fw1.VAO = VAO;this->textVecs.push_back(fw1);x += (font_x >> 6);}glBindVertexArray(0);glBindTexture(GL_TEXTURE_2D, 0);}void LoadText::drawText()
{for (int i = 0; i < this->textVecs.size(); i++){word wf = this->textVecs[i];glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, wf.texture);glBindVertexArray(wf.VAO);glDrawArrays(GL_TRIANGLES, 0, 6);glBindVertexArray(0);glActiveTexture(GL_TEXTURE0);}
}void LoadText::loadShader()
{std::string vertCode, fragCode;std::stringstream vertexSStream, fragmentSStream;const char* vertexSource;const char* fragmentSource;try{std::ifstream vertexFile("v1.vert");std::ifstream fragmentFile("f1.frag");vertexFile.exceptions(std::ifstream::failbit || std::ifstream::badbit);fragmentFile.exceptions(std::ifstream::failbit || std::ifstream::badbit);if (!vertexFile.is_open() || !fragmentFile.is_open()) {throw std::exception("文件打开失败");}vertexSStream << vertexFile.rdbuf();vertCode = vertexSStream.str();vertexFile.close();fragmentSStream << fragmentFile.rdbuf();fragCode = fragmentSStream.str();fragmentFile.close();vertexSource = vertCode.c_str();fragmentSource = fragCode.c_str();this->shader = new Shader;this->shader->setID(vertexSource, fragmentSource);}catch (const std::exception& e){printf(e.what());}}

这是我自学来的,就是想分享一下经验,如果有语法方面的不足,勿怪哈

这篇关于openGL+freetype 动态加载中文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237699

相关文章

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod