在这里看到这篇文章关于使用SDL_ttf在游戏中渲染文本.但是,这种方法需要每个帧调用SDL_CreateTextureFromSurface()以及SDL_FreeSurface()和SDL_DestroyTexture().
创建纹理(并且可能随后必须将它们发送到GPU)每一帧都会对我的性能产生重大影响吗?
使用SDL_ttf只是用我的整个渲染字符集创建一个纹理然后自己从那里开始逐个字符?
编辑:我希望只用美国英语(基本ASCII)渲染简单的等宽字体.
我正在使用OpenGL和SDL在我的程序中创建一个窗口.
如何在OpenGL窗口中使用SDL_ttf?
例如,我想加载一个字体并渲染一些文字.我想使用SDL OpenGL表面绘制文本.
我想创建一个单独的函数,我可以在其中发送一个字符串,它会适当地呈现文本,这样我就不需要复制粘贴相同的内容。我想出的功能如下。
void renderText(SDL_Renderer* renderer, char* text,
char* font_name, int font_size,
SDL_Color color, SDL_Rect text_area)
{
/* If TTF was not initialized initialize it */
if (!TTF_WasInit()) {
if (TTF_Init() < 0) {
printf("Error initializing TTF: %s\n", SDL_GetError());
return EXIT_FAILURE;
}
}
TTF_Font* font = TTF_OpenFont(font_name, font_size);
if (font == NULL) {
printf("Error opening font: %s\n", SDL_GetError());
return;
}
SDL_Surface* surface = TTF_RenderText_Blended(font, text, color);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
printf("error creating texture: %s\n", SDL_GetError());
TTF_CloseFont(font);
return;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SDL2 TTF 和 OpenGL 显示文本。一个奇怪的纹理出现在窗口中,它有正确的大小和正确的位置,但你看不到任何字母。
我试过使用 SDL_CreateRGBSurface() 认为它可能是一种更清洁的恢复像素的方法,但它也不起作用。我的表面从不为 NULL,并且总是通过验证测试。
我在 while() 循环之前使用 get_front() 函数,并在使用 glClear(GL_COLOR_BUFFER_BIT) 之后使用其中的 displayMoney() 函数。
SDL、TTF 和 OpenGL 已正确初始化,我已经创建了一个 OpenGL 上下文。这是有问题的代码:
SDL_Surface* get_font()
{
TTF_Font *font;
font = TTF_OpenFont("lib/ariali.ttf", 35);
if (!font) cout << "problem loading font" << endl;
SDL_Color white = {150,200,200};
SDL_Color black = {0,100,0};
SDL_Surface* text = TTF_RenderText_Shaded(font, "MO", white, black);
if (!text) cout << "text not loaded" << endl;
return text;
}
void displayMoney(SDL_Surface* surface)
{
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA …Run Code Online (Sandbox Code Playgroud) 我刚开始使用SDL2_ttf.我已经弄明白了如何在屏幕上显示一些文字TTF_RenderText_Blended,但我怎样才能让它进行换行和自动换行?
\n; 它只是创造了一个空间,而不是沿着一条线.有没有办法为此添加支持?具体来说,使用文本的正确行高,而不是在不同的Y坐标处多次调用RenderText.我不完全确定这是最好的地方,但我想不出更好的地方
我已经"制作"了一种低分辨率的字体.(奖励积分,如果你知道它实际来自哪里)
字体在gedit中工作正常: 
但是,当尝试使用SDL_ttf渲染字体时,除了一些多字节unicode字符(特别是' æ '和' ℃ ')之外,它主要起作用,而其他非ASCII字符工作正常.但是(!),所有这些字符都适用于其他字体(我一直在使用DejaVu Sans)

其他字体工作正常的事实表明代码不应该受到责备,但以防万一:
SDL_Surface *surf = TTF_RenderUTF8_Solid(this->font, (const char *)text, col);
if (surf == nullptr) {
fprintf(stderr, "Rendering text failed (%s)\n", TTF_GetError());
return;
}
if (surf->format->BitsPerPixel != 8 || surf->format->BytesPerPixel != 1) {
fprintf(stderr, "Rendering text failed (Wrong surface format)\n");
return;
}
Run Code Online (Sandbox Code Playgroud)
(text is const uint8*)显然没有触发这些错误
我注意到这两个角色特别比其他角色更广泛,这可能是罪魁祸首吗?
根据下面的评论,字体似乎与SDL_TTF"latin-1"演示一起正常工作:

我正在程序中从SFML切换到SDL2,我开始使用SDL2_ttf以UTF-8格式呈现文本.我使用函数TTF_RenderUTF8_Solid.我注意到一些字符不再正确呈现.一个例子是''(U + 1F70D).我确认该字体包含这些字符.
我尝试使用SDL2_ttf中包含的glfont示例程序,它也不会渲染这些字符.
我转到了SDL2_ttf源代码,并查看了SDL_ttf.c中的函数TTF_RenderUTF8_Solid,并注意到这一行:
Uint16 c = UTF8_getch(&text, &textlen);
Run Code Online (Sandbox Code Playgroud)
,而UTF8_getch返回Uint32.因此,丢弃较高的两个字节(并且不会在代码中的任何其他位置读取它们),这解释了为什么''没有呈现(它不适合Uint16).我将'c'的类型更改为Uint32,并正确分配了0x1F70D.它仍然没有呈现.很可能其他地方不考虑长度超过两个字节的字符.
我的问题是,这只是我对SDL2_ttf的误解还是已知的问题,如果有的话,是否有任何已知的修复方法.
以下是事实:我在Ubuntu上使用代码块.我已经安装了SDL和SDL_ttf并已成功包含和链接它们.我想将文本渲染到字体的屏幕FreeSerif.
这是问题:当程序到达行TTF_OpenFont("FreeSerif.ttf,20")时,它返回NULL,如果传递给TTF_RenderText_Solid函数,则会导致段错误.我已将字体文件添加到项目中,但仍然无效.
这是代码:
TTF_Init();
TTF_Font *font = TTF_OpenFont("FreeSerif.ttf",20); //This returns NULL
if(!font){printf("Unable to open font");exit(1);} //The program exits here
Run Code Online (Sandbox Code Playgroud) 前几天我问了一个关于使用SDL渲染TTF字体的问题,并指向SDL_TTFL我尝试过使用SDL_TTF库,但是我得到的只是屏幕上的垃圾

我已经包含了我的着色器,这对于这个程序非常简单,还有我用来将文本加载到表面并将其绑定到纹理的剪切.我根本不想在这里做任何疯狂的事情.你能看到我做错了什么吗?我真的不太确定如何调试着色器等.
#version 330
in vec2 texCoord;
in vec4 fragColor;
out vec3 finalColor;
uniform sampler2D myTextureSampler;
void main() {
finalColor = texture( myTextureSampler, texCoord ).rgb;
}
Run Code Online (Sandbox Code Playgroud)
#version 330
in vec3 vert;
in vec4 color;
in vec2 texcoord;
out vec4 fragColor;
out vec2 texCoord;
void main() {
fragColor = color;
gl_Position = vec4(vert, 1);
texCoord = texcoord;
}
Run Code Online (Sandbox Code Playgroud)
//Initialise TTF
if( TTF_Init() == -1 )
throw std::runtime_error("SDL_TTF failed to initialise.");
//Load the texture
font = TTF_OpenFont( filePath.c_str(), 12 …Run Code Online (Sandbox Code Playgroud) 我最近一直在使用 SDL2 编写一个小型文本冒险游戏,并遇到了换行问题。我正在使用 TTF_RenderText_Blend_Wrapped() 来渲染我的字符串,这给了我一些漂亮的包裹线。但行高是一个问题,行看起来被压在一起,像“jqg”这样的字母与“tli”这样的字母重叠。
有谁知道是否有办法改变行高?TTF_RenderText_Blished_Wrapped() 甚至仍然没有出现在 SDL_ttf 的文档中。我应该编写自己的文本换行功能吗?
字体大小为 16pt,样式为 TTF_STYLE_BOLD,字体可以在这里找到。下面的代码应该会重现该错误,但几乎没有错误检查,请自行承担使用风险。这是代码的输出:
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
int main(int argc, char *argv[]) {
SDL_Window *gui;
SDL_Surface *screen, *text;
SDL_Event ev;
TTF_Font *font;
int running = 1;
const char *SAMPLETEXT = "This is an example of my problem, for most lines it works fine, albeit it looks a bit tight. But for any letters that \"hang\" below the line, there is a chance of overlapping with the letters …Run Code Online (Sandbox Code Playgroud)