1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
# 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
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; }
|