Skip to content
Snippets Groups Projects
Commit 77c2780e authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Skript aktualisiert bis einschließlich 3.3: Bibliotheken verwenden (= Stand der Vorlesung)

parent 22a7921d
No related branches found
No related tags found
No related merge requests found
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glutSolidCube (0.75);
glFlush ();
glutSwapBuffers ();
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glRotatef (-30.0, 0.5, 1.0, 0.0);
glutSolidCube (0.75);
glFlush ();
glutSwapBuffers ();
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
float t = 0.0;
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glRotatef (t, 0.5, 1.0, 0.0);
glutSolidCube (0.5);
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
float t = 0.0;
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glPushMatrix ();
glRotatef (t, 0.5, 1.0, 0.0);
glutSolidCube (0.5);
glPopMatrix ();
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
float t = 0.0;
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glPushMatrix ();
glRotatef (20.0 * t, 0.5, 1.0, 0.0);
glutSolidCube (0.5);
glPopMatrix ();
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
float t = 0.0;
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glPushMatrix ();
glTranslatef (0.9, 0.0, 0.0);
glRotatef (20.0 * t, 0.5, 1.0, 0.0);
glutSolidCube (0.5);
glPopMatrix ();
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
float t = 0.0;
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 0.7, 0.0);
glPushMatrix ();
glRotatef (20.0 * t, 0.5, 1.0, 0.0);
glTranslatef (0.9, 0.0, 0.0);
glutSolidCube (0.5);
glPopMatrix ();
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Cube");
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
../common/earth-texture.png
\ No newline at end of file
No preview for this file type
...@@ -2731,7 +2731,7 @@ ...@@ -2731,7 +2731,7 @@
\item \item
Funktionen: z.\,B.\ \lstinline{glutInit (&argc, argv);} Funktionen: z.\,B.\ \lstinline{glutInit (&argc, argv);}
\item \item
Konstanten: z.\,B.\ \lstinline{GLUT_RGBA} Konstante: z.\,B.\ \lstinline{GLUT_RGBA}
\item \item
Datentypen: z.\,B.\ \lstinline{GLfloat} Datentypen: z.\,B.\ \lstinline{GLfloat}
\end{itemize} \end{itemize}
...@@ -2786,9 +2786,10 @@ ...@@ -2786,9 +2786,10 @@
void draw (void) void draw (void)
{ {
glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
set_material_color (1.0, 1.0, 0.0); set_material_color (1.0, 0.7, 0.0);
glutSolidCube (0.5); glutSolidCube (0.75);
glFlush (); glFlush ();
glutSwapBuffers ();
} }
int main (int argc, char **argv) int main (int argc, char **argv)
...@@ -2801,14 +2802,16 @@ ...@@ -2801,14 +2802,16 @@
\end{lstlisting} \end{lstlisting}
\begin{picture}(0,0) \begin{picture}(0,0)
\color{red} \color{red}
\put(12.5,6.0){\vector(-1,0){1}} \put(12.5,6.4){\vector(-1,0){1}}
\put(12.6,6.0){\makebox(0,0)[l]{Bildschirm löschen}} \put(12.6,6.4){\makebox(0,0)[l]{Bildschirm löschen}}
\put(7.5,5.55){\vector(-1,0){1}} \put(7.5,5.95){\vector(-1,0){1}}
\put(7.6,5.55){\makebox(0,0)[l]{Rot- und Grünanteil 100\,\%, Blauanteil 0\,\%}} \put(7.6,5.95){\makebox(0,0)[l]{Rotanteil 100\,\%, Grünanteil 70\,\%, Blauanteil 0\,\%}}
\put(5.5,5.1){\vector(-1,0){1}} \put(5.5,5.5){\vector(-1,0){1}}
\put(5.6,5.1){\makebox(0,0)[l]{Würfel zeichnen}} \put(5.6,5.5){\makebox(0,0)[l]{Würfel zeichnen}}
\put(4.0,4.65){\vector(-1,0){1}} \put(4.0,5.05){\vector(-1,0){1}}
\put(4.1,4.65){\makebox(0,0)[l]{Zeichnung "`abschicken"'}} \put(4.1,5.05){\makebox(0,0)[l]{Zeichnung "`abschicken"'}}
\put(5.2,4.6){\vector(-1,0){1}}
\put(5.3,4.6){\makebox(0,0)[l]{fertige Zeichnung zeigen; neues "`Zeichenpapier"' bereitlegen}}
\put(6.0,2.15){\vector(-1,0){1}} \put(6.0,2.15){\vector(-1,0){1}}
\put(6.1,2.15){\makebox(0,0)[l]{Callback-Funktion installieren (s.\,o.)}} \put(6.1,2.15){\makebox(0,0)[l]{Callback-Funktion installieren (s.\,o.)}}
\put(5.0,1.7){\vector(-1,0){1}} \put(5.0,1.7){\vector(-1,0){1}}
...@@ -2839,37 +2842,37 @@ ...@@ -2839,37 +2842,37 @@
Dies alles bewirkt, daß die Variable \lstinline{t} die aktuelle Zeit seit Programmbeginn Dies alles bewirkt, daß die Variable \lstinline{t} die aktuelle Zeit seit Programmbeginn
in Sekunden enthält und daß \lstinline{draw()} zwanzigmal pro Sekunde aufgerufen wird. in Sekunden enthält und daß \lstinline{draw()} zwanzigmal pro Sekunde aufgerufen wird.
\item % \item
Weil das Bild während des Neuzeichnens die ganze Zeit zu sehen ist, % Weil das Bild während des Neuzeichnens die ganze Zeit zu sehen ist,
flackert in \file{cube-3.c} der Bildschirm. % flackert in \file{cube-3.c} der Bildschirm.
Dies wird in \file{cube-3a.c} dadurch behoben, % Dies wird in \file{cube-3a.c} dadurch behoben,
daß die Zeichnung zunächst in einem unsichtbaren Pufferspeicher aufgebaut wird. % daß die Zeichnung zunächst in einem unsichtbaren Pufferspeicher aufgebaut wird.
Erst die fertige Zeichnung wird mit dem Funktionsaufruf \lstinline{swapBuffers()} sichtbar gemacht. % Erst die fertige Zeichnung wird mit dem Funktionsaufruf \lstinline{swapBuffers()} sichtbar gemacht.
%
Damit dies möglich ist, muß beim Initialisieren ein doppelter Puffer angefordert werden. % Damit dies möglich ist, muß beim Initialisieren ein doppelter Puffer angefordert werden.
Zu diesem Zweck ersetzen wir die Bibliothek \file{opengl-magic.c} % Zu diesem Zweck ersetzen wir die Bibliothek \file{opengl-magic.c}
durch \file{opengl-magic-double.c}. % durch \file{opengl-magic-double.c}.
%
Der Compiler-Aufruf lautet dann: % Der Compiler-Aufruf lautet dann:
\begin{lstlisting}[style=terminal,gobble=8] % \begin{lstlisting}[style=terminal,gobble=8]
$ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic-double.c -o cube¿ % $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic-double.c -o cube¿
\end{lstlisting} % \end{lstlisting}
%
Unabhängig davon heißt die Include-Datei weiterhin \file{opengl-magic.h}. % Unabhängig davon heißt die Include-Datei weiterhin \file{opengl-magic.h}.
Dies illustriert, daß der Include-Mechanismus des Präprozessors % Dies illustriert, daß der Include-Mechanismus des Präprozessors
und der Zusammenbau-Mecha"-nismus des Linkers tatsächlich voneinander unabhängig sind. % und der Zusammenbau-Mecha"-nismus des Linkers tatsächlich voneinander unabhängig sind.
%
\begin{experts} % \begin{experts}
(Durch das Austauschen von Bibliotheken, insbesondere bei dynamischen Bibliotheken % (Durch das Austauschen von Bibliotheken, insbesondere bei dynamischen Bibliotheken
(Endung \file{.so} unter Unix bzw.\ \file{.dll} unter Microsoft Windows) % (Endung \file{.so} unter Unix bzw.\ \file{.dll} unter Microsoft Windows)
ist es möglich, das Verhalten bereits fertiger Programme zu beeinflussen, % ist es möglich, das Verhalten bereits fertiger Programme zu beeinflussen,
ohne das Programm neu compilieren zu müssen. % ohne das Programm neu compilieren zu müssen.
Dies kann zu Testzwecken geschehen, zur Erweiterung des Funktionsumfangs % Dies kann zu Testzwecken geschehen, zur Erweiterung des Funktionsumfangs
oder auch zum Einschleusen von Schadfunktionen.) % oder auch zum Einschleusen von Schadfunktionen.)
\end{experts} % \end{experts}
\item \item
In \file{cube-3a.c} dreht sich der Würfel zunächst langsam, dann immer schneller. In \file{cube-3.c} dreht sich der Würfel zunächst langsam, dann immer schneller.
Dies liegt daran, daß sich jedes \lstinline{glRotatef()} Dies liegt daran, daß sich jedes \lstinline{glRotatef()}
auf alle nachfolgenden Zeichenbefehle auswirkt, auf alle nachfolgenden Zeichenbefehle auswirkt,
so daß sich sämtliche \lstinline{glRotatef()} aufaddieren. so daß sich sämtliche \lstinline{glRotatef()} aufaddieren.
...@@ -2881,7 +2884,7 @@ ...@@ -2881,7 +2884,7 @@
Durch \lstinline{glPopMatrix()} wird das System wieder in denjenigen Zustand versetzt, Durch \lstinline{glPopMatrix()} wird das System wieder in denjenigen Zustand versetzt,
in dem es sich vor dem Aufruf von \lstinline{glPushMatrix()} befand. in dem es sich vor dem Aufruf von \lstinline{glPushMatrix()} befand.
Dies ist in \file{cube-3b.c} (langsame Drehung) und \file{cube-3c.c} (schnelle Drehung) umgesetzt. Dies ist in \file{cube-4.c} (langsame Drehung) und \file{cube-5.c} (schnelle Drehung) umgesetzt.
\end{itemize} \end{itemize}
...@@ -2929,27 +2932,24 @@ ...@@ -2929,27 +2932,24 @@
Die weiteren OpenGL-Beispielprogramme illustrieren den Umgang mit Transformationen. Die weiteren OpenGL-Beispielprogramme illustrieren den Umgang mit Transformationen.
\begin{itemize} \begin{itemize}
\item \item
Die Beispielprogramme \file{orbit-1.c} und \file{orbit-1a.c} Die Beispielprogramme \file{cube-5.c} und \file{cube-6.c}
illustrieren eine weitere Transformation der gezeichneten Objekte, illustrieren eine weitere Transformation der gezeichneten Objekte,
nämlich die Translation (Verschiebung). nämlich die Translation (Verschiebung).
Jeder Transformationsbefehl wirkt sich jeweils Jeder Transformationsbefehl wirkt sich jeweils
auf die \emph{danach\/} erfolgenden Zeichenbefehle aus. auf die \emph{danach\/} erfolgenden Zeichenbefehle aus.
Um sich zu veranschaulichen, welche Transformationen auf ein gezeichnetes Objekt wirken Um sich zu veranschaulichen, welche Transformationen auf ein gezeichnetes Objekt wirken
(hier z.\,B.\ auf \lstinline{glutSolidSphere()}), (hier z.\,B.\ auf \lstinline{glutSolidCube()}),
muß man die Transformationen in der Reihenfolge \emph{von unten nach oben\/} ausführen. muß man die Transformationen in der Reihenfolge \emph{von unten nach oben\/} ausführen.
\item \item
Die Beispielprogramme \file{orbit-2.c} und \file{orbit-3.c} Das Beispielprogramm \file{orbit-1.c}
verwenden weitere Transformationen und geometrische Objekte, verwendet weitere Transformationen und geometrische Objekte,
um die Umlaufbahn zweier Kugeln, beispielsweise des Mondes um die Erde, zu illustrieren. um die Umlaufbahn des Mondes um die Erde zu illustrieren.
\begin{experts} Darüberhinaus versieht es die gezeichneten Objekte "`Mond"' und "`Erde"' mit realistischen Texturen (NASA-Fotos).
\item
Das Beispielprogramm \file{orbit-x.c} schließlich versieht
die gezeichneten Objekte "`Mond"' und "`Erde"' mit realistischen Texturen (NASA-Fotos).
Die hierfür notwendigen doch eher komplizierten Funktionsaufrufe Die hierfür notwendigen doch eher komplizierten Funktionsaufrufe
wurden wiederum in eine Bibliothek (\file{textured-spheres}) ausgelagert. wurden wiederum in eine Bibliothek (\file{textured-spheres}) ausgelagert.
\end{experts}
\end{itemize} \end{itemize}
......
../common/moon-texture.png
\ No newline at end of file
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
void init_opengl (int *argcp, char **argv, char *window_name)
{
glutInit (argcp, argv);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize (1024, 768);
glutCreateWindow (window_name);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (20.0, -1.33333, 3.0, 7.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glTranslatef (0.0, 0.0, -5.0);
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
static GLfloat light0_position[] = { 1.0, 0.0, 1.0, 0.0 };
glLightfv (GL_LIGHT0, GL_POSITION, light0_position);
}
void set_material_color (float r, float g, float b)
{
GLfloat color[] = { r, g, b };
glMaterialfv (GL_FRONT, GL_AMBIENT, color);
glMaterialfv (GL_FRONT, GL_DIFFUSE, color);
}
extern void init_opengl (int *argcp, char **argv, char *window_name);
extern void set_material_color (float r, float g, float b);
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "opengl-magic.h"
#include "textured-spheres.h"
float t = 0.0;
GLuint earth_texture, moon_texture;
void draw_earth (void)
{
glPushMatrix ();
glRotatef (90, 1.0, 0.0, 0.0);
glRotatef (100.0 * t, 0.0, 0.0, 1.0);
draw_textured_sphere (earth_texture, 0.25512, 63, 20);
glPopMatrix ();
}
void draw_moon (void)
{
glPushMatrix ();
glRotatef (90, 1.0, 0.0, 0.0);
glRotatef (-90, 0.0, 0.0, 1.0);
draw_textured_sphere (moon_texture, 0.06952, 31, 10);
glPopMatrix ();
}
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
glRotatef (23.44, 1.0, 0.0, -1.0);
draw_earth ();
glRotatef (5.145, 0.0, 1.0, 1.0);
glRotatef (30.0 * t, 0.0, -1.0, 0.0);
glTranslatef (0.9, 0.0, 0.0);
draw_moon ();
glPopMatrix ();
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int value)
{
t += 0.05;
glutPostRedisplay ();
glutTimerFunc (50, timer_handler, 0);
}
int main (int argc, char **argv)
{
init_opengl (&argc, argv, "Orbit");
init_texture ("earth-texture.png", &earth_texture);
init_texture ("moon-texture.png", &moon_texture);
glutDisplayFunc (draw);
glutTimerFunc (50, timer_handler, 0);
glutMainLoop ();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <png.h>
#include "textured-spheres.h"
#ifndef __USE_POSIX
extern int fileno (FILE *stream);
#endif
static png_byte *load_png_file (char *filename, unsigned *w, unsigned *h)
{
FILE *f = fopen (filename, "rb");
if (!f)
return NULL;
/* is it a PNG file? */
png_byte buf[8];
if (fread (buf, 1, 8, f) != 8)
{
fclose (f);
return NULL;
}
if (!png_check_sig (buf, 8))
{
fclose (f);
return NULL;
}
png_struct *png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (!png_ptr)
{
fclose (f);
return NULL;
}
png_info *info_ptr = png_create_info_struct (png_ptr);
if (!info_ptr)
{
fclose (f);
png_destroy_read_struct (&png_ptr, NULL, NULL);
return NULL;
}
if (setjmp (png_jmpbuf (png_ptr)))
{
fclose (f);
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
return NULL;
}
png_init_io (png_ptr, f);
png_set_sig_bytes (png_ptr, 8);
png_read_info (png_ptr, info_ptr);
png_uint_32 width;
png_uint_32 height;
int bit_depth;
int color_type;
png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth,
&color_type, NULL, NULL, NULL);
/* tell libpng to strip 16 bit/color files down to 8 bits/color */
if (bit_depth == 16)
png_set_strip_16 (png_ptr);
/* expand paletted colors into true RGB triplets */
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand (png_ptr);
/* expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand (png_ptr);
/* expand paletted or RGB images with transparency to full alpha channels
so the data will be available as RGBA quartets. */
if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
png_set_expand (png_ptr);
/* transform grayscale images into rgb */
if (color_type == PNG_COLOR_TYPE_GRAY
|| color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb (png_ptr);
if (color_type & PNG_COLOR_MASK_ALPHA)
png_set_strip_alpha (png_ptr);
png_read_update_info (png_ptr, info_ptr);
png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth,
&color_type, NULL, NULL, NULL);
if (color_type != PNG_COLOR_TYPE_RGB
&& color_type != PNG_COLOR_TYPE_RGB_ALPHA)
{
fclose (f);
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
return NULL;
}
png_uint_32 row_bytes = png_get_rowbytes (png_ptr, info_ptr);
if (row_bytes & 0x01)
row_bytes++;
png_byte *png_pixels = malloc (row_bytes * height * sizeof (png_byte));
if (png_pixels == NULL)
{
fclose (f);
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
return NULL;
}
png_byte **row_pointers = malloc (height * sizeof (png_bytep));
if (row_pointers == NULL)
{
fclose (f);
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
free (png_pixels);
png_pixels = NULL;
return NULL;
}
int i;
for (i = 0; i < height; i++)
row_pointers[i] = png_pixels + i * row_bytes;
png_read_image (png_ptr, row_pointers);
png_read_end (png_ptr, info_ptr);
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
fclose (f);
if (w)
*w = width;
if (h)
*h = height;
free (row_pointers);
return png_pixels;
}
void init_texture (char *image_filename, GLuint *texture)
{
unsigned image_width, image_height;
png_byte *image = load_png_file (image_filename, &image_width, &image_height);
if (!image)
{
fprintf (stderr, "textured-spheres.c: cannot open texture file \"%s\"",
image_filename);
exit (1);
}
glGenTextures (1, texture);
glBindTexture (GL_TEXTURE_2D, *texture);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image_width, image_height, GL_RGB, GL_UNSIGNED_BYTE, image);
}
void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks)
{
static GLfloat white_color[] = { 1.0, 1.0, 1.0 };
glMaterialfv (GL_FRONT, GL_AMBIENT, white_color);
glMaterialfv (GL_FRONT, GL_DIFFUSE, white_color);
glBindTexture (GL_TEXTURE_2D, texture);
glEnable (GL_TEXTURE_2D);
GLUquadric *sphere = gluNewQuadric ();
gluQuadricTexture (sphere, GL_TRUE);
gluSphere (sphere, radius, slices, stacks);
glDisable (GL_TEXTURE_2D);
}
#ifndef TEXTURED_SPHERES_H
#define TEXTURED_SPHERES_H
#include <GL/gl.h>
#include <GL/glu.h>
extern void init_texture (char *image_filename, GLuint *texture);
extern void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks);
#endif /* TEXTURED_SPHERES_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment