openGL文本渲染FreeType常见问题

embedded/2024/10/19 0:22:52/

这里写自定义目录标题

  • 源码下载及编译
  • 编译生成的dll及lib
  • 使用FreeType
    • include头文件加载
      • 附加包含目录
    • lib文件加载
      • 添加lib文件位置
      • 添加lib文件下的lib名
    • 字体使用
    • 代码编写
      • 代码初始化
      • 中文字体输出简单封装
  • 存在问题列表
    • 问题1:无法打开stddef.h
    • 其他问题后续更新

源码下载及编译

点击此链接进入下载地址
https://download.savannah.gnu.org/releases/freetype/

下载完毕后在windows下找到freetype.sln进行编译(如下图位置)
在这里插入图片描述

编译生成的dll及lib

(本项目使用vs2017进行编译),编译文件生成地址在objs里
在这里插入图片描述

使用FreeType

include头文件加载

附加包含目录

注意把freetype的头文件复制到根目录,而不是 放到 "include/freeType"文件夹内部(编译会报错)
在这里插入图片描述

lib文件加载

添加lib文件位置

在这里插入图片描述

添加lib文件下的lib名

在这里插入图片描述

字体使用

选择 C:\Windows\Fonts下的字体文件即可(或网上下载)
在这里插入图片描述

代码编写

代码初始化

#include <ft2build.h>
#include FT_FREETYPE_H  FT_Library ft,ft1;
if (FT_Init_FreeType(&ft)) std::cout << "ERROR::FREETYPE: Could not init FreeType Library" << std::endl;
if (FT_Init_FreeType(&ft1)) std::cout << "ERROR::FREETYPE: Could not init FreeType Library" << std::endl;if (FT_New_Face(ft, "Fonts/simsun.ttc", 0, &face)) std::cout << "ERROR::FREETYPE: Failed to load font" << std::endl;
if (FT_New_Face(ft1, "Fonts/simsun.ttc", 0, &face1)) std::cout << "ERROR::FREETYPE: Failed to load font" << std::endl;

中文字体输出简单封装

完整代码 learnOpenGL-CN

void RenderText_CN(Shader &shader, std::wstring text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, GLuint VAO, GLuint VBO, FT_Face face, FT_Library ft)
{shader.use();glUniform3f(glGetUniformLocation(shader.ID, "textColor"), color.x, color.y, color.z);glActiveTexture(GL_TEXTURE0);glBindVertexArray(VAO);for (auto c : text){//if (Characters.find(c) == Characters.end()||1)//{if (FT_Load_Char(face, c, FT_LOAD_RENDER)){std::cerr << "ERROR::FREETYPE: Failed to load Glyph" << std::endl;continue;}GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexImage2D(GL_TEXTURE_2D,0,GL_RED,face->glyph->bitmap.width,face->glyph->bitmap.rows,0,GL_RED,GL_UNSIGNED_BYTE,face->glyph->bitmap.buffer);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);Character character = {texture,glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),face->glyph->advance.x};//Characters[c] = character;//}Character ch = character;// 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 }};glBindTexture(GL_TEXTURE_2D, ch.TextureID);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);glBindBuffer(GL_ARRAY_BUFFER, 0);glDrawArrays(GL_TRIANGLES, 0, 6);x += (ch.Advance >> 6) * scale;glDeleteTextures(1, &texture);//openGL gen的必须delete不然会导致软件内存越来越大}glBindVertexArray(0);glBindTexture(GL_TEXTURE_2D, 0);
}

存在问题列表

问题1:无法打开stddef.h

vs2017(win10版本):
“项目”-“配置属性”-“常规”-"windows SDK版本"选择10.0.17763.0
在这里插入图片描述

其他问题后续更新


http://www.ppmy.cn/embedded/100298.html

相关文章

拦截器实现 Mybatis Plus 打印含参数的 SQL 语句

1.实现拦截器 package com.sample.common.interceptor;import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import or…

React+Vis.js(06):vis.js修改选中节点的样式和边的样式

文章目录 初始化知识图谱选中节点修改节点背景颜色选中节点修改节点文字颜色未选中节点恢复节点背景颜色和文字颜色修改当前选中节点的边的颜色初始化知识图谱 创建network.js组件,来初始化原始知识图谱: import React, {useRef, useEffect} from "react"; impor…

【K8s】Java项目部署时为什么要用k8s?

目录 重要意义一、高可用性与弹性伸缩二、简化部署与管理三、资源隔离与安全四、容器编排与服务发现 部署步骤准备工作创建 Docker 镜像将镜像推送到镜像仓库创建 Kubernetes 资源对象部署到 Kubernetes 集群 常见问题 在 Java 项目部署中使用 Kubernetes&#xff08;k8s&#…

GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 挑战控制工程的新领域

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03647 近年来&#xff0c;GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 等大规模语言模型&#xff08;LLM&#xff09;迅速发展&#xff0c;展示了它们解决复杂问题的能力。LLM 的这些发展在多个领域都有潜在的应用前景。…

Burp Suite、Wireshark与Fiddler:三款网络工具深度解析与比较

在网络安全和网络开发的领域&#xff0c;有三款非常实用的工具&#xff1a;Burp Suite、Wireshark和Fiddler。它们各自具有独特的功能和优势&#xff0c;适用于不同的场景和需求。本文将深度解析这三款工具&#xff0c;并进行详细的比较&#xff0c;帮助读者更好地了解并选择适…

浅谈:搭建一个属于自己的网站+源码+售后过程

搭建一个属于自己的网站&#xff0c;并提供源码开发和售后服务&#xff0c;通常需要经过以下几个关键阶段&#xff1a; 1. 需求收集与分析 目标设定&#xff1a;明确网站的主要目标&#xff0c;如推广品牌、提供服务或销售产品。用户需求分析&#xff1a;理解目标用户的需求和…

【MySQL】 黑马 MySQL进阶 笔记

文章目录 存储引擎MySQL的体系结构存储引擎概念存储引擎特点InnoDBMyISAMMemory 存储引擎选择 索引概述结构B Tree(多路平衡查找树)B TreeHash为什么InnoDB存储引擎选择使用Btree索引结构? 分类思考题 语法SQL性能分析&#xff08;索引相关&#xff09;SQL执行频率慢查询日志p…

pytorch深度学习基础 7(简单的的线性训练,SGD与Adam优化器)

接下来小编来讲一下一些优化器在线性问题中的简单使用使用&#xff0c;torch模块中有一个叫optim的子模块&#xff0c;我们可以在其中找到实现不同优化算法的类 SGD随机梯度下降 基本概念 定义&#xff1a;随机梯度下降&#xff08;SGD&#xff09;是一种梯度下降形式&#…