簡體   English   中英

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

[英]Displaying text with SDL TTF with SDL2 and OpenGL

我正在嘗試使用SDL2 TTF和OpenGL顯示文本。 一個奇怪的紋理出現在窗口中,它有正確的大小和正確的位置,但你看不到任何字母。

我已經嘗試使用SDL_CreateRGBSurface()認為它可能是一種更清潔的方法來恢復像素,但它也不起作用。 我的表面永遠不會為NULL並且始終通過驗證測試。

我在使用glClear(GL_COLOR_BUFFER_BIT)之后立即在while()循環之前使用get_front()函數,並在其中使用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函數測試了我的代碼,並且它運行得非常好。 因此,問題似乎與SDL部分有關。

編輯 :我最近發現我從我的文本得到的表面有以下屬性:Rmask = Gmask = Bmask = Amask = 0.這顯然是一個問題,但我不知道如何解決它...

https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html#SEC42上的 SDL_ttf文檔中所述,

着色: 創建一個8位的調色表面,並使用給定的字體和顏色以高質量渲染給定的文本。 0像素值是背景,而其他像素具有與背景顏色不同的前景色度。

因此,您生成的曲面將使用8位調色板編制索引,而不是RGBA(也可以通過表面格式中缺少的顏色掩碼表示,如您所述)。 具有alpha通道的RGBA表面由例如TTF_RenderText_Blended產生,或者使用不同的紋理格式,或執行格式轉換。 您需要將表面寬度/高度傳遞給glTexImage2D而不是128/64常量,因為表面大小可能會有所不同。

您還有幾個問題代碼中的資源泄漏:在每個繪圖上創建新紋理並且永遠不會刪除它(如果文本沒有更改,這也是不必要的),並且永遠不會使用TTF_CloseFont關閉字體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM