#!/usr/local/bin/perl # # texture # # This program demonstrates texture mapping # An image file (wolf.ppm) is read in as the texture # then packed into a C array format and given to glTexImage2D # BEGIN{ unshift(@INC,"../blib"); } # in case OpenGL is built but not installed BEGIN{ unshift(@INC,"../blib/arch"); } # 5.002 gamma needs this BEGIN{ unshift(@INC,"../blib/lib"); } # 5.002 gamma needs this use OpenGL; $spin=0.0; sub read_ascii_ppm{ # reads in an ascii ppm format image file # returns the list (width,height,packed rgb image data) # # I'm not to familiar with the ppm file format # this subroutine may not work for all valid ppm files # local($file) = @_; local($w,$h,$image); local(@image); open(PPM,"<$file") || die "cant open $file"; (<PPM>); # the first line is just a header: "P3" (<PPM>); # The second line is a comment ($_=<PPM>); # the 3rd line gives width and height m/(\d+)\s+(\d+)/; $w=$1 ; $h=$2 ; ($w>=64 && $h>=64 && $w<10000 && $h<10000) || die "strange sizes $w,$h"; ($_=<PPM>); # 4th line is depth (should be 255) (/255/) || die " improper depth $_"; $image=""; while(<PPM>) { chop; $image .= $_ . " "; } @image=split(/\s+/,$image); $size=$w*$h*3; ($size == $#image +1) || die "array length $#image +1 differs from expected size $size" ; $image=pack("C$size",@image); close(PPM); if ($file =~ s/\.ppm$/.bin/ and not -r $file) { print STDERR "Writing binary image data '$file'.\n"; open BIN, "> $file" || die "cant open '$file': $!"; binmode BIN; print BIN pack 'N N a*', $w, $h, $image; close BIN or die "error closing '$file': $!"; } ($w,$h,$image); } sub read_bin_image { # reads in a binary image file # returns the list (width,height,packed rgb image data) # # I'm not to familiar with the ppm file format # this subroutine may not work for all valid ppm files # my($file) = @_; my($w,$h,$image); my(@image); open(BIN,"<$file") || die "cant open '$file': $!"; binmode BIN; my $data = do {local $/; <BIN>}; close BIN or die "error closing '$file': $!"; return unpack 'N N a*', $data; } sub myReshape { # glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0 , 1.0, 30.0); glMatrixMode(GL_MODELVIEW); } sub display{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity (); glTranslatef(0.0, 0.0, -2.6); glPushMatrix(); glRotatef($spin,0,1,0); glRotatef($spin,0,0,1); glBegin(GL_QUADS); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(1.0, -1.0, 0.0); glPopMatrix(); glEnd(); glFlush(); glXSwapBuffers(); } glpOpenWindow(width=>200,height=>200,attributes=>[GLX_RGBA,GLX_DOUBLEBUFFER]); glClearColor(0,0,0,1); glColor3f (1.0, 1.0, 1.0); glShadeModel (GL_FLAT); myReshape(); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); #$file = "wolf.ppm"; #-r $file or $file = "examples/$file"; #($w,$h,$image)=&read_ascii_ppm($file); $file = "wolf.bin"; -r $file or $file = "examples/$file"; ($w,$h,$image)=&read_bin_image($file); glTexImage2D(GL_TEXTURE_2D, 0, 3, $w,$h, 0, GL_RGB, GL_UNSIGNED_BYTE,$image); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glEnable(GL_TEXTURE_2D); while(1){$spin=$spin+1.0;display; }