当前位置: 首页 > 知识库问答 >
问题:

使用SDL2和OpenGL使用SDL TTF显示文本

乐山
2023-03-14

我正在尝试使用 SDL2 TTF 和 OpenGL 显示文本。窗口中出现了一个奇怪的纹理,它有正确的大小和正确的位置,但你看不到任何字母。

我尝试过使用SDL_CreateRGBSurface(),认为这可能是一种更干净的方式来恢复像素,但它也不起作用。我的表面从不为空,并且总是通过验证测试。

我在 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 );
    glEnable(GL_TEXTURE_2D);
    GLuint TextureID = 0;
    glGenTextures(1, &TextureID);
    glBindTexture(GL_TEXTURE_2D, TextureID);
        int Mode = GL_RGB;
        if(surface->format->BytesPerPixel == 4) {
            Mode = GL_RGBA;
        }

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, Mode, 128, 64, 0, Mode, GL_UNSIGNED_BYTE, surface->pixels);

        glPushMatrix();
            glTranslated(100,100,0);
            glScalef(100,100,0);
            glBegin(GL_QUADS);
                glTexCoord2f(0, 1); glVertex2f(-0.5f, -0.5f);  
                glTexCoord2f(1, 1); glVertex2f(0.5f, -0.5f); 
                glTexCoord2f(1, 0); glVertex2f(0.5f, 0.5f); 
                glTexCoord2f(0, 0); glVertex2f(-0.5f, 0.5f);  
            glEnd();
        glPopMatrix();
    glBindTexture(GL_TEXTURE_2D, 0); 
}

#include <SDL2/SDL.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#include <GL/gl.h>
#include <GL/glu.h>
#include <stb_image/stb_image.h>
#include <SDL2_ttf/SDL_ttf.h>
#include "init.h"


int main(int argc, char **argv) {

    SDL_Window* window = init();
    if (window == nullptr) {
        cout << "Error window init" << endl;
    }

    if (TTF_Init() < 0) {
        cout << "Error TTF init" << endl;
    }

    SDL_Surface* text = get_font(); 

    while (loop) {

        glClear(GL_COLOR_BUFFER_BIT);

        displayMoney(text);

...

       SDL_GL_SwapWindow(window);

没有任何错误消息。此外,我使用stbi_load函数使用图像html" target="_blank">测试代码,而不是使用我的曲面,它工作得非常好。因此,问题似乎与SDL部分有关。

编辑:我最近发现我从文本中获得的曲面具有以下属性:R掩码=G掩码=B掩码=Amask=0。这显然是一个问题,但我不知道如何修复它...

共有1个答案

勾海超
2023-03-14

https://www . libsdl . org/projects/SDL_ttf/docs/SDL _ TTF . html # sec 42的SDL _ TTF文档所述,

着色:创建一个8位的调色板化表面,并用给定的字体和颜色高质量地渲染给定的文本。0像素值是背景,而其他像素与背景颜色具有不同程度的前景色。

因此,您生成的曲面是使用 8 位调色板而不是 RGBA(如您所指出的,表面格式中缺少颜色蒙版也表示)。具有 Alpha 通道的 RGBA 表面是通过例如TTF_RenderText_Blended、使用不同的纹理格式或执行格式转换而产生的。您需要将曲面宽度/高度传递给 glTexImage2D 而不是 128/64 常量,因为曲面大小可能会有所不同。

在问题的代码中也有几个资源泄漏:在每次绘制时创建新纹理,并且从不删除它(如果文本没有更改,这也是不必要的),并且从不使用<code>TTF_CloseFont<code>关闭字体。

 类似资料:
  • 我正在尝试加载一个。将obj文件导入我的Android应用程序,并使用OpenGL 2显示它。 您可以在这里找到文件:编辑:我删除了文件,您可以使用任何包含以下值的. obj文件进行测试。 关于stackoverflow有很多类似的问题,但我没有找到一个不需要大型库的简单解决方案。 该文件仅包含以下值类型: g v vt vn f 我尝试了libgdx,它工作正常,但对于我所需要的东西来说有点过头

  • 问题内容: 我正在尝试突出显示与查询匹配的文本,但是我不知道如何使标记显示为HTML而不是文本。 当前输出: Java 脚本 所需的输出: Java 脚本 问题答案: 这是我简单的twoliner辅助方法: 它返回一个跨度,其中所请求的零件以标签突出显示。如果需要,可以简单地将其修改为使用其他标签。 更新: 为避免唯一键丢失警告,这是一个基于跨度并为匹配的零件设置fontWeight样式的解决方案

  • 我最近发现了如何使用LWJGL和OpenGL渲染3D立方体,我非常激动,我渲染了2000个立方体,并有效地冻结了我的计算机。我听说过诸如显示列表和VBO之类的东西,但即使在谷歌搜索之后,我也不知道如何使用它们。 目前,我有 渲染我的立方体。调用只是渲染一个立方体 其中cap是顶部纹理,side是侧面纹理。 我真正需要的帮助是弄清楚如何使我的代码VBO和/或显示列表兼容,以提高性能。我还认为,如果可

  • 如何使用Angular或JavaScript在超文本标记语言页面中显示Microsoft Word文件。请推荐任何提供此功能的库。

  • 问题内容: 有人可以通过可以在网页上突出显示文本的JavaScript函数来帮助我。要求是-仅突出显示一次,而不是像我们在搜索情况下那样突出显示所有出现的文本。 问题答案: 您可以使用jquery 突出显示效果。 但是,如果您对原始javascript代码感兴趣,请看一下我得到的内容。将复制粘贴到HTML中,打开文件,然后单击“突出显示”-这应该突出显示“ fox”一词。在性能方面,我认为这适用于

  • 问题内容: 我正在从数据库中检索Blob图像,并且希望能够使用JavaScript查看该图像。以下代码在页面上产生一个损坏的图像图标: 其中包含所有必需的代码,包括blob。完成的代码应正确显示图像。 问题答案: 问题是我有十六进制数据,需要先进行十六进制数据转换,然后才能进行base64编码。 在PHP中: