opengl显示形状和绘制文本

时间:2013-03-28 23:55:23

标签: opengl text glut

基本上我有一个基本的形状,由键盘控制进行操作。我还有一些文字,我想在屏幕上显示“Hello world”。然而,每当我去运行它时,我只是得到一个空白屏幕。

这是我的代码,任何想法?

#include <iostream>
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <GL/glut.h>
#include <math.h>

GLfloat g_xeye;
GLfloat g_yeye;

bool rollOn;

GLfloat g_light_position[] = {0.0, 10.0, 10.0, 0.0};

void roll(void)
{
    if (rollOn){
        Sleep(1);
        g_xeye = g_xeye + 00000.1;
        glutPostRedisplay();
        g_yeye = g_yeye + 00000.1;
        glutPostRedisplay();
    }
}

void drawBitmapText(char *string, float x, float y, float z)
{
    char *c;
    glRasterPos3f(x, y, z);

    for (c=string; *c != '\0'; c++)
    {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, *c);
    }
}

void drawStrokeText(char*string, int x, int y, int z)
{
    char *c;
    glPushMatrix();
    glTranslatef(x, y+8, z);

    for (c=string; *c != '\0'; c++)
    {
        glutStrokeCharacter(GLUT_STROKE_ROMAN, *c);
    }
    glPopMatrix();
}

void display(void)
{
    GLfloat redDiffuseMaterial[] = {0.50, 0.0, 0.50, 0.0};

    glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    gluLookAt(0,0, 6 , 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, redDiffuseMaterial);
    //glPushMatrix();
    glRotatef(g_xeye, 1, 0, 0);
    glRotatef(g_yeye, 0, 1, 0);
    glutSolidCube(2.0);
    //glPopMatrix();

    //glColor3f(0.250, 0.0, 0.200);

    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity();

    glColor3f(0,1,0);

    drawBitmapText("Hello world",200,200,0);

    glutSwapBuffers ();
}

void keyboard(unsigned char key, int x, int y)
{
    if (key==27)
        exit(0);
    if (key == ',')
    {

        g_light_position[0] = g_light_position[0] - 1;
        glLightfv(GL_LIGHT0, GL_POSITION, g_light_position);

    }
    if (key == '.')
    {
        g_light_position[0] = g_light_position[0] + 1;
        glLightfv(GL_LIGHT0, GL_POSITION, g_light_position);
        glutPostRedisplay();
    }
    if (key==32)
    {
    if(rollOn==false)
        rollOn=true;
    else
        rollOn=false;
    }
}

void special(int key, int x, int y)
{
    if (key==27)
        exit(0);
    if (key == GLUT_KEY_UP)
    {
        g_xeye = g_xeye + 2;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_DOWN)
    {
        g_xeye = g_xeye - 2;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_RIGHT)
    {
        g_yeye = g_yeye + 2;
        glutPostRedisplay();
    }
    if (key == GLUT_KEY_LEFT)
    {
        g_yeye = g_yeye - 2;
        glutPostRedisplay();
    }
}

void init(void)
{
    glEnable(GL_DEPTH_TEST);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glLightfv(GL_LIGHT0, GL_POSITION, g_light_position);

    rollOn = false;  

    g_xeye = 0;
    g_yeye = 0;
}

void reshape (int width, int height)
{
    /* Called when window is created, moved or resized */
    GLfloat aspectRatio;

    /* Set the viewport to be the whole window */
    glViewport(0, 0, (GLsizei) width, (GLsizei) height);

    /* Prepare to set up the Projection matrix */
    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();
    //glColor3f(0.250, 0.0, 0.200);

    gluOrtho2D(0, width, height, 0);


    /* Set a prespective projection */
    aspectRatio = (GLfloat)width / (GLfloat) height;
    gluPerspective(60, aspectRatio, 1.0, 100.0);

    /* Prepare to set up the Model view matrix */
    glMatrixMode(GL_MODELVIEW);
    glClearColor (0.0, 0.0, 0.0, 0.0);

    glLoadIdentity();
}

/*void render(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glColor3f(0,1,0);

    drawBitmapText("Hello world",200,200,0);
    glutSwapBuffers();
}*/

int main(int argc, char** argv)
{
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow ("Project");
    init();


    glutKeyboardFunc(keyboard);
    glutSpecialFunc(special);


    glutReshapeFunc(reshape);
    glutDisplayFunc(display);

    glutIdleFunc(roll);



    glutMainLoop();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

试试这个:

#include <GL/glut.h>

GLfloat g_xeye;
GLfloat g_yeye;

bool rollOn;

GLfloat g_light_position[] = {0.0, 10.0, 10.0, 0.0};

void timer( int extra )
{
    if (rollOn){
        g_xeye = g_xeye + 00000.1;
        g_yeye = g_yeye + 00000.1;
    }
    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

void drawBitmapText(char *string, float x, float y, float z)
{
    char *c;
    glRasterPos3f(x, y, z);

    for (c=string; *c != '\0'; c++)
    {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, *c);
    }
}

void display(void)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    // draw cube in 3D
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective(60, w / h, 1.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, 6, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    glPushMatrix();
    glRotatef(g_xeye, 1, 0, 0);
    glRotatef(g_yeye, 0, 1, 0);
    GLfloat redDiffuseMaterial[] = {0.50, 0.0, 0.50, 0.0};
    glMaterialfv(GL_FRONT, GL_DIFFUSE, redDiffuseMaterial);
    glutSolidCube(2.0);
    glPopMatrix();

    // switch to 2D for text overlay
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho( 0, w, 0, h, -1, 1 );

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glDisable( GL_LIGHTING );
    glColor3ub(255,255,255);
    drawBitmapText("Hello world",200,200,0);
    glEnable( GL_LIGHTING );

    glutSwapBuffers ();
}

void keyboard(unsigned char key, int x, int y)
{
    if (key==27)
        exit(0);
    if (key == ',')
    {
        g_light_position[0] = g_light_position[0] - 1;
    }
    if (key == '.')
    {
        g_light_position[0] = g_light_position[0] + 1;
        glLightfv(GL_LIGHT0, GL_POSITION, g_light_position);
    }
    if (key==32)
    {
        rollOn = !rollOn;
    }
}

void special(int key, int x, int y)
{
    if (key==27)
        exit(0);
    if (key == GLUT_KEY_UP)
    {
        g_xeye = g_xeye + 2;
    }
    if (key == GLUT_KEY_DOWN)
    {
        g_xeye = g_xeye - 2;
    }
    if (key == GLUT_KEY_RIGHT)
    {
        g_yeye = g_yeye + 2;
    }
    if (key == GLUT_KEY_LEFT)
    {
        g_yeye = g_yeye - 2;
    }
}

void init(void)
{
    glEnable(GL_DEPTH_TEST);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glLightfv(GL_LIGHT0, GL_POSITION, g_light_position);

    rollOn = false;  

    g_xeye = 0;
    g_yeye = 0;
}

int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow ("Project");
    init();

    glutKeyboardFunc(keyboard);
    glutSpecialFunc(special);
    glutDisplayFunc(display);
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}

如果您愿意使用glWindowPos()中的OpenGL 1.4代替glRasterPos(),则可以避免2D切换。