Introduzione SOMMARIO



Похожие документы
OpenGL: visualizzazione 3D

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

Corso di grafica 3D con C++ e OpenGL. Alessandro Bugatti ITIS B. Castelli

Processo di rendering

Processo di rendering

Realizzazione di un semplice programma di Painting

Grafica 3D Interattiva

Le ombre in OpenGl. Daniele Varin LS Ing. Informatica Corso di Elementi di Grafica Digitale

Open Source 3D Engine. OpenGL Rendering System. Il Framework

INFORMATICA GRAFICA. 20 Aprile Introduzione a OpenGL. Michele Antolini michele.antolini@mail.polimi.it

OpenGL effects. Texture Mapping. La fase di texture mapping serve a conferire maggiore realismo agli oggetti della scena 3D.

Lezione1. Cos è la computer grafica. Lezione del 10 Marzo Michele Antolini Dipartimento di Ingegneria Meccanica Politecnico di Milano

Introduzione Computer Graphics

GLUI: GLUT-based User Interface

Introduzione al Linguaggio C

Testo Esercizio. Un modello è ragionevole quando contiene queste tre caratteristiche.

Computer Graphics. La disciplina fornisce metodi per creare elaborare memorizzare visualizzare. immagini di oggetti o scene mediante un computer

Grafica Computazionale

Introduzione al 3D con Autocad

Registratori di Cassa

BDX 3D-EDITOR (autore: Marco Bedulli) Scopo del software. Caratteristiche fondamentali. Linguaggi utilizzati. Navigazione 3D

GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain.

Creare primitive solide

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Il controllo della visualizzazione

4. Proiezioni del piano e dello spazio

Introduzione a ROOT. 1. Informazioni generali

Grafico della parabola

Architetture Applicative

Sweet home 3D e un software gratuito per disegnare ed arredare la casa.

Claudio Gussini Programma dei Corsi I e II Livello

Il Sistema Operativo (1)

Bump Mapping & Under-Water Effects. Dott. Stefano Tubini

SOMMARIO. Programmazione orientata agli eventi. Programmazione orientata agli eventi. Programmazione orientata agli eventi

Immagini vettoriali. Immagini raster

Hardware delle reti LAN

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

L informatica INTRODUZIONE. L informatica. Tassonomia: criteri. È la disciplina scientifica che studia

Modelli per i materiali

Decorazione Piastrelle

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Proiezione Stereoscopica

Informatica Grafica. (III anno Laurea Triennale - Corso di Laurea in Informatica) Donato D Ambrosio

Manuale del Programma EPROM Creator V1.0

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Informatica. Prof. A. Longheu. Introduzione a Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

3DSMAX 6. Una panoramica su l interfaccia e gli strumenti a disposizione

La Pipeline Grafica. Vediamo come avviene il rendering, ovvero la visualizzazione di oggetti. Introduzione. La Pipeline Grafica.

Object Oriented Programming

Animazioni 3D. Informatica Grafica I. Le basi dell'animazione 3D. Le basi dell'animazione 3D. Le basi dell'animazione 3D. Le basi dell'animazione 3D

Lezione 1. Introduzione e Modellazione Concettuale

Le texture. Informatica Grafica I. Le texture. Le texture. Le texture. Le texture. Le texture

Funzioni. Il modello console. Interfaccia in modalità console

Trasformazioni 2D. Grande differenza rispetto alla grafica raster!

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

MODELLAZIONE SOLIDA. Scheda Solidi. Disegno di un parallelepipedo

Setup e installazione

Capitolo 11. Il disegno in 3D

Compilatore risorse display grafico LCD serie IEC-line

VETTOR DAL BITMAP AL VETTORIALE. Paolo Mantini TEORIA E PRATICA DELLA CONVERSIONE DELLE IMMAGINI DA RASTER A VETTORIALI

SymCAD/C.A.T.S. modulo Canali Schema

Database. Si ringrazia Marco Bertini per le slides

IL SOFTWARE. Giada Agostinacchio Classe 2^ Beat ISIS G.Meroni Lissone Anno Scolastico 2007/2008

