アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

glpngをmacで使う

飲み屋での一杯目は「水」。komagataです。

canvas上の何も無いも同然なグラフィックAPI上でアプリを書いてきましたが、WebGLというOpenGL ESベースのAPIの実装が始まってるそうなのでまずはOpenGLの勉強を始めました。

デスクトップアプリケーションのGUIツールキット部分はWebとは関係無い(=canvasみたいな感じになるはずな)ので、GLUT(The OpenGL Utility Toolkit)を使って行きます。

とりあえずpngを簡単に読み込みたかったのでglpngというライブラリを使おうとしたのですが、各地でリンク切れ。前世紀にメンテが終わってるっぽい雰囲気ですが、下記(OpenBSDリポジトリ)に有りました。

ftp://ftp.usa.openbsd.org/pub/OpenBSD/distfiles/glpng-1.45/glpng.zip

どうせWebのためにやるのでOS依存部分で苦労したくないんですが、Macコンパイルするのに少し修正する必要がありました。

% diff glpng.c glpng.c.org
28,29c28,29
< #include <GLUT/glut.h>
< #include "GL/glpng.h"
---
> #include <GL/glpng.h>
> #include <GL/gl.h>

付属のMakefile.LINUXでmakeすれば静的ライブラリ(libglpng.a)が出来ます。(Makefile.SGIってファイルも付いてるのが古さを感じます)

pngInfoとpngBind関数が使えるようになるので簡単にpngファイルが簡単にテクスチャとして貼れました。

#include <stdio.h>
#include <GLUT/glut.h>
#include "glpng.h"

GLuint texture;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0, 0, 0);
        glBindTexture(GL_TEXTURE_2D, texture);
    glPopMatrix();

    glBegin(GL_QUADS);
        glTexCoord2d(0.0, 1.0);
        glVertex2d(-1, -1);
        glTexCoord2d(1.0, 1.0);
        glVertex2d(1, -1);
        glTexCoord2d(1.0, 0.0);
        glVertex2d(1, 1);
        glTexCoord2d(0.0, 0.0);
        glVertex2d(-1, 1);
    glEnd();
    glFlush();
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glColor3d(1.0, 1.0, 1.0);
    glEnable(GL_TEXTURE_2D);

    pngInfo info;
    texture = pngBind("tree.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(100, 100);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("hunter");
    glutDisplayFunc(display);
    init();
    glutMainLoop();
} 

Macのframeworkという仕組みがイマイチわかってないんですが、下記でコンパイルできました。</p>

% cc -framework GLUT -framework OpenGL -o game game.c libglpng.a

tree

ソース:10 at master from komagata's glut - GitHub