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