WORD per WINDOWS95. Un word processor e` come una macchina da scrivere ma. con molte più funzioni. Il testo viene battuto sulla tastiera

Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche

Disegno 2D, rappresentazioni

Architettura di un sistema operativo


Implementazione di MVC. Gabriele Pellegrinetti

3D e Realtà Virtuale

Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

ISTITUTO SUPERIORE D. MILANI MONTICHIARI CORSO DI AUTOCAD 2014/15 DOCENTE :GIOACCHINO IANNELLO

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Traduzione ed esecuzione di programmi. Dispensa 08

Assessorato alla Sanità ARPA. Anagrafe Regionale dei Prodotti Amministrabili. Manuale Utente 1.0.0

Istruzioni per l uso dei programmi MomCad, TraveCon, TraveFon

INTRODUZIONE AI SISTEMI CAD

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Il SOFTWARE DI BASE (o SOFTWARE DI SISTEMA)

Applicazioni grafiche

MagiCum S.r.l. Progetto Inno-School

STRUMENTI DI PRESENTAZIONE MODULO 6

INFORMATICA GRAFICA. 25 Marzo Introduzione a OpenGL. Michele Antolini

AddCAD per ZWCad. Passa alla progettazione 3D rimanendo sul tuo Cad famigliare

Istruzioni per l uso della Guida. Icone utilizzate in questa Guida. Istruzioni per l uso della Guida. Software di backup LaCie Guida per l utente

Транскрипт:

SOMMARIO Introduzione alle librerie grafiche e a OpenGL Implementazioni hw e sw e supporto multipiattaforma Esempi di programma con OpenGL Sistemi di coordinate 2D e 3D Proiezioni Primitive 3D Pipeline delle trasformazioni geometriche Colori e luci Textures Introduzione DEFINIZIONE: OpenGL puo essere definita come un interfaccia software ad hardware grafici - E una libreria per la grafica e la modellazione 3D. - Non e un linguaggio di programmazione (come C/C++/C#), eccetto per l OpenGL shading language. - E una application programming interface (API). E quindi possibile richiamare le funzioni della libreria direttamente dalla maggior parte dei linguaggi di programmazione. - Non esiste un formato di file specifico di OpenGL per descrivere i modelli o gli ambienti virtuali. 1 2 Implementazioni sw e hw E una libreria rivolta all utilizzo con dispositivi hardware progettati e ottimizzati per la visualizzazione e la manipolazione di grafica 3D. E caratterizzata da un elevata velocita e portabilita. Esistono implementazioni software (Microsoft, Mesa3D, Apple). Nelle implementazioni software il rendering non puo essere effettuato velocemente come nelle implementazioni hardware, ma i programmi possono essere eseguiti anche senza un hardware grafico accelerato. Implementazioni sw Esempio: applicazione Windows. Un implementazione software di OpenGL riceve le richieste grafiche da un applicazione e costruisce (rasterize) l immagine dell oggetto grafico 3D. Fornisce quindi al graphics device interface (GDI) l immagine da visualizzare a monitor. Su altri OS il GDI e sostituito dall equivalente API per la gestione del display. 3 4

Implementazioni hw Esempio: scheda grafica. Le chiamate alle API OpenGL sono passate al driver dell hw. Il driver non passa i suoi output alle API Windows GDI, ma si interfaccia direttamente con l hardware di visualizzazione (implementazione accelerata). Tuttavia, alcune funzionalita sono implementate in software come parte del driver, altre sono passate direttamente all hardware. Implementazioni hw A seconda dell hardware grafico porzioni maggiori o minori della fase di trasformazione possono essere eseguite in hardware. Cio comporta la possibilita di calcolare e visualizzare modelli sempre piu dettagliati in tempi minori. 5 6 Indipendenza dalla piattaforma Esempi OpenGL non ha funzioni per la gestione delle finestre, l interazione con l utente, l I/O su file. Tali funzioni sono rimandate a quelle fornite dal sistema operativo. Questo permette di avere un astrazione dell hardware grafico indipendente dalla piattaforma. Funzionalita quali la gestione delle finestre, sono fornite dall OpenGL utility toolkit (GLUT), una libreria croospiattaforma, disponibile per distribuzioni Linux, supportata in maniera nativa da Mac OS X e disponibile attraverso l implementazione freeglut per Windows. GLUT non sostituisce le funzionalita delle API dello specifico OS, ma fornisce la base per creare programmi portabili Tecnologie Software sottoper diversi la Bioingegneria OS. 7 I seguenti esempi sono creati utilizzando Microsoft Visual Studio 2008 OpenGL fornito da Windows Libreria GLUT 8

Struttura di un programma #include <iostream> #include <glut.h> using namespace std; void RenderScene(); void MyInit(); int main(int argc, char* argv[]) glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB); glutcreatewindow("esempio OpenGL"); glutdisplayfunc(renderscene); MyInit(); glutmainloop(); return 0; Display callback function: GLUT chiama questa funzione ogni volta che la finestra deve essere ridisegnata. Struttura di un programma void MyInit() glclearcolor(1,1,1,1); Definisce il colore usato per cancellare la finestra (RGB + alpha) Cancella un particolare buffer, in questo void RenderScene() caso il color buffer. glclear(gl_color_buffer_bit); glflush(); Esegue i comandi OpenGL non ancora eseguiti. 9 10 Sistemi di coordinate 2D Sistemi di coordinate 2D Esempio: sistema di coordinate 2D cartesiano E necessario stabilire come trasformare le coordinate cartesiane in coordinate schermo, specificando la regione occupata dalla finestra. Questa regione e chiamata regione di clipping. 11 12

Viewport Viewport L altezza e la larghezza dell area di clipping potrebbero non corrispondere all altezza e alla larghezza della finestra (in pixels). Il sistema di coordinate deve quindi essere mappato da coordinate cartesiane logiche a coordinate schermo fisiche (in pixels). Questo mapping e noto come definizione di una viewport. La viewport mappa l area di clipping ad una regione della finestra. Le dimensioni della viewport possono essere pari a quelle della finestra, maggiori o inferiori. 13 14 Sistemi di coordinate 3D Proiezioni Esempio: sistema di coordinate 3D cartesiano E necessario rappresentare oggetti definiti in 3 dimensioni su una superficie bidimensionale (lo schermo). La trasformazione da 3D a 2D e nota come proiezione. 15 16

Proiezioni Proiezioni Specificando la proiezione viene specificato il viewing volume, ovvero la porzione di spazio che si vuole trasformare e come esso deve essere trasformato. Esistono due diversi tipi di proiezione: ortografica e prospettica PROIEZIONE ORTOGRAFICA PROIEZIONE PROSPETTICA 17 18 Proiezione ortografica Nella proiezione ortografica (o parallela) viene specificato un viewing volume cubico (o a parallelepipedo). Tutto cio che e al di fuori di questo volume non viene rappresentato. Gli oggetti con la stessa dimensione vengono rappresentati con la stessa dimensione indipendentemente dalla loro posizione (usata da programmi CAD) Proiezione prospettica Nella proiezione prospettica il viewing volume ha la forma di un tronco di piramide (frustum). Gli oggetti lontani appaiono piu piccoli degli oggetti (con la stessa dimensione) vicini. Questo tipo di proiezione da maggior realismo. 19 20

Proiezione prospettica Le proiezioni prospettiche sono definite utilizzando la seguente funzione: void gluperspective(gldouble fovy, Gldouble aspect, Gldouble znear, Gldouble zfar); Esempio int main(int argc, char* argv[]) glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB ); glutcreatewindow("esempio OpenGL - Viewport"); glutdisplayfunc(renderscene); glutreshapefunc(changesize); MyInit(); glutmainloop(); return 0; void RenderScene() glclear(gl_color_buffer_bit); glcolor3f(0,1,0); glrectf(-25,25,25,-25); glflush(); void MyInit()glClearColor(1,1,1,1); 21 22 Esempio void ChangeSize(GLint w, GLint h) GLfloat aspectratio; if(h==0) h=1; glviewport(0,0,w,h); glmatrixmode(gl_projection); glloadidentity(); aratio = (GLfloat)w/(GLfloat)h; Questa funzione viene chiamata dalla libreria GLUT quando la finestra cambia dimensioni. Si setta la viewport alle dimensioni della finestra Si resetta il sistema di coordinate if(w<=h) glortho(-100,100,-100/aratio, 100/aRatio,1,-1); else glortho(-100*aratio,100*aratio,-100, 100,1,-1); glmatrixmode(gl_modelview); glloadidentity(); Disegnare oggetti in 3D Gli oggetti piu complessi sono costruiti a partire da primitive. Le primitive in OpenGL sono oggetti a 1-2-3 dimensioni. Un punto in 3D e definito da glvertex*(glfloat x, GLfloat y, GLfloat z) GL_POINTS: per definire un insieme di primitive da interpretare e disegnare come punti. glbegin(gl_points) glvertex3f(0.0f,0.0f,0.0f); glvertex3f(10.0f,10.0f,10.0f); glend() 23 24

Disegnare oggetti in 3D Per disegnare una linea, specificandone gli estremi, si utilizza la primitiva GL_LINES: glbegin(gl_lines) glvertex3f(0.0f,0.0f,0.0f); glvertex3f(10.0f,10.0f,10.0f); glend() E da notare che in questo caso due vertici descrivono una singola primitiva. Altre primitive: GL_TRIANGLE, GL_QUADS, GL_POLYGON class MyCube float Color[3]; float PPos; float MPos; float trans; public: float Rot; Esempio Cubo 3D MyCube(float r, float g, float b, float rot, float mpos, float ppos) Color[0]=r; Color[1]=g; Color[2]=b; Rot=rot; MPos = mpos; PPos = ppos; trans= 0; 25 26 Esempio Cubo 3D Esempio Cubo 3D... void DrawCube() gltranslatef(0.0f,0.0f, trans); glrotatef(rot, 0.0f, 1.0f, 0.0f); glbegin(gl_quads); glcolor3fv(color); glvertex3f(ppos, PPos, MPos); glvertex3f(ppos, PPos, PPos); glvertex3f(ppos, MPos, PPos); glvertex3f(ppos, MPos, MPos);... glend(); ; Il cubo e costruito utilizzando la primitiva GL_QUADS Analogamente per le altre facce del cubo MyCube* c; int main(int argc, char* argv[]) glutinit(&argc, argv); glutinitdisplaymode(glut_double GLUT_RGB GLUT_DEPTH); glutcreatewindow("esempio OpenGL"); glutdisplayfunc(renderscene); MyInit(); glutmainloop(); delete c; return 0; 27 28

Esempio Cubo 3D void MyInit() glclearcolor(1,1,1,1); c = new MyCube(1,0,1,50,-1,1); Proiezione prospettica glenable(gl_depth_test); glmatrixmode(gl_projection); gluperspective(40.0, 1.0, 1.0,10.0); glmatrixmode(gl_modelview); glulookat(0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.); void RenderScene() glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); c->drawcube(); glutswapbuffers(); Pipeline delle trasformazioni geometriche Esistono 3 tipi di trasformazioni che mettono in relazione i punti nello spazio 3D e cio che appare sullo schermo: Viewing Modeling Projection Su definiscono Eye coordinates le coordinate dal punto di vista dell osservatore, indipendentemente dalle trasformazioni che avvengono. 29 30 Pipeline delle trasformazioni geometriche Viewing transformation: stabilisce il punto di osservazione della scena. E come posizionare una camera nella scena. Specificando tale trasformazione si definisce un nuovo sistema di coordinate, rispetto al quale avverranno tutte le successive trasformazioni. Modeling transformations: sono usate per manipolare il modello e gli oggetti all interno di esso. Queste trasformazioni muovono, ruotano e scalano gli oggetti. Nota: dato che ogni trasformazione e calcolata rispetto all ultima trasformazione effettuata, l aspetto finale della scena puo dipendere dall ordine in cui le trasformazioni sono effettuate. Pipeline delle trasformazioni geometriche Dualita modelview: dal momento che i movimenti del punto di osservazione e degli oggetti nella scena avvengono in maniera relativa, le due trasformazioni (viewing e modeling) sono combinate in un unica matrice chiamata modelview. Projection transformation: specifica come la scena e proiettata sullo schermo. Determina il viewvolume e come sono effettuate le proiezioni. Viewport transformation: e il mapping alle coordinate schermo fisiche. 31 32

Pipeline delle trasformazioni geometriche 33 Colori I colori in OpenGL sono definiti utilizzando la funzione void glcolor4f(float red, float green, float blue,float alpha) La componente alpha specifica la traslucenza del colore. La funzione glcolor setta il colore per tutti gli oggetti che seguono. E tuttavia possibile specificare diversi colori per i diversi vertici di una linea o un poligono. Il colore risultante dipendera dal modello di shading adottato. Con il smooth shading (GL_SMOOTH) il passaggio da un colore all altro avviene seguendo una retta nel cubo RGB. Con il flat shading (GL_FLAT) non viene calcolato il shading e la primitiva viene disegnata utilizzando il colore specificato per l ultimo vertice (eccettogl_polygon). 34 Colori - Esempio void RenderScene() glclear(gl_color_buffer_bit); glshademodel(gl_smooth); glbegin(gl_triangles); glcolor3f(1,0,0); glvertex3f(0.0f,1.0f,0.0f); glcolor3f(0,1,0); glvertex3f(1.0f,-1.0f,0.0f); glcolor3f(0,0,1); glvertex3f(-1.0f,-1.0f,0.0f); glend(); glflush(); void MyInit() glclearcolor(0,0,0,1); 35 Colori - Esempio int main(int argc, char* argv[]) glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB ); glutcreatewindow("esempio OpenGL - Colori"); glutdisplayfunc(renderscene); MyInit(); glutmainloop(); return 0; 36

Illuminazione della scena E possibile approssimare le condizioni di illuminazione del mondo reale, utilizzando 3 modelli di illuminazione: ambient, diffuse e specular. Un effetto realistico e ottenuto unendo opprotunamente queste tre componenti. La ambient light non e caratterizzata da una particolare direzione. Gli oggetti risultano illuminati su tutte le superfici e in tutte le direzioni. La diffuse light ha una componente direzionale ed e riflessa dalle superfici in maniera proporzionale alll angolo con cui la superficie incide la superficie. La specular light ha una componente direzionale e viene riflessa dalle superfici in un unica direzione. 37 Texture mapping E possibile mappare immagini bidimensionali alle primitive definite in OpenGL (e quindi anche agli oggetti tridimensionali) in maniera tale da aumentare ulteriormente il realismo. Questo procedimento e noto come texture mapping. Dopo aver applicato una texture ad una primitiva, OpenGL si occupa di effettuare le modifiche necessarie ad un corretto rendering (ad esempio dopo aver effettuato una trasformazione). Una texture puo essere incollata ad una superficie o usata per modulare il colore presente nella superficie. 38 Texture mapping Per applicare una texture ad una superficie sono necessari i seguenti passi: - Creare una texture (ad esempio a partire da un immagine) e una primitiva. - Indicare come la texture deve essere applicata a ciascun pixel (ad esempio con GL_DECAL la texture e incollata sulla superficie) - Abilitare il texture mapping glenable(gl_texture_2d). - Disegnare la scena, indicando la texture e le coordinate geometriche. Texture mapping E necessario specificare le coordinate della texture per ogni vertice della primitiva su cui vogliamo mappare la texture. 39 40

Texture - esempio int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB GLUT_DEPTH); glutinitwindowsize(250, 250); glutinitwindowposition(100, 100); glutcreatewindow("texture mapping"); MyInit(); glutdisplayfunc(renderscene); glutmainloop(); return 0; 41 Texture - esempio void MyInit() glclearcolor (0.0, 0.0, 0.0, 0.0); glshademodel(gl_flat); glenable(gl_depth_test); glgentextures(1, &texname); glbindtexture(gl_texture_2d, texname); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_REPEAT); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_NEAREST); CMyImage c("eye.pgm"); GLubyte* data = new GLubyte[c.GetCol()*c.GetRow()*3]; for (int i=0, j=0; i< c.getcol()*c.getrow(); i++,j=j+3) data[j]=c.getdata()[i]; data[j+1]=c.getdata()[i]; data[j+2]=c.getdata()[i]; glteximage2d(gl_texture_2d, 0, GL_RGBA, c.getcol(), c.getrow(), 0, GL_RGB, GL_UNSIGNED_BYTE, data); delete [] data; 42 Texture - esempio void RenderScene() glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glenable(gl_texture_2d); gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_DECAL); Texture - esempio glbegin(gl_quads); gltexcoord2f(1.0, 1.0); glvertex3f(-2.0, -1.0, 0.0); gltexcoord2f(1.0, 0.0); glvertex3f(-2.0, 1.0, 0.0); gltexcoord2f(0.0, 0.0); glvertex3f(0.0, 1.0, 0.0); gltexcoord2f(0.0, 1.0); glvertex3f(0.0, -1.0, 0.0); gltexcoord2f(1.0, 1.0); glvertex3f(0.5, -1.0, 0.0); gltexcoord2f(1.0, 0.0); glvertex3f(0.5, 1.0, 0.0); gltexcoord2f(0.0, 0.0); glvertex3f(2, 0.5, 0); gltexcoord2f(0.0, 1.0); glvertex3f(2, -0.5, 0); glend(); glflush(); gldisable(gl_texture_2d); 43 44

Imaging OpenGL supporta la lettura/scrittura da e sul color buffer. Pertanto e possibile leggere dal buffer mediante la funzione: glreadpixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) e, ad esempio, salvarne il contenuto su file o leggere i pixel di un immagine da un file e ridirigerli sul color buffer, mediante la funzione : gldrawpixels(glsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) 45 Imaging- Esempio int main(int argc, char* argv[]) glutinit(&argc, argv); glutinitdisplaymode(glut_double GLUT_RGB ); glutinitwindowsize(200,200); glutcreatewindow("esempio OpenGL - Imaging"); glutdisplayfunc(renderscene); MyInit(); glutmainloop(); return 0; 46 Imaging - Esempio void MyInit() glclearcolor(0,0,0,1); //lettura da file dell immagine void RenderScene() GLint iviewport[4]; glclear(gl_color_buffer_bit); glrasterpos2i(-1,1); glgetintegerv(gl_viewport, iviewport); glpixelzoom((glfloat) iviewport[2] / width, Per riscalare l immagine alle dimensioni della finestra, e invertire l ordine sull asse y -(GLfloat)iViewport[3] / (GLfloat)height); gldrawpixels(height, width,gl_luminance, GL_UNSIGNED_BYTE, pimage); glutswapbuffers(); 47