程式語言 - Simple DirectMedia Layer (SDL) - v1.2 - C/C++ - OpenGL 1.0 - Use Bitmap Font



參考資訊:
https://github.com/gamedev-net/nehe-opengl

main.c

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <GL/gl.h>
  
int main(int argc, char *argv[])
{
    int i = 0;
    const int W = 320;
    const int H = 240;
    char buf[255] = { "Hello, world!" };
    GLuint tex = 0;
    GLuint base = 0;
    SDL_Surface *font = NULL;
    SDL_Surface *screen = NULL;
   
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(W, H, 16, SDL_SWSURFACE | SDL_OPENGL);
    font = SDL_LoadBMP("font.bmp");
 
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glEnable(GL_TEXTURE_2D);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, font->w, font->h, 0, GL_BGR, GL_UNSIGNED_BYTE, font->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    base = glGenLists(256);
    glBindTexture(GL_TEXTURE_2D, tex);
    for (i = 0; i < 256; i++) {
        const int sz = 16;
        const float fix = 0.0625;
        float cx = 1 - (float)(i % sz) / (GLfloat)sz;
        float cy = 1 - (float)(i / sz) / (GLfloat)sz;

        glNewList(base + (255 - i), GL_COMPILE);
            glBegin(GL_QUADS);
                glTexCoord2f(cx - fix, cy);
                glVertex2i(0, 0);

                glTexCoord2f(cx, cy);
                glVertex2i(sz, 0);

                glTexCoord2f(cx, cy - fix);
                glVertex2i(sz, sz);

                glTexCoord2f(cx - fix, cy - fix);
                glVertex2i(0, sz);
            glEnd();

            glTranslated(16, 0, 0);
        glEndList();
    }
 
    glViewport(0, 0, W, H);
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, W, 0, H, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();
    glTranslated(10, 100, 0);
    glListBase(base - 32);
    glCallLists(strlen(buf), GL_BYTE, buf);
 
    SDL_GL_SwapBuffers();
    SDL_Delay(3000);
 
    glDeleteTextures(1, &tex);

    SDL_FreeSurface(font);
    SDL_Quit();
    return 0;
}

編譯、執行

$ gcc main.c -I/usr/include/SDL -o main -lSDL -lGL
$ ./main