読者です 読者をやめる 読者になる 読者になる

OpenGLでpng表示

OpenGLでは画像ファイルを簡単に扱うことができない(´・ω・`)
なんかpngはライブラリがあるっぽい…。

ちなみ私の環境はLinux Mint 13 maya(LTS)、
OpenGL関連のライブラリはインストール済です。

glpngライブラリは次のところからダウンロードできるようです。
./graphics/glpng [load PNG graphics files and bind them to an OpenGL texture]

ファイルの中身は以下の通り。

適当なディレクトリに解凍できたらsrcディレクトリに移動し、
Makefile.LINUXMakefileにリネーム、もしくはコピー。
そしてMakeを実行する。

するとlibディレクトリ内に静的ライブラリlibglpng.aが生成されている。
そしてinclude/GLディレクトリにはglpng.hファイルがあります。


これらを以下の手順でコピーします。

sudo cp glpng.h /usr/include/GL/
sudo cp libglpng.a /usr/lib/

そして256x256のpngファイルを用意して以下のソースコードコンパイルし実行します。

"main.c"----------------------------------------------------
#include
#include
#include
#include

#define WIDTH 256
#define HEIGHT 256

pngInfo info;
GLuint texture;

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);

glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glBegin(GL_POLYGON);
{
glTexCoord2f(0.0f, 1.0f); glVertex2d( 0, 255 );
glTexCoord2f(0.0f, 0.0f); glVertex2d( 0, 0 );
glTexCoord2f(1.0f, 0.0f); glVertex2d( 255, 0 );
glTexCoord2f(1.0f, 1.0f); glVertex2d( 255, 255 );
}
glEnd();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);

glutSwapBuffers();
}

void idle(void)
{
glutPostRedisplay();
}

void Init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
texture = pngBind ("penguin.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
}

int main(int argc, char *argv[])
{
glutInitWindowPosition(100, 100);
glutInitWindowSize(WIDTH, HEIGHT);
glutInit(&argc, argv);
glutCreateWindow("Display Image");
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return 0;
}

                                                                                                                      • -

次にMakefileの中身です。
"Makefile"--------------------------------------------------
CC = gcc
CFLAGS =
PROGRAM = main
LIBRARY = -lglpng -lm -lglut -lGLU

all : ${PROGRAM}

${PROGRAM} : ${PROGRAM}.o
${CC} ${PROGRAM}.o ${CFLAGS} ${LIBRARY} -o ${PROGRAM}

${PROGRAM}.o : ${PROGRAM}.c
${CC} ${PROGRAM}.c -c

clean :
rm -f *.o *~

                                                                                                                      • -

数学ライブラリでありlibm.aをリンクする-lmオプションを
libglpng.aをリンクする-lglpngオプションの前に持ってくると次のようなエラーが出ます。
"エラー内容"-------------------------------------------------
gcc main.o -lm -lglut -lGLU -lglpng -o main
/usr/bin/ld: /usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/libglpng.a(pngrtran.o): undefined reference to symbol 'pow@@GLIBC_2.0'
/usr/bin/ld: note: 'pow@@GLIBC_2.0' is defined in DSO /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libm.so so try adding it to the linker command line
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libm.so: could not read symbols: Invalid operation
collect2: ld はステータス 1 で終了しました
make: *** [main] エラー 1

                                                                                                                      • -

こんなことで引っかかるみたいです。

実行結果は次の通り。

本日の参考サイト
OpenGLプログラミングメモ - PNG画像を表示する(glpng)
UNIXの部屋 コマンド検索: gcc
コンパイラ(gccコマンド)の使い方
OpenGL de プログラミング
森北出版株式会社刊 「Springs of C」サポートwebページ