I have an OpenGL
project which uses GLUT
(not freeglut) wherein I would like to display 2D text on the viewport at a fixed location. The rest of my
As I said, the code you posted works perfectly fine. Here's the code I used to test it:
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "GL/glu.h"
//glm not required
//#include <glm.hpp>
//#include <gtc/matrix_transform.hpp>
#include <string>
int win_width = 500, win_height = 500;
void renderScene(void) {
static float dis=0, ddis=0, elev=0, delev=0, azim=0, dazim=0;
azim += 0.5f;
if (azim >= 360.0f){
azim -= 360.0f;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -(dis + ddis));
glRotated(elev + delev, 1.0, 0.0, 0.0);
glRotated(azim + dazim, 0.0, 1.0, 0.0);
glScalef(2.0f,2.0f,2.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glEnd();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
//I like to use glm because glu is deprecated
//glm::mat4 orth= glm::ortho(0.0f, (float)win_width, 0.0f, (float)win_height);
//glMultMatrixf(&(orth[0][0]));
gluOrtho2D(0.0, win_width, 0.0, win_height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);//needs to be called before RasterPos
glRasterPos2i(10, 10);
std::string s = "Some text";
void * font = GLUT_BITMAP_9_BY_15;
for (std::string::iterator i = s.begin(); i != s.end(); ++i)
{
char c = *i;
//this does nothing, color is fixed for Bitmaps when calling glRasterPos
//glColor3f(1.0, 0.0, 1.0);
glutBitmapCharacter(font, c);
}
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glutSwapBuffers();
glutPostRedisplay();
}
int main(int argc, char **argv) {
// init GLUT and create Window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(win_width, win_height);
glutCreateWindow("GLUT Test");
// register callbacks
glutDisplayFunc(renderScene);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}
The usual disclaimers about deprecated fixed function pipeline and others apply.
I ran into this same problem using glut to create a model of the solar system. Here's how I solved it: (using your code from above)
glDisable(GL_TEXTURE_2D); //added this
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0, win_width, 0.0, win_height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(10, 10);
string s = "Some text";
void * font = GLUT_BITMAP_9_BY_15;
for (string::iterator i = s.begin(); i != s.end(); ++i)
{
char c = *i;
glColor3d(1.0, 0.0, 0.0);
glutBitmapCharacter(font, c);
}
glMatrixMode(GL_PROJECTION); //swapped this with...
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //...this
glPopMatrix();
//added this
glEnable(GL_TEXTURE_2D);
You'll note i switched glMatrixMode(GL_PROJECTION);
and glMatrixMode(GL_MODELVIEW);
near the end. I decided to do this because of this website. I also has to surround the code section with glDisable(GL_TEXTURE_2D)
and glEnable(GL_TEXTURE_2D)
.
Hope that helps- I worked for me. My solar system uses classes to perform all of this, I'd be happy to share more details upon request.
There is a tricky way to solve your problem.
Please write a code before you call a function or what ever it is as written below:
glutBitmaCharacter(font, ' ');//
Does it....! And it should work...