Opengl 使用位图字符串调整字体大小

Opengl 使用位图字符串调整字体大小,opengl,Opengl,我目前正在使用Glut的函数glutBitmapString在我的窗口上覆盖文本。我知道我可以使用不同的位图字体指定字体/大小。但是,最大的文本可能是GLUT_位图_TIMES_ROMAN_24,是否可以用更大的字体打印2D文本?或者是否有任何方法可以调整BitMapString显示的字体大小?将文本渲染为纹理,然后使用所需的缩放因子渲染具有该纹理的四边形 大概是这样的: #include <GL/glew.h> #include <GL/freeglut.h> #inc

我目前正在使用Glut的函数glutBitmapString在我的窗口上覆盖文本。我知道我可以使用不同的位图字体指定字体/大小。但是,最大的文本可能是GLUT_位图_TIMES_ROMAN_24,是否可以用更大的字体打印2D文本?或者是否有任何方法可以调整BitMapString显示的字体大小?

将文本渲染为纹理,然后使用所需的缩放因子渲染具有该纹理的四边形

大概是这样的:

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <cmath>

GLuint tex = 0, fbo = 0, rbo = 0;
GLuint fbo_w = 0, fbo_h = 0;
bool SetFboSize(int width, int height)
{
    int max_size;
    glGetIntegerv( GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size );
    if( width > max_size || height > max_size ) return false;

    fbo_w = width;
    fbo_h = height;

    // create FBO
    if(fbo) glDeleteFramebuffersEXT( 1, &fbo );
    glGenFramebuffersEXT( 1, &fbo );
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo );    

    // create and attach a new texture as the FBO's color buffer
    if(tex) glDeleteTextures( 1, &tex );
    glGenTextures( 1, &tex );
    glBindTexture( GL_TEXTURE_2D, tex );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
    glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0 );

    // create and attach a new depth buffer to currently bound FBO
    if(rbo) glDeleteRenderbuffersEXT( 1, &rbo );
    glGenRenderbuffersEXT( 1, &rbo );
    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, rbo );
    glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height );
    glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbo );

    if( GL_FRAMEBUFFER_COMPLETE_EXT != glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) )
    {
        return false;
    }
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // unbind fbo
    return true;
}

void display()
{
    // render to texture
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo );
    glBindTexture( GL_TEXTURE_2D, 0 );
    {
        glViewport( 0, 0, fbo_w, fbo_h );
        glClearColor( 0, 0, 0, 0 );
        glClear( GL_COLOR_BUFFER_BIT );

        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();

        glColor3ub( 255, 0, 0 );
        glWindowPos2i( 0, 0 );
        glutBitmapString( GLUT_BITMAP_TIMES_ROMAN_24, (unsigned char*)"Hello, world!" );
    }

    // render to screen
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
    {
        int w = glutGet( GLUT_WINDOW_WIDTH );
        int h = glutGet( GLUT_WINDOW_HEIGHT );
        glViewport( 0, 0, w, h );
        glClearColor( 0, 0, 0, 0 );
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        double ar = w / (double)h;
        glOrtho( -2 * ar, 2 * ar, -2, 2, -1, 1);

        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();

        glColor3ub( 255, 255, 255 );
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, tex );
        float scale = sin( (double)glutGet( GLUT_ELAPSED_TIME ) / 1000.0f );
        glScalef( scale, scale, 1 );
        glBegin( GL_QUADS );
        glTexCoord2i( 0, 0 );
        glVertex2i( -1, -1 );
        glTexCoord2i( 1, 0 );
        glVertex2i(  1, -1 );
        glTexCoord2i( 1, 1 );
        glVertex2i(  1,  1 );
        glTexCoord2i( 0, 1 );
        glVertex2i( -1,  1 );
        glEnd();
    }

    glutSwapBuffers();
}

void timer( int extra )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glewInit();

    if( !GLEW_VERSION_1_4 )
        return -1;
    if( !GLEW_EXT_framebuffer_object )
        return -1;
    if( !SetFboSize( 200, 50 ) )
        return -1;

    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
