渲染TTF SDL2.0 opengl 3.1

渲染TTF SDL2.0 opengl 3.1,opengl,fonts,sdl,sdl-2,opengl-3,Opengl,Fonts,Sdl,Sdl 2,Opengl 3,我正在使用SDL2.0,并使用(半现代的)opengl(3.1)。我希望在我的应用程序中添加一个文本覆盖,并在应用程序中呈现TTF。我将如何使用现代OpenGL实现这一点 编辑: 根据genpfault的建议,我尝试使用SDL_TTF库,但我得到的只是屏幕上的垃圾 我已经附上了我的着色器的要点,对于这个程序来说非常简单,还有我用来将文本加载到surface并将其绑定到纹理的剪切。我根本不想在这里做任何疯狂的事。你能看到我做错了什么吗?我不太确定如何调试着色器等 使用由TTF_Render*()调

我正在使用SDL2.0,并使用(半现代的)opengl(3.1)。我希望在我的应用程序中添加一个文本覆盖,并在应用程序中呈现TTF。我将如何使用现代OpenGL实现这一点

编辑: 根据genpfault的建议,我尝试使用SDL_TTF库,但我得到的只是屏幕上的垃圾 我已经附上了我的着色器的要点,对于这个程序来说非常简单,还有我用来将文本加载到surface并将其绑定到纹理的剪切。我根本不想在这里做任何疯狂的事。你能看到我做错了什么吗?我不太确定如何调试着色器等


使用由
TTF_Render*()
调用返回的来填充纹理。

我花了太多时间在黑屏上,才发现文本数据实际上在alpha通道中

GLuint shader_program_text;

void drawText()
{
    //Render the message to an SDL_Surface, as that's what TTF_RenderText_X returns
    text_font = TTF_OpenFont("bpl_binary/waltographUI.ttf", 50);
    SDL_Color color = {255, 0, 0, 0};
    SDL_Surface* sdl_surface = TTF_RenderText_Blended(text_font, "hello world", color);
    GLuint texture_id;
    glGenTextures(1, &texture_id);
    glBindTexture(GL_TEXTURE_2D, texture_id);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sdl_surface->w, sdl_surface->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, sdl_surface->pixels);
    glBindTexture(GL_TEXTURE_2D, 0);
    SDL_FreeSurface(sdl_surface);
    TTF_CloseFont(text_font);

    //glDrawPixels(sdl_surface->w, sdl_surface->h, GL_RGBA, GL_UNSIGNED_BYTE, sdl_surface->pixels);
    //FILE* file = fopen("output.txt", "w+");

    //for(int h=0; h<sdl_surface->h; h++)
    //{
    //  
    //  for(int w=0; w<sdl_surface->w; w++)
    //  {
    //      unsigned int xxx = ((unsigned int*)sdl_surface->pixels)[h*sdl_surface->w + w];
    //      /*if(xxx != 0)
    //          fprintf(file, "x", xxx);
    //      else
    //          fprintf(file, " ", xxx);*/
    //      fprintf(file, "%08x ", xxx);
    //  }
    //  fprintf(file, "\n");
    //}

    //fclose(file);

    //MULTIPLY WITH ALPHA TO ACTUALLY SEE SOMETHING

    glUseProgram(shader_program_text);
    glEnable(GL_TEXTURE_2D);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture_id);

    glBegin(GL_TRIANGLE_STRIP);
    //texcoord; position;
    glVertexAttrib2f(1, 0, 1); glVertexAttrib2f(0, -1, -1); //top left
    glVertexAttrib2f(1, 1, 1); glVertexAttrib2f(0, +1, -1); //top right
    glVertexAttrib2f(1, 0, 0); glVertexAttrib2f(0, -1, +1); //bottom left
    glVertexAttrib2f(1, 1, 0); glVertexAttrib2f(0, +1, +1); //bottom right
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glUseProgram(0);
} 
GLuint着色器\程序\文本;
void drawText()
{
//将消息渲染到SDL_曲面,因为这是TTF_RenderText_X返回的结果
text\u font=TTF\u OpenFont(“bpl\u二进制/waltographUI.TTF”,50);
SDL_颜色={255,0,0,0};
SDL_Surface*SDL_Surface=TTF_RenderText_混合(文本字体,“hello world”,颜色);
胶合纹理;
glGenTextures(1和纹理标识);
glBindTexture(GL_纹理_2D,纹理_id);
glTexParameterf(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameterf(GL_TEXTURE_2D、GL_TEXTURE_MAG_FILTER、GL_LINEAR);
glTexParameterf(GL_纹理2D、GL_纹理包裹、GL_夹紧到边);
glTexParameterf(GL_纹理2D、GL_纹理包裹、GL_夹紧到边);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,sdl_曲面->w,sdl_曲面->h,0,GL_BGRA,GL_无符号_字节,sdl_曲面->像素);
glBindTexture(GL_TEXTURE_2D,0);
SDL_自由曲面(SDL_曲面);
TTF_关闭字体(文本字体);
//glDrawPixels(sdl_曲面->w,sdl_曲面->h,GL_RGBA,GL_无符号字节,sdl_曲面->像素);
//FILE*FILE=fopen(“output.txt”、“w+”);
//for(inth=0;hh;h++)
//{
//  
//for(int w=0;ww;w++)
//  {
//无符号整数xxx=((无符号整数*)sdl_曲面->像素)[h*sdl_曲面->w+w];
///*如果(xxx!=0)
//fprintf(文件“x”,xxx);
//否则
//fprintf(文件“”,xxx)*/
//fprintf(文件“%08x”,xxx);
//  }
//fprintf(文件“\n”);
//}
//fclose(文件);
//与ALPHA相乘以实际看到某物
glUseProgram(着色器程序文本);
glEnable(GL_纹理_2D);
玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_2D,纹理_id);
glBegin(GLU三角带);
//特克斯库尔德;位置;
glVertexAttrib2f(1,0,1);glVertexAttrib2f(0,-1,-1);//左上角
glVertexAttrib2f(1,1,1);glVertexAttrib2f(0,+1,-1);//右上角
glVertexAttrib2f(1,0,0);glVertexAttrib2f(0,-1,+1);//左下角
glVertexAttrib2f(1,1,0);glVertexAttrib2f(0,1,1);//右下角
格伦德();
glDisable(GL_纹理_2D);
glUseProgram(0);
} 

我猜这是在使用SDL\U TTF库?感谢您的回复,我已经尝试过了,但运气不太好。OpenGL 3+hmm中不允许使用glBegin和glEnd,所以我想您当时只使用VBO?VAO+VBO是的:这意味着需要大量代码来执行与简单glDrawPixels相同的操作(创建纹理、创建VBO和创建着色器)只是把一些像素复制到屏幕上。我正在寻找更简单的方法,但直到现在我还没有发现任何东西。@AdrianMail:既然我们必须使用着色器,那么这可能是几何体着色器的一个很好的用例?类似于提供字体纹理和包含要渲染字符串的1D-1字节/索引(=GL_RED8 afaik)纹理,然后渲染一个定义文本边界框的四边形(=4顶点三角形条带)。或者这会带来太多的开销?规划我自己的openGL 4.3 GUI系统,我不希望我的游戏被UI拖慢:D@nonchip:每个字符都有自己的大小、位置等,因此仅从字符网格渲染全文并不容易。如果您能够像这样创建高质量的文本,这可能会很好,但就我个人而言,我只是使用文本库(SDL_TTF或等效工具)在纹理(第一次出现文本)上渲染了全文。