#包括
#包括
#包括
GLuint-tex=0,fbo=0,rbo=0;
GLuint fbo_w=0,fbo_h=0;
布尔设置边界(整数宽度、整数高度)
{
int max_大小;
glGetIntegerv(总图最大渲染缓冲大小外部和最大大小);
如果(宽度>最大尺寸| |高度>最大尺寸)返回false;
fbo_w=宽度;
fbo_h=高度;
//创建FBO
如果(fbo)glDeleteFramebuffersEXT(1,&fbo);
glGenFramebuffersEXT(1和fbo);
glBindFramebufferEXT(GLU帧缓冲区EXT,fbo);
//创建并附加新纹理作为FBO的颜色缓冲区
if(tex)gldelete纹理(1,&tex);
glGenTextures(1和tex);
glBindTexture(GL_TEXTURE_2D,tex);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA8,宽度,高度,0,GL_RGBA,GL_无符号_字节,NULL);
glFramebufferTexture2DEXT(GL_帧缓冲区_扩展,GL_颜色_附件0_扩展,GL_纹理_2D,tex,0);
//创建新深度缓冲区并将其附加到当前绑定的FBO
if(rbo)glDeleteRenderbuffersEXT(1,&rbo);
glGenRenderbuffersEXT(1,&rbo);
glbinderbufferext(GL_RENDERBUFFER_EXT,rbo);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT、GL_DEPTH_组件、宽度、高度);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,rbo);
如果(GL\u帧缓冲区\u完成\u扩展!=glCheckFramebufferStatusEXT(GL\u帧缓冲区\u扩展))
{
返回false;
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);//解除绑定fbo
返回true;
}
无效显示()
{
//渲染到纹理
glBindFramebufferEXT(GLU帧缓冲区EXT,fbo);
glBindTexture(GL_TEXTURE_2D,0);
{
glViewport(0,0,fbo_w,fbo_h);
glClearColor(0,0,0,0);
glClear(GLU颜色缓冲位);
glMatrixMode(GL_投影);
glLoadIdentity();
glMatrixMode(GLU模型视图);
glLoadIdentity();
glColor3ub(255,0,0);
glpOS2i(0,0);
glutBitmapString(GLUT_位图_TIMES_ROMAN_24,(无符号字符*)“你好,世界!”);
}
//渲染到屏幕
glBindFramebufferEXT(GL\u FRAMEBUFFER\u EXT,0);
{
int w=glutGet(GLUT\u窗口\u宽度);
int h=glutGet(GLUT\U窗口\U高度);
glViewport(0,0,w,h);
glClearColor(0,0,0,0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双ar=w/(双)h;
格洛托(-2*ar,2*ar,-2,2,1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glColor3ub(255、255、255);
glEnable(GL_纹理_2D);
glBindTexture(GL_TEXTURE_2D,tex);
浮动刻度=sin((双)glutGet(GLUT_运行时间)/1000.0f);
glScalef(标度,标度,1);
glBegin(GL_QUADS);
glTexCoord2i(0,0);
glVertex2i(-1,-1);
glTexCoord2i(1,0);
glVertex2i(1,-1);
glTexCoord2i(1,1);
glVertex2i(1,1);
glTexCoord2i(0,1);
glVertex2i(-1,1);
格伦德();
}
glutSwapBuffers();
}
无效计时器(整数额外)
{
再发现();
glutTimerFunc(16,定时器,0);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
GLUTINITWindowsSize(640480);
GLUT(GLUT);
glewInit();
如果(!GLEW_版本_1_4)
返回-1;
如果(!GLEW_EXT_framebuffer_object)
返回-1;
如果(!SetFboSize(200,50))
返回-1;
glutDisplayFunc(显示器);
glutTimerFunc(0,定时器,0);
glutMainLoop();
返回0;
}

您能提供详细信息吗?